想象一个相机瞄准一个可以围绕它的中心自由旋转的球体。
想象一下,用户可以通过从相机伸出手来触摸这个球体上最近的点并轻弹它来旋转这个球体。
这就是我试图在 iOS 中实现的。
Iphone 上的 OpenGL ES - 显示和旋转 3D 对象<--在这个链接的问题中,我试图找出一个合适的框架。
从那以后,我选择了http://nineveh.gl/(它仍处于测试阶段,但只需轻轻一点即可正常工作)并使其轮换演示工作。
每次用户的手指在触摸屏上移动时,代码都会捕获该瞬时向量,该向量将在每次更新(@ 60 Hz)时被投入到整体速度向量中:
- (void) drawView
{
static CGPoint v = { 0.0, 0.0 };
v.x += _vel.x;
v.y += _vel.y;
// resetting to 0 makes sure each touch movement only gets fed in once
_vel.x = _vel.y = 0.0;
float decay = 0.93;
v.x *= decay;
v.y *= decay;
// this is wrong...
[_mesh rotateRelativeToX: v.y
toY: v.x
toZ: 0.0 ];
[_camera drawCamera];
}
然后应将此合力施加到网格上。
我上面的内容最初似乎有效。如果我水平滑动它会完美运行。同样垂直。但只有当我开始组合旋转时,它才会不同步。假设我水平旋转 10°,然后垂直旋转 10°。现在它没有正确响应。
谁能解释这个问题?
从阅读开始,我怀疑解决方案将涉及四元数......
谁能建议我如何解决这个问题?这是我必须使用的 API 参考:http: //nineveh.gl/docs/Classes/NGLObject3D.html
我注意到有一个可能派上用场的 rotationSpace 属性,还有一个 rotateRelativeWithQuaternion 方法。
我希望也许有人熟悉这个问题并且可以看到如何使用这个 API 来解决它。