2013-10-16 5 views
0

이것이 숙제입니다. 그러나 나는 우리를 위해 노력해 왔으며, 내가 잘못한 것을 얻지는 않습니다. 아이디어는 3 개의 주어진 벡터, 중심 (카메라 위치) 위 (world up, this는 (0, 1, 0))와 lookAt (보아야 할 세계 좌표의 점)에서 카메라를 생성하는 것입니다. .3d 카메라 매트릭스를 계산하십시오

카메라를 x 축과 z 축으로 이동할 때 Everythinig가 잘 작동하지만 y 축 (위/아래)으로 이동할 때 카메라가 잘 움직입니다. 단지 (0, 0, 0) .

나는 다음과 같은 코드를 가지고, Vector3f 및 Matrix4f는 javax.vecmath에서입니다. *

private void updateCameraMatrix() { 
    Vector3f z = new Vector3f(); 
    z.sub(center, lookAt); 
    z.normalize(); 

    Vector3f x = new Vector3f(); 
    x.cross(z, up); 
    x.normalize(); 

    Vector3f y = new Vector3f(); 
    y.cross(x, z); 
    y.normalize(); 



    cameraMatrix.set(new float[] { 
     x.x, y.x, z.x, 0.0f, 
     x.y, y.y, z.y, 0.0f, 
     x.z, y.z, z.z, 0.0f, 
     0.0f, 0.0f, 0.0f, 1.0f 
    }); 

    cameraMatrix.mul(new Matrix4f(new float[] { 
     1.0f, 0.0f, 0.0f, -center.x, 
     0.0f, 1.0f, 0.0f, -center.y, 
     0.0f, 0.0f, 1.0f, -center.z, 
     0.0f, 0.0f, 0.0f, 1.0f 
    })); 
} 

사전에 어떤 도움을 주셔서 감사합니다!

답변

2

나는 당신이 계산 한 이유가 x, y, z, 인 이유를 알지 못합니다. 4 × 4 매트릭스를 계산하고 그것에서 카메라 모양을 적용 할 수 있지만, 그때 나는 이런 식으로 할 것 :

public final Matrix4 lookAt(Vector3 eye, Vector3 center) 
{ 
    float dx = eye.x - center.x; 
    float dy = eye.y - center.y; 
    float dz = eye.z - center.z; 

    float pitch = (float) Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); 
    float yaw = (float) Math.atan2(dz, dx); 

    pitch = -pitch; 
    yaw = yaw - 1.57079633f; 

    Matrix4 camera_matrix = new Matrix4(); 

    matrix.identity(); 

    matrix.rotate(pitch, -1f, 0f, 0f); 
    matrix.rotate(yaw, 0f, 1f, 0f); 

    matrix.translate(-eyex, -eyey, -eyez); 

    return matrix; 
} 

여기에 기본적으로이 기능은 "사용"(0, 1, 0)up.

당신은 내가 Vector3, Matrix4하지 Vector3f, 나는 javax.vecmath.* 클래스를 사용하지 않기 때문에이다 Matrix4f 쓰기 볼 수 있듯이. 기본적으로 같지만 vecmath는 아마도 내가 사용하는 것과 동일한 메소드를 포함해야하지만 다음을 계산하기위한 맞춤 클래스를 만들었습니다. 그것은 코멘트로 작성하지 않으면 나는 그들을 제공 할 수 있지만.

+0

고마워, 이것은 매력처럼 작동합니다. 강의 슬라이드에서 수식을 구현하려고했습니다 ... ;-). –

+1

당신을 환영합니다! ;) – Vallentin

+0

matrix.rotate (...) 호출에 해당하는 javax.vecmath는 무엇이 될까요? 또한, 위의 변수 "camera_matrix"가 실제로 "매트릭스"라고 가정합니다. –

관련 문제