2017-10-01 11 views
0

FPSカメラを基本的にカメラの方向に応じて前後に動かす方法は不思議でしたが、私は惨めに失敗しました。最適に、今の私のコードは私の三角形の後ろのスイッチ方向である(ワットワットなりなり)と、回転が完全に動作し、一般的に動作しない(時々、代わりに前方の斜めに移動)としてではなく、翻訳私のマトリックスをねじ込む...OpenGL、ファーストパーソンカメラ翻訳

void glfwCursorCallback(GLFWwindow* window, double x, double y) { 
    camera.rx += (x - camera.lcx) * 0.01f; 
    camera.ry += (y - camera.lcy) * 0.01f; 
    kmMat4RotationYawPitchRoll(&camera.mat, camera.ry , camera.rx, 0.0f); 
    camera.lcx = x; 
    camera.lcy = y; 
} 
... 
kmMat4PerspectiveProjection(&projection, 90.0f, aspect, 0.1f, 1000.f); 
float x = 0.0f, y = 0.0f, z = -1.0f; 
while(!glfwWindowShouldClose(window)) { 
    if(glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { 
     /* pitch - ry */ 
     x += 0.1*sin(camera.ry)*cos(camera.rx); 
     y += 0.1*sin(camera.ry)*sin(camera.rx); 
     z += 0.1*cos(camera.ry); 
    } 
    if(glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { 
     x -= 0.1*sin(camera.ry)*cos(camera.rx); 
     y -= 0.1*sin(camera.ry)*sin(camera.rx); 
     z -= 0.1*cos(camera.ry); 
    } 

    glClear(GL_COLOR_BUFFER_BIT); 
    kmMat4Translation(&transform, x, y, z); 
    kmMat4Multiply(&object, &camera.mat, &transform); 
    kmMat4Multiply(&final, &projection, &object); 
    glUniformMatrix4fv(shader.mpm, 1, GL_FALSE, final.mat); 
    ... 

私はそれをやったことがないので、私はそれをどうするかわからないので、ここでは経験豊富な人々の指針が大好きです!

編集:目的はカメラを向きに合わせて前進させることです。また、私はxyを省略し、単に+にzを設定した場合、それは完璧に動作します - 0.1 ...そう、世界でX軸は右、Yを指しているものの、それは行列乗算の問題

答えて

0

ではありませんZ軸を上に、Z軸をビューポイント上で左に、Y軸を上に、Z軸をビューの外に(右手系ではZ - 軸は、X軸とY軸の外積です。

world to view

各点とシーンの参照システムからの各ベクトルは、したがって、ビューポート座標に最初に変換されなければなりません。これは、簡単に次の表によって処理することができます。

x y z 
-------- 
1 0 0 | x' = x 
0 0 1 | y' = z 
0 -1 0 | z' = -y 


は、さらにあなたはインクリメンタルカメラ行列を変更する必要がありますし、動きや回転を総括していません。つまり、現在の移動と現在の回転行列を計算する必要があります。移動と回転をカメラに適用し、ループの次のサイクルに備えてカメラを保持します。ループの次のサイクルで、前のサイクルから操作されたカメラを使用しなければならず、新しい移動と回転を適用する必要があります。これにより、カメラの増分が常に現在の位置と向きに基づいて変化します。

movement and rotation


あなたのコードは次のように何とかなります。

​​

glfwGetCursorPos(_wnd, &currentX, &currentY); 
while(!glfwWindowShouldClose(window)) { 

    float x = 0.0f, y = 0.0f, z = 0.0f; 
    if (glfwGetKey(_wnd, GLFW_KEY_W) == GLFW_PRESS) 
     y = 0.1f; 
    if (glfwGetKey(_wnd, GLFW_KEY_S) == GLFW_PRESS) { 
     y = -0.1f; 
    if (glfwGetKey(_wnd, GLFW_KEY_D) == GLFW_PRESS) 
     x = 0.1f; 
    if (glfwGetKey(_wnd, GLFW_KEY_A) == GLFW_PRESS) { 
     x = -0.1f; 
    if (glfwGetKey(_wnd, GLFW_KEY_Q) == GLFW_PRESS) 
     z = -0.1f; 
    if (glfwGetKey(_wnd, GLFW_KEY_E) == GLFW_PRESS) { 
     z = 0.1f; 

    // movment 
    kmMat4 yaw_matrix; 
    kmMat4Translation(&transform, x, z, -y); 

    // yaw 
    kmMat4 yaw_matrix; 
    kmMat4RotationY(&yaw_matrix, currenYaw); 
    currenYaw = 0.0; 

    // pitch 
    kmMat4 pitch_matrix; 
    kmMat4RotationX(&pitch_matrix, currentPitch); 
    currentPitch = 0.0; 

    // roatation = pitch_matrix * yaw_matrix 
    kmMat4 roatation; 
    kmMat4Multiply(&roatation, &yaw_matrix, &yaw_matrix); 

    // change the camera matrix incrementally 
    kmMat4Multiply(&camera.mat, &transform, &camera.mat); 
    kmMat4Multiply(&camera.mat, &roatation, &camera.mat); 

    .... 
} 


さらにSeet:

+0

私はちょうどで移動する必要はありませんカメラに向かって移動したい、とさらに倍(x、y、z)のためにその値を格納します固定量の軸で、私はすでにその細かいことをしています – Whiteclaws

+0

あなたの "ソリューション"は三角形を世界の中心に置き、カメラはその周りを回転するので、私が探しているのは実際にはありません、私はFPカメラ – Whiteclaws

+0

カメラのマトリックスを徐々に変更し、動きと回転を合計しないでください。新しい答えを見てください。 – Rabbid76