2016-05-01 11 views
0

私は現在OpenGL FrameWork/Engineに取り組んでおり、OpenGLの部分までは私の結果にかなり満足しています。 一方、私はカメラを動作させるのに深刻な問題があります。 Z軸に沿って動くのはうまくいくが、暴れ始めると(X軸に沿って動く)、シーン全体がねじ込まれる。 strafingの結果を下の画像で見ることができます。 左の部分は実際のシーンを示し、右の部分はひずみの動きによるシーンを示しています。OpenGL Camera Strafing doesnt work

enter image description here

私のコードは以下の通りです。コンストラクタで :「更新」方法 - では

//Info is a Struct with Default values 
    m_projectionMatrix = glm::perspective(
    info.fieldOfView, width/height, //info.fov = 90 
    info.nearPlane, info.farPlane  // info.near = 0.1f, info.far = 1000 
    ); 

    //m_pos = glm::vec3(0.0f,0.0f,0.0f), info.target = glm::vec3(0.0f, 0.0f, -1.0f) 
    m_viewMatrix = glm::lookAt(m_pos, m_pos + info.target, Camera::UP); 

    //combine projection and view 
    m_vpMatrix = m_projectionMatrix * m_viewMatrix; 

私は現在、次のことをやっている:私の知る限りでは

glm::mat4x4 Camera::GetVPMatrix() 
{ 
    m_vpMatrix = glm::translate(m_vpMatrix, m_deltaPos); 
    return m_vpMatrix; 
} 

: 投影行列は、実際の透視図を実現しています。ビューマトリックスは、最初は、シーン全体を平行移動して回転させ、中央に配置します。 なぜVP-MatrixをZ値で翻訳するのがうまくいくのですか?

私はこのようなカメラの動作を実現したいと思います: 初期Cam Posは(0,0,0)で、 "Center"は例えばです。 (0,0、-1)となる。 X = 5での変換後:Cam Posは(5,0,0)、Centerは(5,0、-1)です。

編集:追加質問。 VP座標変換によってZ座標が適用されるのはなぜですか?

ありがとうございました! 最高の、Christoph。

答えて

0

行列の数学は私の強みではないので、現在のアプローチがうまくいかない理由を説明することはできませんが、疑問があります。以下は、あなたががカメラを移動できるようにする必要があります。

// update your camera position 
m_pos = new_pos; 
// update the view matrix 
m_viewMatrix = glm::lookAt(m_pos, m_pos + info.target, Camera::UP); 
// update the view-projection matrix, projection matrix never changes 
m_vpMatrix = m_projectionMatrix * m_viewMatrix; 
+0

が、これは「生成しません「ターゲット」中心ビュー? Glm lookAtは目標点に焦点を当てた行列を生成しなければならないので、実際の歪みの動きは達成されません。さらに、回転に進むと、同じ問題が発生するでしょうか? – Christoph

+0

あなたのコードを見ると、あなたの目標は、世界の固定小数点ではなく、m_posの任意のオフセットに過ぎません。これは、カメラの位置が移動するにつれて、ターゲットも移動することを意味します。私はあなたがカメラをカメラに対して固定方向に「見る」ようにしていたので、これをしたと仮定しました。 – Fibbles

+0

はい、それは私が欲しいものです。カメラが横向きになると、フォーカスポイントがこれを行う必要があります。「見出し」は変更しないでください。 – Christoph

1

さて、私は最終的に解決策を持って...あなたが見ることができるように、私は私の母の数学のためのGLMを使用しています。 GLMは列のメジャー順に行列値を格納します。 Open GLでは、列の主要な順序付けられた行列も必要です。利用可能のOpenGL/C++チュートリアル状態のほとんどが、その一つはGL_TRUE意味で

glUniformMatrix4fv(location, 1, GL_TRUE, &mat[0][0]); 

を使用すべきであるので、C/C++、ネイティブ2Dアレイレイアウトは、マトリクスを変換する必要があることを、行メジャーである(転置?)主要行から列の主要な順序。私の行列が既に列主要形式でbeeingてのので、それは絶対にない感覚...

glUniformMatrix4fv(location, 1, GL_FALSE, &mat[0][0]); 

に私の問題を上記の固定変更していないになります...