获得SCNPhysicsVehicle的职位

时间:2014-06-20 01:42:59

标签: scenekit

我正在使用Apple的SceneKit进行基本的赛车游戏,并且遇到模拟汽车的问题。使用SCNPhysicsVehicle行为,我能够正确设置汽车并使用记录的方法驱动它。

然而,我无法获得该车的位置。似乎合乎逻辑的是,当汽车移动时,SCNPhysicsVehicle会移动包含底盘和车轮的SCNNode,但SCNNodes仍保持其原始位置和方向。奇怪的是,底盘' SCNPhysicsBody的速度在整个模拟过程中保持准确,因此我可以假设汽车的位置是基于SCNPhysicsBody而不是SCNNode。不幸的是,我没有找到任何记录方法来获得SCNPhysicsBody的职位。

获得一个汽车的位置应该是微不足道的,并且对于创建一个赛车游戏是必不可少的,但我似乎无法找到任何获得它的方法。任何想法或建议将不胜感激。

2 个答案:

答案 0 :(得分:24)

Scene Kit会根据物理模拟自动更新拥有SCNPhysicsBody的节点的位置,因此SCNNode.position是要查找的正确属性。

实际上,该节点实际上有两个版本。您通常访问的那个称为“模型”节点。它反映了您设置的属性的目标值,即使您通过动画设置这些属性也是如此。 presentationNode反映当前正在渲染的节点的状态 - 如果正在进行动画,则节点的属性具有中间值,而不是动画的目标值。

Actions,物理,constraints以及您在update/render loop methods内所做的任何场景图更改都直接定位到场景图的“演示”版本。因此,要读取由物理模拟设置的节点属性,请获取您感兴趣的节点的presentationNode(拥有车辆chassisBody物理主体的节点),然后阅读演示文稿节点的position(或其他属性)。

答案 1 :(得分:1)

我的播放器节点存在同样的问题。 我用presentationNode移动它(以管理碰撞检测)。 但是当我在一些移动后检查节点位置时,节点位置没有移动(演示节点是rickster写在他的答案中的实际位置) 我设法用渲染器循环更新scnNode.position 您必须使用node.position = node.presentationNode.position 位置设置节点的位置。

renderer(_: updateAtTime)

将其设置为r.db('test').table('names').get('9c2472d9-8d0e-4f8d-8a6a-5c04076e4abd').do( function(entry) { return r.range(1, entry('name').count().add(1)).map( function(index) { return entry('entry').slice(0, index); }) } ).coerceTo('array'); ,您的节点位置将与您对physicsBody所做的任何动画同步