4

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

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

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

这有几个问题:

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

1 回答 1

2

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

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


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

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

于 2014-06-26T05:12:23.450 回答