对于我正在处理的项目,我试图允许用户根据他们在屏幕上滑动的方向旋转多维数据集。我有这个工作,除了立方体旋转的方向。
例如,我的前向向量从(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 ) );
}
答案 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轴旋转。
我希望这会清除一些内容,并可能在将来帮助某人。如果您有任何问题,请随时发表评论,我将帮助您了解更多内容。