获取SCNPhysicsVehicle的位置

11
我正在使用苹果的SceneKit开发一个基本的赛车游戏,但是在模拟汽车时遇到了问题。使用SCNPhysicsVehicle行为,我能够正确地设置汽车并使用文档中的方法驾驶它。
然而,我无法获取汽车的位置。虽然似乎逻辑上SCNPhysicsVehicle应该随着汽车移动而移动包含底盘和轮子的SCNNodes,但是这些SCNNodes仍停留在它们原来的位置和方向上。奇怪的是,底盘的SCNPhysicsBody的速度在整个模拟过程中保持准确,因此我可以假设汽车的位置是基于SCNPhysicsBody而不是SCNNode。不幸的是,我没有找到任何已记录的方法来获取SCNPhysicsBody的位置。
获取汽车的位置应该很简单,对于创建赛车游戏至关重要,但我似乎找不到任何获取方法。任何想法或建议都将不胜感激。
2个回答

25
Scene Kit会根据物理模拟自动更新拥有SCNPhysicsBody的节点的位置,因此SCNNode.position是要查找的正确属性。
问题在于实际上有两个版本的节点在运行。您通常访问的称为“模型”节点。它反映您设置的属性的目标值,即使您通过动画设置这些属性。presentationNode反映了当前正在呈现的节点的状态 - 如果动画正在进行中,则节点的属性具有中间值,而不是动画的目标值。

操作, 物理, 约束条件, 以及你在更新/渲染循环方法中进行的任何场景图更改都直接针对场景图的“演示”版本。因此,要读取已由物理模拟设置的节点属性,请获取您感兴趣的节点(拥有车辆chassisBody物理体的节点)的presentationNode,然后读取演示节点的position(或其他属性)。


2
获取 presentationNode 的方法是:node.presentationNode。 - Toyos
这正是我所缺少的。谢谢! :) - Pamelloes
1
如何更改节点的位置?我尝试更新node.position属性和node.presentationNode.position属性,但没有成功...我错过了什么吗? - Mihai Fratu
1
具有动态物理体的节点的变换(包括位置)由物理模拟管理。最好通过物理学找到一种方法来完成您需要的任何操作,例如施加冲量。(这就是苹果公司的车辆示例代码在汽车翻转时进行校正的方式。)如果必须直接设置位置/旋转等,请调用“resetTransform”以使物理与其同步。 - rickster

1

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

node.position = node.presentationNode.position

将此代码放入 renderer(_: updateAtTime) 中,您的节点位置将与您对 physicsBody 进行的任何动画同步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接