从 Scenekit 中的世界变换中提取旋转
Posted
技术标签:
【中文标题】从 Scenekit 中的世界变换中提取旋转【英文标题】:Extracting rotation from world transform in Scenekit 【发布时间】:2021-10-22 16:51:11 【问题描述】:我想在我的应用程序中放置一个指示器,以显示对象面向的方向。我想获得世界空间中的旋转来做到这一点,但不知道如何从 worldTransform 中提取它。有人可以告诉我如何做到这一点,还是有更好的方法?我只需要从原始位置在 Y 轴上以弧度旋转。谢谢。
【问题讨论】:
【参考方案1】:SCNNode 有很多方向选项,worldTransform 是该结构的一部分。还可以获取节点orientation/eulerAngles等。
https://developer.apple.com/documentation/scenekit/scnnode/1408048-orientation
GLKit 函数可以将度数转换为弧度,例如:
SCNAction.rotateBy(x: CGFloat(Float(GLKMathDegreesToRadians(-90))), y: 0, z: 0, duration: 0)
世界变换:CATransForm3D: init(m11: CGFloat, m12: CGFloat, m13: CGFloat, m14: CGFloat, m21: CGFloat, m22: CGFloat, m23: CGFloat, m24: CGFloat, m31: CGFloat, m32: CGFloat, m33: CGFloat, m34: CGFloat, m41: CGFloat, m42: CGFloat, m43: CGFloat, m44: CGFloat)
这些是旋转
编辑 - 您是否需要 transform/worldTransform、矩阵...如 m11 等的定义?
var nRight: SCNVector3 = SCNVector3Make(0, 0, 0)
var nUp: SCNVector3 = SCNVector3Make(0, 0, 0)
var nScale: SCNVector3 = SCNVector3Make(1, 1, 1)
var nTarget: SCNVector3 = SCNVector3Make(0, 0, 0)
vNode.transform.m11 = nRight.x
vNode.transform.m12 = nRight.y
vNode.transform.m13 = nRight.z
vNode.transform.m21 = nUp.x
vNode.transform.m22 = nUp.y
vNode.transform.m23 = nUp.z
vNode.transform.m31 = nTarget.x
vNode.transform.m32 = nTarget.y
vNode.transform.m33 = nTarget.z
最佳猜测 = GLKMathDegreesToRadians(node.eulerAngule.y) 是您真正想要的。
如果它必须来自 worldTransform,我“认为”就是这个,但我不是数学专家:
nUp.x = vNode.worldTransform.m21;
nUp.y = vNode.worldTransform.m22;
nUp.z = vNode.worldTransform.m23;
GLKMathDegreesToRadians(nUp);
【讨论】:
我不是在问如何执行旋转,我是在问如何获取 SCNNode 的世界旋转值。给定 SCNNode 的 worldTransform 属性如何获得旋转矢量?我相信 SCNNode 上的旋转属性是在本地空间中。 如果我理解正确,您只想旋转 Y 轴,指向您的另一个节点的方向? 感谢您的回复。我已经执行了旋转,我正在尝试确定是否有一种方法可以查询世界空间中的当前旋转角度,而无需自己跟踪它。 @Cliff - 请查看编辑,这些是您的旋转角度,谢谢 谢谢@voltan,我不清楚你在告诉我什么。如果我让 transform = node.worldTransform 并且我希望 Y 轴旋转的形式为 let radians = ... 我会放什么?以上是关于从 Scenekit 中的世界变换中提取旋转的主要内容,如果未能解决你的问题,请参考以下文章
从 SceneKit 中的 SCNGeometry 中提取人脸信息
将 Collada dae 文件加载到 SceneKit 以进行联合操作