SceneKit:如何将节点的移动限制在本地的一个轴上,而不是整个世界

Posted

技术标签:

【中文标题】SceneKit:如何将节点的移动限制在本地的一个轴上,而不是整个世界【英文标题】:SceneKit: How to constrain movement of a node to one axis locally, not the entire world 【发布时间】:2021-08-06 08:11:28 【问题描述】:

在世界空间中使用 SCNTransformConstraint.positionConstraint 可以很容易地防止节点在一个轴(X、Y 或 Z)上的移动被其他力移动,如下所示:

let zPosition = node.position.z

let strafingConstraint = SCNTransformConstraint.positionConstraint(inWorldSpace: true, with: (_ node: SCNNode, _ position: SCNVector3) -> SCNVector3 in
         localPosition = position
         localPosition.z = zPosition
         return localPosition
)

node.constraints = [strafingConstraint];

但是,这将其限制在世界空间中。如果我只想让节点不再在其局部 Z 轴上移动,而不管其方向如何,所以它只能在其局部 X 和 Y 轴上移动,我该怎么办?有没有办法使用 .convertPosition(:from:) 或 .convertPosition(:to:) 函数来做到这一点?有没有更好的办法?

【问题讨论】:

【参考方案1】:

这可能是一种不使用 SCNConstraint 将节点固定到特定轴的替代方法。

使用updateAtTime委托函数来调整你的节点在每一帧中的z位置:

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) 
    node.position.z = 0.0 // or wherever you want to have it

(如果您的节点附有物理实体,您应该只在实体类型为 = .kinematc 时更改它的位置)

【讨论】:

首先,非常感谢您的回复,非常感谢!其次,我认为我的问题不够清楚。澄清一下:身体是运动的,是由用户输入控制来移动的。身体没有直接面对特定的轴(X、Y 或 Z),我想限制它的前后移动(例如沿其局部 Z 方向,以便它只能沿其局部 X 和 Y 进行局部平移坐标)相对于节点本身(它可能面向与轴倾斜的方向)。 TL\DR:如何限制节点在本地空间的移动?

以上是关于SceneKit:如何将节点的移动限制在本地的一个轴上,而不是整个世界的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scenekit,如何获得身份四元数?

如何在 SceneKit 中移动旋转的 SCNNode?

SceneKit - 如何在另一个节点内反弹一个节点(鱼缸里的鱼)

在 Scenekit 中移动相机

带有子节点的 SceneKit Collada 动画

Spritekit:如何将玩家移动限制在某些瓷砖上