2015-01-26 2 views
0

을 복제 할 수 있도록, 내 참조 여기에 주제에 위키 피 디아 페이지입니다 그것을 "카메라 공간"으로 회전하고 번역하면 카메라가 이제 z 축 바로 아래를 바라 보는 원점이라고 가정합니다. (위키 피 디아 페이지에서이 행렬 연산 : http://upload.wikimedia.org/math/5/1/c/51c6a530c7bdd83ed129f7c3f0ff6637.png) 그런 다음이 식을 이용하여 2 차원 공간에 새 지점을 투사원근 투영 나 믹서기의 기본 장면 나는 현재 자신에게 원근 투영을 가르 칠하려고 해요

: http://upload.wikimedia.org/math/6/8/c/68cb8ee3a483cc4e7ee6553ce58b18ac.png

첫 번째 단계는 내가 완벽하게 할 수 있습니다. 내가 직접 매트릭스 라이브러리를 작성했지만 Blender로 결과를 입력하고 카메라를 0,0,0으로 이동하고 기본 장면과 동일한 것을 렌더링하는지 확인하여 올바른 답을 내고 있는지 확인했습니다.

그러나 영사 부분은 모두 잘못되었습니다.

내가 볼 수있는, 내가

EZ = 1/수행하여, 믹서 기본적으로 28.842도이다보기의 필드를 복용하고, 위키 피 디아는 EZ 호출 값을 계산하는 데 사용되어야한다에서 tan (fov/2);

이 경우 대략 3.88이다.

그때마다 지점 일 같아야

X = (EZ/DZ) * DX 단계; y = (ez/dz) * dy;

x와 y 좌표를 -1에서 1로 가져와 화면 너비에 맞게 적절하게 비율을 조정할 수 있습니다.

그러나 그렇게하면 영사 이미지가 x 축에 반영되고 어떤 경우에도 큐브 블렌더 렌더링과 일치하지 않게됩니다. 내가 뭘 잘못하고 있으며 올바른 좌표를 얻기 위해 무엇을해야합니까?

나는이 모든 것을 하나의 행렬 연산으로 할 수 있다는 것을 알고 있지만, 방금 방정식을 이해하려고 노력하고 있으므로, 묻는 질문에 충실하십시오.

+0

실제 코드를 볼 필요가 있다고 생각합니다. OpenGL을 사용하고 계십니까? 객체의 정점 좌표가 3D이지만 OpenGL과 GLSL 모두 4 번째 구성 요소 (w)를 만들고 4X4 행렬을 기대합니다. 실제로 모델, 뷰 및 투영의 세 가지 행렬이 필요합니다. – jwlaughton

+0

보기 매트릭스는 카메라의 (눈의) 위치,보기 방향 및 카메라 위쪽 방향으로 구성됩니다. 투영 행렬은 절두체를 정의하며 왼쪽, 오른쪽, 위, 아래, 가까운 및 먼 클리핑 평면으로 구성됩니다. 모델 행렬은 축척, 회전 및 평행 이동과 같은 다양한 변형으로 구성됩니다. 각 꼭지점을 Projection * View * Model * Vertex의 세 행렬로 곱합니다. BTW, OpenGL 또는 GLSL을 사용하지 않는 경우 w 좌표에 1.0을 사용하십시오. – jwlaughton

+0

투영 및 뷰 매트릭스를 구성하는 방법을 보려면 glFrustum 및 gluLookAt를 참조하십시오. – jwlaughton

답변

-1

투영 행렬 또는 모델 행렬에 문제가 있는지 여부는 귀하의 질문에서 명확하지 않습니다.

내 의견에 말했듯이 Google 매트릭스에서 glFrustum과 gluLook을 사용하여 이러한 행렬의 모양을 정확하게 볼 수 있습니다. 행렬 수학에 익숙하다면 (그리고 여러분처럼 보입니다) 좌표가 2D 관점으로 변환되는 방식을 이해하게 될 것입니다.

다음은이 행렬에 들어가는 구성 요소가 어떻게 계산되는지 볼 수 있도록 Y 축을 중심으로 30도 회전에 대한보기 및 투영 행렬 및 모델 행렬을 만들기위한 몇 가지 샘플 OpenGL 코드입니다.

// The Projection Matrix 

glMatrixMode (GL_PROJECTION); 
glLoadIdentity(); 
near = -camera.viewPos.z - shapeSize * 0.5; 
if (near < 0.00001) 
    near = 0.00001; 

far = -camera.viewPos.z + shapeSize * 0.5; 
if (far < 1.0) 
    far = 1.0; 
radians = 0.0174532925 * camera.aperture/2; // half aperture degrees to radians 
wd2 = near * tan(radians); 
ratio = camera.viewWidth/(float) camera.viewHeight; 
if (ratio >= 1.0) { 
    left = -ratio * wd2; 
    right = ratio * wd2; 
    top = wd2; 
    bottom = -wd2; 
} else { 
    left = -wd2; 
    right = wd2; 
    top = wd2/ratio; 
    bottom = -wd2/ratio; 
} 

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

// The View Matrix 

glMatrixMode (GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt (camera.viewPos.x, camera.viewPos.y, camera.viewPos.z, 
      camera.viewPos.x + camera.viewDir.x, 
      camera.viewPos.y + camera.viewDir.y, 
      camera.viewPos.z + camera.viewDir.z, 
      camera.viewUp.x, camera.viewUp.y ,camera.viewUp.z); 

// The Model Matrix 

glRotatef (30.0, 0.0, 1.0, 0.0); 

glRotate가 실제로 쿼터니온 회전 (회전 각도와 회전을 수행 할 벡터를 더한 값)을 수행함을 알 수 있습니다.

X, Y 및 Z 축을 중심으로 별도의 회전을 수행 할 수도 있습니다.

회전, 번역 및 비늘에 4X4 행렬을 형성하는 방법에 대한 정보가 많이 있습니다. 이들 각각을 개별적으로 수행하는 경우,이를 곱하여 모델 행렬을 가져와야합니다. 예컨대 :

당신은 4X4 규모, 당신하여 모델 행렬을 형성 수도 rotateX는, rotateY는, rotateZ가 번역 행렬이있는 경우

:

모델 = 규모 * rotateX * rotateZ * rotateY * 번역합니다.

모델 매트릭스를 구성 할 때 순서가 중요합니다. 곱셈을 다른 순서로 수행하면 결과가 달라집니다.

개체가 원점에있는 경우 카메라를 원본 위치에 두는 것이 좋습니다.