基于摄像头位置查找前向矢量

时间:2016-01-11 17:33:34

标签: ios vector quaternions

对于我正在处理的项目,我试图允许用户根据他们在屏幕上滑动的方向旋转多维数据集。我有这个工作,除了立方体旋转的方向。

例如,我的前向向量从(0,0,-1)开始。但是,一旦我将方块旋转90度,前向矢量就会改变。这是我期望发生的事情,但却对我正在做的事情提出了挑战。

我有代码设置,通过检查相机前进的检查来确定相机方向的方向......

GLKVector3 forward = [ m_camera getForwardVector ];
if ( fabsf( forward.x ) > fabsf( forward.z ) ) {
    // Need forward vector to be in x-direction
    // Rotate cube around axis ( 0.0f, 0.0f, 1.0f );
} else {
    // Need forward vector to be in z-direction
    // Rotate cube around axis ( 1.0f, 0.0f, 0.0f );
}

我想要做的是围绕指定的轴旋转立方体。但是,在多维数据集旋转多次后,矢量位置与世界位置不同,因此由于矢量位置的改变而无法正确旋转。

我的立方体旋转存储在四元数中。那么有没有办法确定哪个向量是" forward"矢量基于相机在哪里看?

这是我的轮换代码,如果这有帮助的话。谢谢!

- ( void ) rotate: ( GLKVector3 ) axis withAngle: ( GLfloat ) angle {
    [ self rotate: GLKQuaternionMakeWithAngleAndVector3Axis( GLKMathDegreesToRadians( angle ), axis ) ];
}

- ( void ) rotate: ( GLKQuaternion ) quat {
    m_rotation = GLKQuaternionNormalize( GLKQuaternionMultiply( m_rotation, quat ) );
}

1 个答案:

答案 0 :(得分:0)

好的,在阅读了StackOverflow的很多内容之后,我想出了一个解决我的问题的方法,我想分享它,以防其他人挣扎。

我在正确的轨道上,但只是做了一些小的改动。首先是旋转方法。在我的,我绕着我的物体局部轴旋转。我将其更改为围绕世界轴旋转。

- ( void ) rotate: ( GLKVector3 ) axis withAngle: ( GLfloat ) angle {
    // THIS WILL ROTATE AROUND THE WORLD AXIS
    m_rotation = GLKQuaternionMultiply( GLKQuaternionMakeWithAngleAndAxis( GLKMathDegreesToRadians( angle ), axis.x, axis.y, axis.z ), m_rotation );


    // THIS WILL ROTATE AROUD THE LOCAL AXIS
    // m_rotation = GLKQuaternionMultiply( m_rotation, GLKQuaternionMakeWithAngleAndAxis( GLKMathDegreesToRadians( angle ), axis.x, axis.y, axis.z ) );
}

现在,我可以围绕世界轴旋转。然后当我旋转时,我可以像这样使用前向矢量。

GLKVector3 forward = [ m_camera getCurrentViewPosition ];
if ( fabsf( forward.x ) > fabs( forward.z ) ) {
    m_rotateZ = ( forward.x < 0 ) ? -ROTATION_AMOUNT : ROTATION_AMOUNT;
    m_shouldRotateZ = true;
} else {
    m_rotateX = ( forward.z < 0 ) ? ROTATION_AMOUNT : -ROTATION_AMOUNT;
    m_shouldRotateX = true;
}
m_totalRotation = 0;

我检查了矢量分量的长度。在x较长的情况下,前向矢量在x方向上,因此我可以绕z轴旋转。

我希望这会清除一些内容,并可能在将来帮助某人。如果您有任何问题,请随时发表评论,我将帮助您了解更多内容。