我正在使用Apple的SceneKit进行基本的赛车游戏,并且遇到模拟汽车的问题。使用SCNPhysicsVehicle行为,我能够正确设置汽车并使用记录的方法驱动它。
然而,我无法获得该车的位置。似乎合乎逻辑的是,当汽车移动时,SCNPhysicsVehicle会移动包含底盘和车轮的SCNNode,但SCNNodes仍保持其原始位置和方向。奇怪的是,底盘' SCNPhysicsBody的速度在整个模拟过程中保持准确,因此我可以假设汽车的位置是基于SCNPhysicsBody而不是SCNNode。不幸的是,我没有找到任何记录方法来获得SCNPhysicsBody的职位。
获得一个汽车的位置应该是微不足道的,并且对于创建一个赛车游戏是必不可少的,但我似乎无法找到任何获得它的方法。任何想法或建议将不胜感激。
答案 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所做的任何动画同步