Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SceneKit物理模拟与实际节点位置不匹配_Ios_Swift_Scenekit - Fatal编程技术网

Ios SceneKit物理模拟与实际节点位置不匹配

Ios SceneKit物理模拟与实际节点位置不匹配,ios,swift,scenekit,Ios,Swift,Scenekit,我试图在Scenekit中实现一个第一人称太空射手,我有一个(我熟悉,我知道)问题,就是让物理模拟匹配物理模拟应该表示的SCNNodes的实际位置和变换 敌方无人机战舰是使用此功能创建的,该功能将节点放置在名为SectorObjectNode的SCNnode中,该SCNnode包含战舰外部的所有游戏对象(敌人、星星等)及其鱼雷(两者都位于场景的根节点中: func spawnDrone(_ sender: UIButton) { let humonshipScene = SCNScen

我试图在Scenekit中实现一个第一人称太空射手,我有一个(我熟悉,我知道)问题,就是让物理模拟匹配物理模拟应该表示的SCNNodes的实际位置和变换

敌方无人机战舰是使用此功能创建的,该功能将节点放置在名为SectorObjectNode的SCNnode中,该SCNnode包含战舰外部的所有游戏对象(敌人、星星等)及其鱼雷(两者都位于场景的根节点中:

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根据屏幕上的操纵杆旋转(从而围绕船舶旋转“宇宙”以模拟运动),使用以下代码:

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
    }
}
但此代码会导致物理模拟重置(屏幕中央的灰色框是sceneView.debugOptions设置为.showPhysicsShapes时引擎所描绘的无人机的物理边界框),结果如下:


我曾尝试在旋转前捕捉无人机的显示位置,然后在两个旋转功能后应用它,但这会导致飞船向下和向左移动。如何获得无人机的物理模拟(我专门用于碰撞检测)一直困扰着我为了坚持enemyDrone节点的实际位置。

与往常一样,问题是RTFM。我将物理体设置为错误类型:

self.enemyDrone?.physicsBody = SCNPhysicsBody(type: .dynamic, shape: dronePhysicsShape)
需要改成

self.enemyDrone?.physicsBody = SCNPhysicsBody(type: .kinematic, shape: dronePhysicsShape)