私はSceneKitを初めて使用するので、私がやろうとしていることは正しいアプローチでさえない可能性があります. だからここに私の一般的な意図があります:
プレイヤーが移動する「トンネル」を構築しています。これは手続き的に生成されるトンネルです。トンネルのメッシュを表すポイントの位置を決定し、ポイントを三角形で接続してスキンを作成しています。次の方法を使用して、三角形を生成しています。
func addTriangleFromPositions(scene: SCNScene, point1: SCNVector3, point2: SCNVector3, point3: SCNVector3)
{
let vector12 = GLKVector3Make(point1.x - point2.x, point1.y - point2.y, point1.z - point2.z)
let vector32 = GLKVector3Make(point3.x - point2.x, point3.y - point2.y, point3.z - point2.z)
let normalVector = SCNVector3FromGLKVector3(GLKVector3CrossProduct(vector12, vector32))
let positions: [SCNVector3] = [point1, point2, point3]
let normals: [SCNVector3] = [normalVector, normalVector, normalVector]
let indices: [Int32] = [0, 2, 1]
let vertexSource = SCNGeometrySource(vertices: positions, count: positions.count)
let normalSource = SCNGeometrySource(normals: normals, count: normals.count)
let indexData = NSData(bytes: indices, length: sizeof(Int32) * indices.count)
let element = SCNGeometryElement(data: indexData, primitiveType: .Triangles, primitiveCount: indices.count, bytesPerIndex: sizeof(Int32))
let geometry = SCNGeometry(sources: [vertexSource, normalSource], elements: [element])
let material = SCNMaterial()
material.diffuse.contents = UIColor(red: 41.0 / 256.0, green: 16.0 / 256.0, blue: 0, alpha: 1 )
geometry.materials = [material]
let node = SCNNode(geometry: geometry)
scene.rootNode.addChildNode( node )
}
これは正常に機能し、私のトンネルはトンネルのように見えます。ただし、ノードに PhysicsBody を追加して静的なボディにしようとすると (トンネルに衝突できるはずですが、トンネルの壁は動かない)、アプリケーションが EXC_BAD_ADDRESS でクラッシュし始めます。最初のいくつかの三角形を追加した後に実際にクラッシュするので、この方法でいくつかの三角形を追加するときに発生する問題があると思われます。
これをテストするために、テスト プロジェクトを作成し、三角形を 1 つだけ追加して、その PhysicsBody を静的なボディに設定しました。クラッシュはしませんが、物理体は三角形の形ではなく、原点にある 1 点のように見えます。
それで、いくつかの質問:
- 一般的に、これはカスタム ジオメトリを生成するのに悪い方法ですか? やや不規則な形状が本当に必要で、それに PhysicsBody を持たせたい場合、三角形を作成してポイントを接続する以外の方法はありますか?
- 三角形の物理ボディの作成が機能しない理由について何か考えはありますか?
ありがとう。