11

我正在使用 Apple 的SceneKit开发一个基本的赛车游戏,并且遇到了模拟汽车的问题。使用SCNPhysicsVehicle行为,我能够正确设置汽车并使用记录的方法驾驶它。

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

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

4

2 回答 2

24

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

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

您在更新/渲染循环方法中所做的动作、物理、约束和任何场景图更改都直接针对场景图的“演示”版本。因此,要读取物理模拟设置的节点属性,请获取您感兴趣的节点(拥有车辆物理主体的节点),然后读取表示节点的(或其他属性)。presentationNodechassisBodyposition

于 2014-06-20T05:41:30.530 回答
1

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

node.position = node.presentationNode.position

将其设置为renderer(_: updateAtTime),您的节点位置将与您对physicsBody 制作的任何动画同步

于 2016-04-19T20:20:07.320 回答