我从外部设备获得10x /秒的加速度计数据,我希望将其反映在3-D SceneKit模型上.也就是说,我希望模型响应加速度计数据而旋转. 3-D模型是在SketchUp中构建的.dae文件,我将其加载到SceneKit场景中.
我目前正在尝试在SceneKit场景的根节点上进行旋转(此处自称为自定义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˚(应该如此).通过从当前读数中减去最后一个读数,这似乎很容易解决,但我不确定数学如何通过旋转来解决.
最佳答案 如果您已经将加速度计数据作为欧拉角(滚动,俯仰,偏航)获得,也许您应该使用其eulerAngles属性在节点上设置这些数据.
此外,如果场景通常不是一个好主意,则转换rootNode – 将该旋转应用于包含模型的任何节点.
编辑:您的问题表明您已经根据欧拉角度获得了设备方向数据.如果您没有这些,您可以考虑使用CMDeviceMotion
来获取它们.
更好的是,您可以将设备态度设置为quaternion或旋转矩阵,并将其传递给节点的orientation
或转换属性.我不确定它的参考框架是否符合您在应用程序中所需的内容,但您始终可以对其进行转换.