通过鼠标/触摸显示和旋转3-D网格?

时间:2012-04-27 07:48:01

标签: rotation quaternions

想象一下,相机瞄准的球体可以围绕它的中心自由旋转。

想象一下,用户可以通过从相机伸出来触摸此球体上的最近点并旋转它来旋转此球体。

这就是我想在iOS中实现的。

OpenGl ES on Iphone - Displaying and rotating 3D objects< - 在这个链接的问题中,我正试图找出一个合适的框架。

我已经选择了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来杀死它。