2014-07-19 3 views
1

IOS 및 Android에서 세로 모드와 가로 모드를 변경할 때 문제가 있습니다. 둘 다 허용되는 인물 및 풍경 모드가 있습니다. SDL을 사용하여 방향 변경을 처리 중입니다. 카메라의 새로운 종횡비를 설정하고 새 해상도로 glViewport를 호출합니다. 내 경우 Portrait는 640x1136이고 Landscape는 역방향 1136x640입니다. 이것은 Portrait에서 모델이 Landscape에 비해 더 큰 최종 결과입니다. OpenGL ES 2.0의 인물 및 풍경 모드

Landscape

Portrait

여기서 코드의 중요한 부분이다.

float width = displayMode.w; 

float height = displayMode.h; 


float aspect = width/height; 
m_pCamera->SetAspect(aspect); 

glViewport(0, 0, width, height); 

while(game->running) 
{ 
    while (SDL_PollEvent(&event)) { 
      if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) 
      { 
       width = event.window.data1; 
       height = event.window.data2; 

       aspect = width/height; 
       m_pCamera->SetAspect(aspect); 

       glViewport(0, 0, width, height); 
      } 
} 
+0

투영 행렬은 일반적으로 y 방향의 표시된 좌표 범위를 동일하게 유지하기 위해 계산됩니다. 귀하의 사진을 기반으로, 이것은 정확하게 당신이지고있는 것 같습니다. 그래서 그 의미에서 이것은 FAD (기능대로 설계된)의 경우입니다. 화면 방향을 변경 한 후 형상의 실제 크기가 동일하게 유지되는 것을 찾고 있습니까? –

+0

그래, 오리엔테이션 변경 후 지오메트리의 크기를 유지하고 싶습니다. 이상적으로는 새 해상도를 자르고 객체의 크기를 유지하고 싶습니다. – sabotage3d

답변

1

투시 투영 행렬에 일반적으로 사용되는 계산법은 y 축을 따라 표시된 지오메트리의 범위를 유지합니다. 이것이 바로 그림에서 보이는 것입니다. 따라서 표준 관점에서 예상되는 동작입니다.

원하는 것을 얻으려면 투시도 매트릭스 계산을 약간 조정해야합니다. y 축을 따라 범위를 일정하게 유지하는 대신 큰 화면 치수 상수에 해당하는 축의 범위를 유지할 수 있습니다. 이것을 사용하면 장치를 회전 할 때 개체의 크기가 그대로 유지됩니다.

상수는 Y 범위 tanAng2보기 반 필드 tan 인와 같이 계산된다 유지하는 관점 행렬 및 aspRat 종횡비이있는

[ 1/(aspRat * tanAng2)  0    0     0   ] 
[   0    1/tanAng2   0     0   ] 
[   0     0  (n + f)/(n - f) 2 * n * f/(n - f) ] 
[   0     0    -1     0   ] 

흥미로운 행렬 요소 컨텍스트가 m00m11 인 경우 xy의 배율을 결정하기 때문에 aspRat 위해 두 중심으로하고 width/height 치환 : 그 값

m00 = 1/tanAng2 
m11 = width/(height * tanAng2) 

시야 :

m00 = height/(width * tanAng2) 
m11 = 1/tanAng2 

대신 상수 X 범위를 유지하기 위해,이 행렬 원소는 다음과 같이 계산 될 이전에 y 방향이었던 x 방향에 직접 적용됩니다. 또한 m11/m00은 여전히 ​​aspRat이므로 렌더링 된 형상이 왜곡되지 않도록하는 데 필요합니다.

모든 즉 width 또는 height가 큰 경우에 따라서는 둘 사이에 선택되어 남아 :

if (height > width) { 
    m00 = height/(width * tanAng2) 
    m11 = 1/tanAng2 
} else { 
    m00 = 1/tanAng2 
    m11 = width/(height * tanAng2) 
} 

모든 나머지 행렬 요소는 위의 전체 매트릭스와 같이 동일하게 유지.