複雑なジオメトリを持つ宇宙船オブジェクトがあり、SceneKitの物理が複雑なボディでは機能しないため、回避策を採用しました。シリンダーのような基本的な形状を使用していますキューブは宇宙船の体全体をシミュレートします。私は、これらのオブジェクトを削除シーンをロードするときにマルチジオメトリシェイプで衝突が正しく検出されない
、しかしとして使用することをSCNPhysicsShapeを構築するために彼らのジオメトリを使用します。Blenderでは、私は、宇宙船の形状を近似するオブジェクトのセットを作成しました宇宙船の物理ボディ:
// 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:私の目標は、衝突を検出することだけです。私は物理エンジンに物理学をシミュレートさせたくありません。
私は他の誰が何をやっているしようとした疑い。 SceneKitを使う人はほとんどいません。たとえそれがゲームに使用されるようでもあります。物理学のために輸入された身体を持っている人はいないでしょう。私はあなたがここにたどり着いている2人か3人のSceneKitの従業員のために、パッケージされたサンプルプロジェクトを提供する必要があると思います。彼らはおそらくこれを助けることができる唯一の人々です。 – Confused
SceneKitの質問にたくさん答える人を見れば、あなたは彼らが誰であるかを知ることができます。そして、あなたはおそらくそれらとのチャットルームやその他の直接コミュニケーションの手段を始めることができるような膨大な数の担当者を持っています。 – Confused
@Confusedまた、ゲームに使うことをお勧めしますか? –