Scenekitで一人称宇宙飛行士を実装しようとしています。物理シミュレーションを実際の位置に合わせて変換する問題を抱えています物理シミュレーションが表すはずのSCNNodeを表します。SceneKit物理シミュレーションが実際のノード位置と一致しません
敵の無人機船はこの機能を使用して作成されます。このノードは、船舶(敵、星など)の外部のすべてのゲームオブジェクトとその魚雷(どちらもシーンの中に住んでいます)を含むSectorObjectNodeというSCNノードにノードを置きます。ルートノード:
func turnShip() {
self.rotate(self.sectorObjectsNode, around: SCNVector3Make(1, 0, 0), by: CGFloat(self.yThrust))
self.rotate(self.sectorObjectsNode, around: SCNVector3Make(0, 1, 0), by: CGFloat(self.xThrust))
}
func rotate(_ node: SCNNode, around axis: SCNVector3, by angle: CGFloat) {
let rotation = SCNMatrix4MakeRotation(Float(angle), axis.x, axis.y, axis.z)
let newTransform = SCNMatrix4Mult(node.worldTransform, rotation)
// Set the new transform
if let parent = node.parent {
node.transform = parent.convertTransform(newTransform, from: nil)
} else {
node.transform = newTransform
}
}
しかし、このコードは、物理学を引き起こす:
func spawnDrone(_ sender: UIButton) {
let humonshipScene = SCNScene(named: "Humon.scn")
let humonShip = humonshipScene?.rootNode.childNodes[0]
self.enemyDrone = humonShip
let droneShape = SCNBox(width: 10, height: 5, length: 5, chamferRadius: 0)
let dronePhysicsShape = SCNPhysicsShape(geometry: droneShape, options: nil)
self.enemyDrone?.physicsBody = SCNPhysicsBody(type: .dynamic, shape: dronePhysicsShape)
self.enemyDrone?.physicsBody?.isAffectedByGravity = false
self.enemyDrone?.physicsBody?.friction = 0
self.enemyDrone?.physicsBody?.categoryBitMask = 0b00000010
self.enemyDrone?.physicsBody?.contactTestBitMask = 0b00000010
self.enemyDrone?.name = "drone"
self.enemyDrone?.pivot = SCNMatrix4MakeTranslation(0.5, 0.5, 0.5)
self.enemyDrone?.position = SCNVector3Make(0, 0, -30)
self.enemyDrone?.scale = SCNVector3Make(1, 1, 1)
let actualPosition = self.scene.rootNode.convertPosition((self.enemyDrone?.position)!, from: self.enemyDrone)
self.enemyDrone?.position = self.scene.rootNode.convertPosition(actualPosition, to: self.sectorObjectsNode)
self.sectorObjectsNode.addChildNode(self.enemyDrone!)
}
sectorObjectsNodeは、このコードを使用して(それによって、動きをシミュレートするために、船舶の周り「ユニバース」の回転)画面上のジョイスティックに反応して回転させますシミュレーションt
:O次の結果を得、(sceneView.debugOptionsが.showPhysicsShapesに設定されているエンジンによって示されるように、画面の中央の灰色のボックスは、無人機のためのバウンディングボックス物理ある)リセット私は回転前に無人機のプレゼンテーション位置をキャプチャしようとしましたが、2つの回転機能の後にそれを適用しようとしましたが、これにより船が左下に移動します。私は、敵の敵ノードの実際の位置に固執する無人機の物理シミュレーションをどのように取得するかについて邪魔されています(私はかなり独占的に衝突検出に使用しています)。