首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SceneKit物理模拟与实际节点位置不匹配

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

Stack Overflow用户
提问于 2017-10-26 01:34:10
回答 1查看 490关注 0票数 3

我正试图在Scenekit中实现一个第一人称空间射击器,我有一个(熟悉的,我知道的)问题,就是让物理模拟与物理模拟所代表的SCNNodes的实际位置和转换相匹配。

敌方无人驾驶舰是使用此函数创建的,该函数将节点放置在一个名为SCNnode的SectorObjectNode中,它包含船舶外部的所有游戏对象(敌人、恒星等)及其鱼雷(这两个目标都位于场景的根节点:

代码语言:javascript
复制
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是为了响应onScreen操纵杆而旋转的(从而使“宇宙”围绕船旋转以模拟运动),使用以下代码:

代码语言:javascript
复制
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节点的实际位置,我感到很困难。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-26 20:48:01

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

代码语言:javascript
复制
self.enemyDrone?.physicsBody = SCNPhysicsBody(type: .dynamic, shape: dronePhysicsShape)

需要更改为

代码语言:javascript
复制
self.enemyDrone?.physicsBody = SCNPhysicsBody(type: .kinematic, shape: dronePhysicsShape)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46944502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档