2010-06-28 4 views
1

Java에서 투시 뷰 변환을 수행하려면 어떻게해야합니까? 내가 이해하고 있듯이 FOV, Aspect Ratio, Near와 Far보기 거리를 결정할 수있는 마법의 4 차원 행렬이 있지만 그 행렬을 만드는 방법을 모르겠습니다.투시도/변환 행렬

나는 자바에서 "PerspectiveTransform"을 구현할 수있어,하지만 다음

double mat[][] = { 
    {1, 0, 0, 0}, 
    {0, 1, 0, 0}, 
    {0, 0, 1, 0}, 
    {0, 0, 1, 0}}; 
PerspectiveTransform ps = new PerspectiveTransform(mat); 
ps.transform(p1, p1); 
ps.transform(p2, p2); 
ps.transform(p3, p3); 
ps.transform(p4, p4); 

내가이 (가) 이해 사용할 때 나는 바닥을-대부분이 "1"1/d를해야 할 수도 있습니다 효과를 볼 수 없습니다 여기서 "d"는 거리이지만 아무리 많은 숫자를 입력해도 아무런 효과가 없습니다. 다른 숫자를 바꾸는 것은 효과가 있지만, 시도 할 때까지 어떤 효과가 있을지 모르겠다. (그리고 나는 단지 무한히 추측 할 수 없다). 나는 알고 있으며 "quadToQuad"기능을 작동시킬 수 있었지만, 다시 "쿼드 (quads)"를 사용할 것이라고 추측해야했습니다.

그래서 나는 "대화 형 컴퓨터 그래픽스"5th Ed의 적절한 부분을 읽었습니다. FOV, 종횡비, 거리 등을 바탕으로 필요한 매트릭스를 찾는 방법을 설명하는 자료가 필요합니다. 에드워드 천사가 그것을 이해하지 못합니다.

내가하려고하는 것은 조감도 이미지를 사람의 시선 이미지로 변환하는 것입니다. 구글 어스를 사용하는 경우이의 예 ..

감사

를 볼 수 있습니다 가능성이 있습니다
+0

또한 자바와 관련이 없습니다. –

답변

1

당신은 당신이 P1과 동일한 명령의 효과를 취소하는 (P2, P2)를 ps.transform을 수행 할 때 다음과 같이 인수로,하지만 상관없이 그 행렬의 위치의 일반적인 의미는, 즉 :

alt text http://knol.google.com/k/-/-/2lijysgth48w1/zafhtk/formule16.png

This link이 당신에게 작은 손을 줄 수 있습니다.
Also in here, 당신은 당신의 경우

"프로젝션 Tranform 설정"섹션에, 시야를 계산하는 방법을 확인할 수 있습니다, 당신 행렬의 마지막 행이 0 0 1 0으로 대신하는 방법을 집합해야한다고 생각 처럼. 또한 시야가 동일한 링크에 기재된 식으로 산출 할 수있다 :

void VerticalFieldOfView(float degrees, float aspectRatio, 
         float near, float far) 
{ 
    float top = near * std::tan(degrees * Pi/360.0f); 
    float bottom = -top; 
    float left = bottom * aspectRatio; 
    float right = top * aspectRatio; 

    glFrustum(left, right, bottom, top, near, far); 
} 

은 "glFrustum (...)"는

void ApplyFrustum(float left, float right, float bottom, 
        float top, float near, float far) 
{ 
    float a = 2 * near/(right - left); 
    float b = 2 * near/(top - bottom); 
    float c = (right + left)/(right - left); 
    float d = (top + bottom)/(top - bottom); 
    float e = - (far + near)/(far - near); 
    float f = -2 * far * near/(far - near); 

    mat4 m; 
    m.x.x = a; m.x.y = 0; m.x.z = 0; m.x.w = 0; 
    m.y.x = 0; m.y.y = b; m.y.z = 0; m.y.w = 0; 
    m.z.x = c; m.z.y = d; m.z.z = e; m.z.w = -1; 
    m.w.x = 0; m.w.y = 0; m.w.z = f; m.w.w = 1; 

    glUniformMatrix4fv(projectionUniform, 1, 0, m.Pointer()); 
} 

예는 C로되어있다 ++ 그러나 어디에 두 개의 Java 함수로 변환하는 것뿐 아니라 끝에 일치하는 행렬을 만드는 데 대응하는 메서드를 사용하면됩니다.

+0

좋아요, 여기 링크 제공에 대해 이해할 수없는 것이 있습니다 ... rightX, rightY, eyeX, eyeY, eyeZ 등의 레이블이있는 매트릭스처럼 보입니다. 내 2D 이미지를 가장해야한다는 의미입니다. 3 차원이며 눈/카메라의 포인트와 눈이보고있는 포인트를 만듭니다. 그래서 어떤 점을 사용합니까? 링크 중 어느 것도 FOV 또는 거리를 언급하지 않습니다. 두 번째는 "가까운 곳에서 멀리"라고 말하지만이 번호를 선택하는 방법이나 eyeX, eyeY, eyeZ 등을 선택하는 방법에 대해서는 아무 것도 말하지 않습니다. 누락 된 것이 있습니까? – Aaron

+0

우선, 4x4 크기를 사용할 때마다 3D 공간을 참조하고 있습니다. 즉, 양방향성과 관련하여 기본적으로 축 중 하나를 수정하여 작업중인 평면을 결정합니다. 행렬을 사각형으로 만들기 위해 작업하는 공간의 크기보다 항상 행렬에있는 하나의 크기 단위를 사용하여 작업을 단순화합니다. 내가 아는 한, 이미지가 실제 화면이고 3D 가상 환경에서 표현되지 않는 한이 방법을 사용하여 이미지의 시점을 실제로 변경할 수는 없습니다. –

+0

"이 방법을 사용하여 이미지의 시점을 실제로 변경할 수 없습니다."... 그래서 ... 4x4 매트릭스를 사용하여 2D 이미지의 시점을 변경할 수 없다는 말입니까? – Aaron