Ios 使用多几何图形未正确检测到碰撞

Ios 使用多几何图形未正确检测到碰撞,ios,swift,game-physics,blender,scenekit,Ios,Swift,Game Physics,Blender,Scenekit,我有一个具有复杂几何结构的宇宙飞船物体,由于SceneKit的物理学不适用于复杂的物体,我采用了一种解决方法:我使用一些基本形状,如圆柱体和立方体,以模拟整个宇宙飞船的体。在Blender中,我创建了一组近似宇宙飞船形状的对象: 然后,当我加载场景时,我移除这些对象,但使用它们的几何体构建一个SCNPphysisShape,用作宇宙飞船的物理体: // First I retrieve all of these bodies, which I named "Body1" up to 9: l

我有一个具有复杂几何结构的宇宙飞船物体,由于SceneKit的物理学不适用于复杂的物体,我采用了一种解决方法:我使用一些基本形状,如圆柱体和立方体,以模拟整个宇宙飞船的体。在Blender中,我创建了一组近似宇宙飞船形状的对象:

然后,当我加载场景时,我移除这些对象,但使用它们的几何体构建一个SCNPphysisShape,用作宇宙飞船的物理体:

// First I retrieve all of these bodies, which I named "Body1" up to 9: 
let bodies = _scene.rootNode.childNodes(passingTest: { (node:SCNNode, stop:UnsafeMutablePointer<ObjCBool>) -> Bool in
    if let name = node.name
    {
        return name.contains("Body")
    }
    return false
})

// Then I create an array of SCNPhysicsShape objects, and an array
// containing the transformation associated to each shape
var shapes = [SCNPhysicsShape]()
var transforms = [NSValue]()
for body in bodies
{
    shapes.append(SCNPhysicsShape(geometry: body.geometry!, options: nil))
    transforms.append(NSValue(scnMatrix4:body.transform))
    // I remove it from the scene because it shouldn't be visible, as it has 
    // the sole goal is simulating the spaceship's physics
    body.removeFromParentNode()  
}

// Finally I create a SCNPhysicsShape that contains all of the shapes
let shape = SCNPhysicsShape(shapes: shapes, transforms: transforms)
let body = SCNPhysicsBody(type: .dynamic, shape: shape)
body.isAffectedByGravity = false
body.categoryBitMask = SpaceshipCategory
body.collisionBitMask = 0
body.contactTestBitMask = RockCategory
self.spaceship.physicsBody = body
//首先检索所有这些实体,我将其命名为“Body1”,最多9个:
让bodies=\u scene.rootNode.childNodes(passingTest:{(node:SCNNode,stop:UnsafeMutablePointer)->Bool-in
如果let name=node.name
{
返回名称。包含(“正文”)
}
返回错误
})
//然后我创建了一个SCNPhysicsShape对象数组和一个数组
//包含与每个形状关联的变换
变量形状=[SCNPhysicsShape]()
变量转换=[NSValue]()
身体中的身体
{
shapes.append(scnpphysisshape(几何体:body.geometry!,选项:nil))
附加(NSValue(scnMatrix4:body.transform))
//我将它从场景中移除,因为它不应该是可见的
//唯一的目标是模拟宇宙飞船的物理特性
body.removeFromParentNode()
}
//最后,我创建了一个包含所有形状的SCNPhysicsShape
让形状=SCNPhysicsShape(形状:形状,变换:变换)
let body=SCNPhysicsBody(类型:。动态,形状:形状)
body.isAffectedByGravity=false
body.categoryBitMask=太空船类别
body.collisionBitMask=0
body.contactTestBitMask=RockCategory
self.spaceship.physicsBody=身体
SCNPphysisShape对象应该包含我在Blender文件中创建的所有形状。但是当我测试这个程序时,飞船的行为就像一个空的物体,碰撞没有被检测到


PS:我的目标只是检测碰撞。我不希望物理引擎模拟物理。

您希望为您的飞船使用凹面形状。下面的例子。为了使用凹面,你的身体必须是静态的或动态的。运动学是动画对象的理想选择

不需要:

body.collisionBitMask = 0  
otherObject.physicsBody.contactTestBitMask = 1 << 1
接触位掩码是您仅需要接触的全部

下面的代码应该适用于您正在寻找的内容。这是swift 3代码供参考。

let body = SCNPhysicsBodyType.kinematic
let shape = SCNPhysicsShape(node: spaceship, options: [SCNPhysicsShape.Option.type: SCNPhysicsShape.ShapeType.concavePolyhedron])
spaceship.physicsBody = SCNPhysicsBody(type: body, shape: shape)  
如果没有看到你的口罩,我无法判断你是否正确处理了这些。您应该有如下内容:

spaceship.physicsBody.categoryBitMask = 1 << 1

我怀疑有人试过你在做什么。很少有人使用SceneKit。似乎很少有人把它用于游戏。不太可能有其他人为物理引进了尸体。我认为您需要为在这里闲逛的两三名SceneKit员工提供一个样本、打包项目。他们可能是唯一能帮上忙的人。我想,如果你看看那些回答很多SceneKit问题的人,你就会知道他们是谁。你有这么多的代表,你可能可以和他们建立聊天室,或者其他直接交流的方式。@困惑,你建议在游戏中使用什么?可悲的是,你可能做了一些简单的错误,但是,世界上可能只有3个人能够识别它,而且没有任何文件可以指导你完成这类事情。真遗憾。我希望他们至少能雇个人来记录他们的引擎。
func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {

    var tempOtherObject: SCNNode!
    var tempSpaceship: SCNNode!

    // This will assign the tempOtherObject and tempSpaceship to the proper contact nodes
    if contact.nodeA.node == otherObject {
        tempOtherObject = contact.nodeA
        tempSpaceship = contact.nodeB
    }else{
        tempOtherObject = contact.nodeB
        tempSpaceship = contact.nodeA
    }

    print("tempOtherObject = ", tempOtherObject)
    print("tempSpaceship = ", tempSpaceship)

}