场景套件。如何绕轴旋转 SCNNode
SceneKit. How to rotate SCNNode around its axis
我正在尝试实现与场景编辑器中相同的旋转,但使用代码使对象始终围绕选定的轴旋转,但是如果我在编辑器中查看角度 (x,y,z),它们会随机变化
![局部节点轴][1]
我试过使用四元数,但无法正常工作
PS。我的错误是使用旋转 属性 而不是 SCNVector4 的方向,已正确阅读文档)
通过设置旋转属性,改变对象的绝对旋转,而不是相对旋转
这是一些伪代码
- 计算四元数表示相对旋转。我会使用
GLKQuaternionMakeWithAngleAndAxis
函数来做到这一点。
- 将旋转应用到方向 属性:
let initial_object_orientation = rotateNode.orientation;
new_orientation = GLKQuaternionMultiply(rotation_quaternion, initial_object_orientation)
- 分配新方向
rotatNode.orientation = new_orientation
希望对你有帮助。
看来你真的很接近,你不得不在 GLKQuaternionMultiply
调用中交换参数。我在 中使用解决方案仅通过 Z
轴实现旋转:
let orientation = modelNode.orientation
var glQuaternion = GLKQuaternionMake(orientation.x, orientation.y, orientation.z, orientation.w)
// Rotate around Z axis
let multiplier = GLKQuaternionMakeWithAngleAndAxis(0.5, 0, 0, 1)
glQuaternion = GLKQuaternionMultiply(glQuaternion, multiplier)
modelNode.orientation = SCNQuaternion(x: glQuaternion.x, y: glQuaternion.y, z: glQuaternion.z, w: glQuaternion.w)
围绕Y
旋转:
// Rotate around Y axis
let multiplier = GLKQuaternionMakeWithAngleAndAxis(0.5, 0, 1, 0)
glQuaternion = GLKQuaternionMultiply(glQuaternion, multiplier)
我正在尝试实现与场景编辑器中相同的旋转,但使用代码使对象始终围绕选定的轴旋转,但是如果我在编辑器中查看角度 (x,y,z),它们会随机变化
![局部节点轴][1]
我试过使用四元数,但无法正常工作
PS。我的错误是使用旋转 属性 而不是 SCNVector4 的方向,已正确阅读文档)
通过设置旋转属性,改变对象的绝对旋转,而不是相对旋转
这是一些伪代码
- 计算四元数表示相对旋转。我会使用
GLKQuaternionMakeWithAngleAndAxis
函数来做到这一点。 - 将旋转应用到方向 属性:
let initial_object_orientation = rotateNode.orientation; new_orientation = GLKQuaternionMultiply(rotation_quaternion, initial_object_orientation)
- 分配新方向
rotatNode.orientation = new_orientation
希望对你有帮助。
看来你真的很接近,你不得不在 GLKQuaternionMultiply
调用中交换参数。我在 Z
轴实现旋转:
let orientation = modelNode.orientation
var glQuaternion = GLKQuaternionMake(orientation.x, orientation.y, orientation.z, orientation.w)
// Rotate around Z axis
let multiplier = GLKQuaternionMakeWithAngleAndAxis(0.5, 0, 0, 1)
glQuaternion = GLKQuaternionMultiply(glQuaternion, multiplier)
modelNode.orientation = SCNQuaternion(x: glQuaternion.x, y: glQuaternion.y, z: glQuaternion.z, w: glQuaternion.w)
围绕Y
旋转:
// Rotate around Y axis
let multiplier = GLKQuaternionMakeWithAngleAndAxis(0.5, 0, 1, 0)
glQuaternion = GLKQuaternionMultiply(glQuaternion, multiplier)