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