2017-10-26 8 views
2

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

Physics bounding Box not following object

:O次の結果を得、(sceneView.debugOptionsが.showPhysicsShapesに設定されているエンジンによって示されるように、画面の中央の灰色のボックスは、無人機のためのバウンディングボックス物理ある)リセット私は回転前に無人機のプレゼンテーション位置をキャプチャしようとしましたが、2つの回転機能の後にそれを適用しようとしましたが、これにより船が左下に移動します。私は、敵の敵ノードの実際の位置に固執する無人機の物理シミュレーションをどのように取得するかについて邪魔されています(私はかなり独占的に衝突検出に使用しています)。

答えて

1

いつも通り、問題はRTFMでした。私は間違ったタイプであることを物理ボディを設定します。

self.enemyDrone?.physicsBody = SCNPhysicsBody(type: .kinematic, shape: dronePhysicsShape) 
に変更する必要が
self.enemyDrone?.physicsBody = SCNPhysicsBody(type: .dynamic, shape: dronePhysicsShape) 

関連する問題