簡體   English   中英

用四元數旋轉相機

[英]Rotate Camera With Quaternions

我試圖制作一個可以按箭頭鍵旋轉的照相機,但是,當我轉動照相機並嘗試旋轉照相機時,它不會繞正確的軸旋轉。

例如,我的上向量是(0,1,0)。 我可以左右旋轉相機,因為這個向量是恆定的。 當我嘗試繞其右軸旋轉時,相機無法正常工作。 如果我左右轉動相機並繞右軸旋轉,通常會以不正確的奇怪方向對待軸。 情況並非如此,因為我仍然可以完美地向右移動相機,只是無法正確旋轉。

以下是所有相關代碼。 我不確定為什么旋轉繞y軸而不是其他任何軸旋轉。

// m_rotation is a Quaternion and rotation is a 4x4 view matrix

// Rotate around y-axis when left arrow pressed
// This works perfectly
if ( Input::IsKeyDown( Input::KEY_LEFT_ARROW ) ) {
    Rotate( Vector3<float>( 0, -1, 0 ), m_sensitivity );
}

// When down arrow is pressed, rotate around right axis
// This rotates around strange axis
if ( Input::IsKeyDown( Input::KEY_DOWN_ARROW ) ) {
    Rotate( m_rotation.GetRight( rotation ), m_sensitivity );
}

// Rotate methods
void Camera::Rotate( const Vector3<float> &axis, float angle ) {
    Rotate( Quaternion( axis, angle ) );
}

void Camera::Rotate( const Quaternion &quaternion ) {
    m_rotation = Quaternion( ( quaternion * m_rotation ).Normalized() );
}

// Quaternion code
Quaternion( const Vector3<float> &vect, float angle ) {
    float sinAngle = sinf( angle / 2.0f );
    float cosAngle = cosf( angle / 2.0f );

    ( *this )[ 0 ] = vect[ 0 ] * sinAngle;
    ( *this )[ 1 ] = vect[ 1 ] * sinAngle;
    ( *this )[ 2 ] = vect[ 2 ] * sinAngle;
    ( *this )[ 3 ] = cosAngle;
}

inline Quaternion operator*( const Quaternion &quat ) const {
    Quaternion ret;

    ret[ 3 ] = ( ( *this )[ 3 ] * quat[ 3 ] ) - ( ( *this )[ 0 ] * quat[ 0 ] ) - ( ( *this )[ 1 ] * quat[ 1 ] ) - ( ( *this )[ 2 ] * quat[ 2 ] );
    ret[ 0 ] = ( ( *this )[ 3 ] * quat[ 0 ] ) + ( ( *this )[ 0 ] * quat[ 3 ] ) + ( ( *this )[ 1 ] * quat[ 2 ] ) - ( ( *this )[ 2 ] * quat[ 1 ] );
    ret[ 1 ] = ( ( *this )[ 3 ] * quat[ 1 ] ) + ( ( *this )[ 1 ] * quat[ 3 ] ) + ( ( *this )[ 2 ] * quat[ 0 ] ) - ( ( *this )[ 0 ] * quat[ 2 ] );
    ret[ 2 ] = ( ( *this )[ 3 ] * quat[ 2 ] ) + ( ( *this )[ 2 ] * quat[ 3 ] ) + ( ( *this )[ 0 ] * quat[ 1 ] ) - ( ( *this )[ 1 ] * quat[ 0 ] );

    return ret;
}

inline Vector3<float> GetRight( const Matrix4<float> &viewMatrix ) const {
    return Vector3<float>( rotation[ 0 ][ 0 ], rotation[ 1 ][ 0 ], rotation[ 2 ][ 0 ] );
}

任何幫助或建議,我們將不勝感激。 謝謝。

經過幾天的嘗試各種不同的事情,我發現了問題。 我忘了四元數在相乘時是不可交換的。 這導致相機旋轉異常。 因此,要解決此問題,我要做的就是更改此代碼。

void Camera::Rotate( const Quaternion &quaternion ) {
     m_rotation = Quaternion( ( quaternion * m_rotation ).Normalized() );
} 

為此...

void Camera::Rotate( const Quaternion &quaternion ) {
     m_rotation = Quaternion( ( m_rotation * quaternion ).Normalized() );
} 

我希望將其發布,希望對以后的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM