뷰포트가 늘어나거나 왜곡되는 것을 어떻게 방지 할 수 있습니까?


13

기본적으로 뷰포트 / 창 크기가 변경 될 때 렌더링 된 이미지의 왜곡이나 스트레칭을 제거하는 방법을 알고 싶습니다.

다음 이미지는 내가 말하는 왜곡 / 스트레칭을 보여줍니다.

원본 이미지 (스퀘어 창)

왜곡 없음

왜곡 / 늘려 진 이미지 (사각형 창)

왜곡

이상적으로, 두 번째 이미지는 가로로 늘이지 않고 구를 표시해야하며 더 큰 창 크기를 설명하기 위해 더 많은 장면을 사용자에게 노출해야합니다.

어떻게 할 수 있습니까?

OpenGL을 사용하여 이미지를 렌더링하고 있으며 호출을 통해 원근 투영을 사용합니다.

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

가로 세로 비율 width/height은 내가 접한 모든 문서 / 자습서에 따라 다르므로 정확하지 않을 것으로 예상됩니다. 그러나 내 의심은 그것이 스트레칭 문제에 영향을 미친다는 것입니다.


생각 후

솔직히이 문제에 대해 더 많이 생각할 때, 해결책은 포비 (y- 방향의 시야) 각도와 종횡비 사이에 직접적인 비례 관계를 포함한다고 믿었습니다.

투시 투영

위의 이미지를 참조로 사용하여 가로가 늘어 나면 가로 가로가 늘어 나면 렌더링 된 이미지의 비례를 '고정'하는 세로 세로 늘림이 발생하도록 포비 각도가 커져야한다는 것은 매우 타당 해 보입니다.

마찬가지로 폭을 줄이려면 포비 각도를 줄여야합니다.

최신 정보:

그래서, 이것을 더 조사한 후, 다음과 같이 시청 절두체를 설정하는 방식을 변경하기로 결정했습니다.

gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)

그리고 내 기대가 정확하여 비례 문제를 해결했습니다. 그러나 원하는 결과를 얻지 못했습니다. 창 너비가 증가하면 렌더링 된 이미지가 작아 지지만 구는 실제로 원형입니다. 대신 구의 크기가 전혀 바뀌지 않아야합니다. 표시되는 장면의 양만 변경되어야합니다.

답변:


14

사실, 원래의 질문은 솔루션에서 1 캐스트 떨어져 있습니다.

원본 코드

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

고정 코드

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, (float)window.width/window.height, 0.01f, 100.0f)

문제이었다 window.widthwindow.height애스펙트 비율은 정수 나눗셈의 결과로 인한 정수이다.

차원 중 하나를 부동 소수점으로 캐스팅하면 결과에 부동 소수점 나누기가 대신 사용됩니다.

이제 종횡비가 정확하기 때문에 원래 게시물에서 볼 수 있듯이 더 이상 늘어나지 않습니다.

편집 : 원래 게시물의 코드 (및 답변)는 단순히 GPU 호출에 대한 의사 코드입니다. 위의 이미지를 출력하는 데 사용 된 실제 프로그램은 Java로 작성됩니다. Java를 사용하지 않는 사람들에게는 정수 / 부동 소수점 나누기가 같은 방식으로 구현되는지 조사하지 않았습니다. 어쨌든 해결책은 종횡비가 실제로 정확하게 계산되도록하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.