SceneKit 模型的恒定旋转

Posted

技术标签:

【中文标题】SceneKit 模型的恒定旋转【英文标题】:Constant Rotation of a SceneKit Model 【发布时间】:2014-08-16 16:43:43 【问题描述】:

我从外部设备以 10 倍/秒的速度获取加速度计数据,我希望将其反映在 3-D SceneKit 模型上。也就是说,我希望模型旋转以响应加速度计数据。 3-D 模型是在 SketchUp 中构建的 .dae 文件,我正在将其加载到 SceneKit 场景中。

我目前正在尝试在 SceneKit 场景的根节点上进行旋转(这里 self 指的是自定义 SCNView 类):

self.scene.rootNode.transform = CATransform3DMakeRotation(angle, x, y, z);

这有几个问题:

不是沿每个轴旋转特定的量,而是沿某个向量旋转固定的量。是否可以通过更改相对向量值来控制某个轴旋转多少度?用三个CATransform3DRotates 实现转换是否有意义,每个轴一个? 它每次都会创建一个新的旋转,而不是仅旋转与上次读数的角度差。例如,如果加速度数据是上次读数 x: 60˚, y: 40˚, y: -30˚ 而现在是 x: 65˚, y: 45˚, y: -35˚,则模型将沿 x 轴旋转整个 65˚,而不仅仅是与上次相差 5˚(应该如此)。这似乎很容易通过从当前读数中减去最后一个读数来解决,但我不确定数学如何与旋转有关。

【问题讨论】:

【参考方案1】:

如果您已经以欧拉角(滚动、俯仰、偏航)的形式获取加速度计数据,也许您应该使用其eulerAngles 属性在节点上设置这些数据。

此外,如果场景通常不是一个好主意,则转换 rootNode - 将该旋转应用于包含模型的任何节点。


编辑:您的问题表明您已经获得了欧拉角方面的设备方向数据。如果您没有这些,您可以考虑使用CMDeviceMotion 来获取它们。

更好的是,您可以将设备姿态作为quaternion 或旋转矩阵传递给节点的orientationtransform 属性。我不确定它的参考框架是否与您在应用中需要的框架相匹配,但您始终可以对其进行转换。

【讨论】:

感谢您的建议!加速度计数据只是介于 -1 和 1 之间的 x、y 和 z 浮点值。虽然我看到使用 eulerAngles 属性here,但 Xcode IDE 似乎无法识别它(我导入了 SceneKit)。模型被导入到场景本身,而不是特定节点,这就是我使用根节点的原因:SCNScene *scene = [SCNScene sceneWithURL:url options:nil error:&error];url 是.dae 的路径。

以上是关于SceneKit 模型的恒定旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scenekit 的 3D 模型上添加文字(评论)?

如何创建要在 SceneKit 中使用的 DAE 文件?

SceneKit做一个旋转的地球效果

在 viewDidLoad 期间应用的 SceneKit 节点旋转无效

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

如何使用 Xcode 10 在 SceneKit 编辑器中旋转对象