场景工具包模型的常数旋转

4
我从外部设备获取加速度计数据,每秒10次,并希望将其反映在3D SceneKit模型上。也就是说,我希望模型根据加速度计数据旋转。这个3D模型是在SketchUp中构建的.dae文件,我正在将其加载到SceneKit场景中。
我目前正试图在SceneKit场景的根节点上进行旋转(这里的self指自定义的SCNView类):
self.scene.rootNode.transform = CATransform3DMakeRotation(angle, x, y, z);
这里有几个问题:
- 它不是沿每个轴旋转特定量,而是沿某个向量固定旋转一定量。是否可以通过更改相对向量值来操纵某个轴旋转多少度?是否应该使用三个CATransform3DRotate,一个用于每个轴来实现变换? - 它每次都会创建一个新的旋转,而不仅仅是旋转与上次读数之间的角度差。例如,如果加速度计数据上次为x: 60˚,y: 40˚,z: -30˚,现在为x: 65˚,y: 45˚,z: -35˚,则模型将沿x轴旋转完整的65˚,而不仅仅是与上次相比的5˚差异(应该如此)。通过从当前读数中减去上次读数来解决这个问题似乎很容易,但我不确定旋转的数学计算如何工作。
1个回答

2
如果您已经获得了欧拉角(横滚角、俯仰角和偏航角)的加速度计数据,或许您应该将这些值设置在节点的eulerAngles属性上。此外,在场景中转换rootNode通常不是一个好主意,您应该将其应用于包含模型的节点。
编辑:您的问题表明您已经以欧拉角的形式获得了设备方向数据。如果没有,请考虑使用CMDeviceMotion来获取它们。
更好的方法是,您可以将设备姿态作为四元数或旋转矩阵获取,并将其传递给节点的orientationtransform属性。我不确定它的参考框架是否与您的应用程序所需的匹配,但您可以进行转换。

感谢您的建议!加速度计数据只是介于-1和1之间的x、y和z浮点值。虽然我在这里看到了eulerAngles属性的使用(https://developer.apple.com/library/prerelease/mac/samplecode/SceneKitWWDC2014/Listings/Scene_Kit_Session_WWDC_2014_Sources_Slides_AAPLSlideShadows_m.html),但它似乎并未被Xcode IDE(我已经导入了SceneKit)识别。该模型被导入到场景本身,而不是一个特定的节点,这就是为什么我使用根节点的原因:SCNScene *scene = [SCNScene sceneWithURL:url options:nil error:&error];,其中 url 是.dae文件的路径。 - Benjamin Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接