2014-11-15 26 views
0

我想圍繞它自己的座標旋轉第一人稱視圖「相機」,而不是圍繞原點旋轉。這是我當前的相機翻譯和旋轉代碼。LWJGL ViewMatrix第一人稱視圖

if (Keyboard.isKeyDown(Keyboard.KEY_W)) { 
     xMod -= 0.0025f * (float)delta * (float)Math.sin(Math.toRadians(camera.rotation.y)); 
     zMod += 0.0025f * (float)delta * (float)Math.cos(Math.toRadians(camera.rotation.y)); 
    }     
    if (Keyboard.isKeyDown(Keyboard.KEY_S)) { 
     xMod += 0.0025f * (float)delta * (float)Math.sin(Math.toRadians(camera.rotation.y)); 
     zMod -= 0.0025f * (float)delta * (float)Math.cos(Math.toRadians(camera.rotation.y)); 
    }  
    if (Keyboard.isKeyDown(Keyboard.KEY_A)) { 
     xMod -= 0.0025f * (float)delta * (float)Math.sin(Math.toRadians(camera.rotation.y-90)); 
     zMod += 0.0025f * (float)delta * (float)Math.cos(Math.toRadians(camera.rotation.y-90)); 
    } 
    if (Keyboard.isKeyDown(Keyboard.KEY_D)) { 
     xMod -= 0.0025f * (float)delta * (float)Math.sin(Math.toRadians(camera.rotation.y+90)); 
     zMod += 0.0025f * (float)delta * (float)Math.cos(Math.toRadians(camera.rotation.y+90)); 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { 
     Mouse.setGrabbed(false); 
    } 

    if (Mouse.isButtonDown(0)) { 
     Mouse.setGrabbed(true); 
    } 

    if (Mouse.isGrabbed()) { 
     camera.rotation.y += (Mouse.getDX() * 0.005f) * delta; 
     camera.rotation.x += (Mouse.getDY() * -0.005f) * delta; 
    } 
    if (camera.rotation.x >= 90f) { 
     camera.rotation.x = 90f; 
    } 

    else if (camera.rotation.x <= -90f) { 
     camera.rotation.x = -90f; 
    } 

    if (Mouse.isGrabbed()) { 
     camera.position.x += xMod; 
     camera.position.z += zMod; 
    } 

    camera.reset(); 

    Matrix4f.translate(camera.rotation, camera.matrix(Camera.VIEWMATRIX), camera.matrix(Camera.VIEWMATRIX)); 
    Matrix4f.rotate(degToRad(camera.rotation.x), new Vector3f(1f,0f,0f), camera.matrix(Camera.VIEWMATRIX), camera.matrix(Camera.VIEWMATRIX)); 
    Matrix4f.rotate(degToRad(camera.rotation.y), new Vector3f(0f,1f,0f), camera.matrix(Camera.VIEWMATRIX), camera.matrix(Camera.VIEWMATRIX)); 
    Matrix4f.rotate(degToRad(camera.rotation.z), new Vector3f(0f,0f,1f), camera.matrix(Camera.VIEWMATRIX), camera.matrix(Camera.VIEWMATRIX)); 
    Matrix4f.scale(camera.scale, camera.matrix(Camera.VIEWMATRIX), camera.matrix(Camera.VIEWMATRIX)); 

camera.reset()執行此...

public void reset() { 
    viewMatrix = new Matrix4f(); 
} 

實質上正在重置視圖矩陣

也,camera.rotation是vector3f和camera.matrix返回一個矩陣,無論是Camera.ViewMatrix或Camera.ProjectionMatrix

感謝您的幫助。

回答

0

的所有

Matrix4f.translate(camera.rotation, camera.matrix(Camera.VIEWMATRIX), camera.matrix(Camera.VIEWMATRIX)); 

首先並沒有真正意義。我就假設你有camera.position這裏(這將是錯誤的,太多,但我後來來了這一點。

事實上,你先做平移相機,然後旋轉(圍繞原點)。

現在,您可能會認爲這是另一種方式,因爲您可能已經知道矩陣運算是按照相反的順序應用的 - 也就是這樣,但只有當您將變換看作是在物體周圍移動時纔有效。矩陣中,您將相機放置在世界中 - 這正好相反,在世界中移動相機與使用固定相機並使世界上所有物體反向移動完全相同。 ith marix math,(A * B)^-1B^-1 * A^-1相同。所以當你想以這種方式定義攝像機時,必須使用相反的順序(相反的順序,當你寫下東西時按順序結束),但是每次變換都會反轉。你將需要角度爲負的旋轉,然後是具有否定位置的翻譯,以便完成這項工作。