2017-11-04 4 views
1

내가 직교 행렬을 설정이 방법 :는 OpenGL ES 2.0 : 직교에서 관점에 (카드 플립 효과)

float widthF = (right - left)/numColumns; // left to right 
float heightF = (bottom - top)/numRows; // top to bottom 
for (int row = 0; row < numRows; ++row) { 
    for (int col = 0; col < numColumns; ++col) { 
     float x1 = left + col * widthF; 
     float y1 = top + row * heightF; 
     float x2 = left + (col + 1) * widthF; 
     float y2 = top + (row + 1) * heightF; 
     float z = 0f; 
     // and so on, add to vertex buffer 
    } 
} 

그리고 결과 : 일부 타일 만들기

ratio = (float) width/height; 
left = -ratio; 
right = ratio; 
bottom = -1f; 
top = 1f; 
Matrix.orthoM(projectionMatrix, 0, left, right, bottom, top, -1f, 1f); 
viewProjMatrix = projectionMatrix; 

이 방법을 수행 이다 : 나는 perspec를 사용하는 경우

orthogonal projection

이 더 나은 보일 수 있습니다 적인 대신 직교 행렬의 매트릭스 :

Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, 1f, 10f); 
Matrix.setLookAtM(viewMatrix, 0, 0f, 0f, 2f, 0f, 0f, 0f, 0f, 1f, 0f); 
Matrix.multiplyMM(viewProjMatrix, 0, projectionMatrix, 0, viewMatrix, 0); 

그리고 그 결과는 다음과 같습니다

perspective projection

하지만, 어떻게 이미지가 뷰포트를 채우는 의미 "전체 화면"에 표시 얻을? 직교 행렬이 뷰포트를 채우는 방식이지만 이번에는 원근감을 보입니다.

답변

1

프로젝션 매트릭스는 뷰포트의 2D 포인트, 장면의 3D 포인트로부터 매핑 기술 (이 카드 플립 효과 Flux Slider의 Tiles3D 전이 의해 inpired된다). 투영 행렬은 뷰 공간에서 클립 공간으로 변환되고 클립 공간의 좌표는 (-1, -1, -1)에서 (1,1,1) 범위의 정규화 된 장치 좌표 (NDC)로 변환됩니다. 클립 좌표의 w 구성 요소로 나눠서 표시합니다.

투시 매트릭스 투영 매트릭스는 핀홀 카메라에서 볼 때 월드의 3D 포인트에서 뷰포트의 2D 포인트로의 매핑을 설명합니다.
카메라 절두체 (잘린 피라미드)의 눈 공간 좌표가 큐브 (정규화 된 장치 좌표)에 매핑됩니다.

enter image description here

뷰 공간의 투영 면적과 Z 사이 realtion 뷰 공간 좌표는 직선이다. 시야각 및 가로 세로 비율에 따라 다릅니다.

enter image description here

당신은 이미지에 만났고 분야를 조정해야합니다. 이를 위해서는 이미지와 카메라 위치까지의 거리를 알아야합니다.

float distZ = ....; // distance of the camera to the image 
float sizeX = ....; // width of the rectangle where the image is placed in 
float sizeY = ....; // height of the rectangle where the image is placed in 

float near = 1f; 
float far = 10f; 

float left = -0.5 * sizeX * near/distZ; 
float right = 0.5 * sizeX * near/distZ; 
float bottom = -0.5 * sizeY * near/distZ; 
float top = 0.5 * sizeY * near/distZ; 

Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, near, far); 

물론 이미지는 뷰의 중앙에 위치해야합니다.