我正在制作可移动相机,我使用四元数来表示相机旋转。我将四元数设置为默认值,因此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。我已经添加了更正的代码,希望其他人不会犯同样的错误。