2014-11-15 2 views
0

자신의 좌표 주위에서 첫 번째 인물 뷰 "카메라"를 회전하려고하는데 대신 원점을 중심으로 회전합니다. 다음은 카메라 번역 및 회전에 대한 현재 코드입니다. 역시LWJGL ViewMatrix 1 인칭 뷰

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

도움 주셔서 감사합니다. 모든

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

답변

0

먼저 정말 이해가되지 않습니다. 난 그냥 당신이 여기 camera.position (즉, 너무 잘못된 것입니다,하지만 난 나중에에오고있는 가정합니다.

을 당신은 실제로 카메라를 처음으로 번역 할 다음) 원점을 중심으로 (회전.

이제 행렬 연산이 역순으로 적용된다는 사실을 알게되었으므로 다른 방법이라고 생각할 수 있습니다. 즉, 변형을 객체 주위를 움직이는 것으로 볼 때만 가능합니다. 고전적 뷰 매트릭스를 사용하면 세계에 카메라를 배치 할 수 있습니다. 카메라를 세계로 이동하는 것은 고정 카메라를 사용하고 전 세계의 모든 대상을 반대로 이동하는 것과 완전히 똑같습니다.

W i 번째 marix 수학, (A * B)^-1B^-1 * A^-1과 같습니다. 그런 식으로 카메라를 정의하고 싶을 때는 반대 순서 (역순)를 사용하고, 순서를 바꾸면서 순서대로 끝내야합니다. 그러나 각 변환이 거꾸로 처리되어야합니다. 이 작업을 수행하려면 부정적인 각도의 회전과 부정 된 위치의 변환이 필요합니다.

관련 문제