从四元鱼的方向矢量

时间:2015-11-05 04:42:20

标签: c++ camera quaternions

我正在制作可移动相机,我使用四元数来表示相机旋转。我将四元数设置为默认值,因此x = y = z = 0且w = 1.我的相机默认位置是x = 0,y = 0,z = 5,其中正y是向上而正z是朝向用户。

我可以完美地旋转相机,但我无法移动它。我希望相机朝相机朝向的方向前进。我该怎么做呢?

我看到某处使用了以下内容。

inline Vector3<float> GetForward() const {
    return Rotate( Vector3<float>( 0, 0, 1 ), *this );
}

Vector3<float> Rotate( const Vector3<float> &vect, const Quaternion &quat ) {
    Quaternion w = quat * vect * quat.Conjugate();
    return Vector3<float>( w.GetX(), w.GetY(), w.GetZ() );
}

inline Matrix4<float> ToRotationMatrix() {
    Matrix4<float> ret;

    ret[ 0 ][ 0 ] = GetW() * GetW() + GetX() * GetX() - GetY() * GetY() - GetZ() * GetZ();
    ret[ 0 ][ 1 ] = 2 * GetX() * GetY() - 2 * GetW() * GetZ();
    ret[ 0 ][ 2 ] = 2 * GetX() * GetZ() + 2 * GetW() * GetY();

    ret[ 1 ][ 0 ] = 2 * GetX() * GetY() + 2 * GetW() * GetZ();
    ret[ 1 ][ 1 ] = GetW() * GetW() - GetX() * GetX() + GetY() * GetY() - GetZ() * GetZ();
    ret[ 1 ][ 2 ] = 2 * GetY() * GetZ() + 2 * GetW() * GetX();

    ret[ 2 ][ 0 ] = 2 * GetX() * GetZ() - 2 * GetW() * GetY();
    ret[ 2 ][ 1 ] = 2 * GetY() * GetZ() - 2 * GetW() * GetX();
    ret[ 2 ][ 2 ] = GetW() * GetW() - GetX() * GetX() - GetY() * GetY() + GetZ() * GetZ();

    return ret;
}

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 Quaternion operator*( const Vector3<float> &vect ) const {
    Quaternion ret;

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

    return ret;
}

我尝试了这个但它只是将x,y和z设置为0并且相机不移动。所以我不确定如何从四元数中获取方向向量。非常感谢任何帮助或建议。感谢。

编辑:原来这个方法有效。你只需要正确地做数学。我错误地乘以Vector3。我已经添加了更正的代码,希望其他人不会犯同样的错误。

0 个答案:

没有答案
相关问题