3

そのため、GLMライブラリを使用してOpenGLおよびC++で実装したカメラで問題が発生しました。私が目指しているカメラのタイプは、3Dの世界を簡単に探索できるフライアラウンドカメラです。私はなんとかカメラをかなり機能させることができました、それは素晴らしくて滑らかで、周りを見回し、そして動きは素晴らしくて正しいようです。

私が抱えている唯一の問題は、カメラのX軸とY軸に沿った回転(上下を見た状態)によって、カメラのZ軸を中心に回転が発生することです。これは、移動中に世界をわずかに回転させる結果になります。

例として...カメラの前に正方形のクワッドがあり、カメラを円を描くように動かすと、頭で円を描くように見回すように、モーションが完了すると、クワッドはわずかに回転します。頭を傾けた場合。

私のカメラは現在、シーン内のオブジェクト/エンティティにアタッチできるコンポーネントです。各エンティティには、基本的にそのエンティティのモデル行列である「フレーム」があります。フレームには、次の属性が含まれています。

glm::mat4 m_Matrix;
glm::vec3 m_Position;
glm::vec3 m_Up;
glm::vec3 m_Forward;

これらは、カメラによって次のような適切なviewMatrixを作成するために使用されます。

const glm::mat4& CameraComponent::GetViewMatrix()
{
    //Get the transform of the object
    const Frame& transform = GetOwnerGO()->GetTransform();

    //Update the viewMatrix
    m_ViewMatrix = glm::lookAt(transform.GetPosition(), //position of camera
                           transform.GetPosition() + transform.GetForward(), //position to look at
                           transform.GetUp()); //up vector

    //return reference to the view matrix
    return m_ViewMatrix; 
}

そして今...これがFrameオブジェクト内の私のrotateXメソッドとYメソッドです。これが問題の場所だと思います。

void Frame::RotateX( float delta )
{
    glm::vec3 cross = glm::normalize(glm::cross(m_Up, m_Forward)); //calculate x axis

    glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta, cross);

    m_Forward = glm::normalize(glm::vec3(Rotation * glm::vec4(m_Forward, 0.0f))); //Rotate forward vector by new rotation

    m_Up = glm::normalize(glm::vec3(Rotation * glm::vec4(m_Up, 0.0f))); //Rotate up vector by new rotation
}


void Frame::RotateY( float delta )
{
    glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta,  m_Up);    

    //Rotate forward vector by new rotation
    m_Forward = glm::normalize(glm::vec3(Rotation * glm::vec4(m_Forward, 0.0f))); 
}

だからどこかで、私が修正しようとして探していた問題があります。私は数日間それをいじって、ランダムなことを試みましたが、同じ結果が得られるか、z軸の回転は修正されましたが、X、Yの回転、カメラの動きが正しくないなどの他のバグが表示されます。

ジンバルロックを見てみましたが、理解してみると、この問題はジンバルロックとは思えませんでした。しかし、私は間違っているかもしれません。

4

2 に答える 2

7

Store the current pitch/yaw angles and generate the camera matrix on-the-fly instead of trying to accumulate small changes on the intermediate vectors.

于 2013-01-10T05:56:57.687 に答える
0

RotateY 関数で、次のように変更します。

glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta,  m_Up);

これに:

glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta,  glm::vec3(0,1,0));
于 2014-05-03T21:29:39.920 に答える