gpt4 book ai didi

ios - 使用多几何形状未正确检测到碰撞

转载 作者:可可西里 更新时间:2023-11-01 01:29:06 25 4
gpt4 key购买 nike

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

enter image description here

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

// 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

SCNPhysicsShape 对象应该包含我在 Blender 文件中创建的所有形状。但是当我测试程序时,宇宙飞船就像一个空体,没有检测到碰撞。

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

最佳答案

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

不需要:

body.collisionBitMask = 0  

接触位掩码仅用于接触。

下面的代码应该可以满足您的需求。这是 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

任何你想联系你的宇宙飞船的东西都应该有:

otherObject.physicsBody.contactTestBitMask = 1 << 1

这只会将“otherObject”的联系人注册到“宇宙飞船”,而不是“宇宙飞船”到“otherObject”。因此,请确保以这种方式处理您的物理世界联系人代表,反之亦然。两个对象都不需要互相寻找。那样效率会低一些。

下面的委托(delegate)示例:

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)

}

关于ios - 使用多几何形状未正确检测到碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com