Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用四元数旋转摄影机_C++_Camera_Rotation_Quaternions - Fatal编程技术网

C++ 使用四元数旋转摄影机

C++ 使用四元数旋转摄影机,c++,camera,rotation,quaternions,C++,Camera,Rotation,Quaternions,我试图制作一个可以在按下箭头键时旋转的相机,但是,当我转动相机并尝试旋转它时,它不会绕正确的轴旋转 例如,我的上方向向量是(0,1,0)。我可以完美地左右旋转我的相机,因为这个向量是恒定的。当我试图绕相机的右轴旋转时,相机无法工作。如果我将相机向左或向右旋转,并围绕右轴旋转,它通常会以不正确的奇怪方向处理轴。这不应该是这样的,因为我仍然可以完美地移动我的相机,它只是不能正确旋转 以下是所有相关代码。我不知道为什么旋转是围绕y轴的,而不是其他任何轴 // m_rotation is a Quate

我试图制作一个可以在按下箭头键时旋转的相机,但是,当我转动相机并尝试旋转它时,它不会绕正确的轴旋转

例如,我的上方向向量是(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 ] );
}
//m_旋转是四元数,旋转是4x4视图矩阵
//按下左箭头时绕y轴旋转
//这很好用
if(输入::IsKeyDown(输入::键\左箭头)){
旋转(矢量3(0,-1,0),m_灵敏度);
}
//按下向下箭头时,绕右轴旋转
//它绕着奇怪的轴旋转
if(输入::IsKeyDown(输入::键向下箭头)){
旋转(m_旋转。GetRight(旋转),m_灵敏度);
}
//轮换方法
无效摄影机::旋转(常量向量3和轴、浮动角度){
旋转(四元数(轴、角度));
}
无效摄影机::旋转(常量四元数和四元数){
m_旋转=四元数((四元数*m_旋转).Normalized());
}
//四元数码
四元数(常量向量3和向量、浮动角度){
浮动sinAngle=sinf(角度/2.0f);
浮动余弦角=余弦角(角/2.0f);
(*此)[0]=vect[0]*sinAngle;
(*此)[1]=vect[1]*sinAngle;
(*此)[2]=vect[2]*正弦角度;
(*此)[3]=余角;
}
内联四元数运算符*(常数四元数和四元数)常数{
四元数ret;
ret[3]=(*这个)[3]*四元[3])-(*这个[0]*四元[0])-((*这个[1]*四元[1])-(*这个[2]*四元[2]);
ret[0]=(*这个)[3]*四元[0])+(*这个)[0]*四元[3])+(*这个[1]*四元[2])-(*这个[2]*四元[1]);
ret[1]=(*这个)[3]*四元[1])+(*这个[1]*四元[3])+(*这个[2]*四元[0])-(*这个[0]*四元[2]);
ret[2]=(*这个)[3]*四元[2])+(*这个)[2]*四元[3])+(*这个[0]*四元[1])-(*这个[1]*四元[0]);
返回ret;
}
内联向量3 GetRight(常量矩阵4和viewMatrix)常量{
返回向量3(旋转[0][0]、旋转[1][0]、旋转[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() );
} 
我想发布这篇文章,希望它对将来的人有所帮助