【问题标题】:Getting an SCNPhysicsVehicle's Position获取 SCNPhysicsVehicle 的位置
【发布时间】:2020-03-29 03:10:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: scenekit


    【解决方案1】:

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

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

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

    【讨论】:

    • 并获取presentationNode:node.presentationNode
    • 这正是我所缺少的。谢谢! :)
    • 改变一个节点的位置怎么样?我尝试更新 node.position 属性和 node.presentationNode.position 属性,但没有运气......我错过了什么?
    • 具有动态物理体的节点的变换(包括位置)由物理模拟管理。最好通过物理学找到一种方法来做任何你需要做的事情——例如。施加冲动。 (这是 Apple 的车辆示例代码在汽车翻车时对它进行的正确操作。)如果您必须直接设置位置/旋转/等,请致电 resetTransform 以使其物理恢复同步。
    【解决方案2】:

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

    node.position = node.presentationNode.position
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多