문제

OpenGL을 사용하여 캠퍼스의 원시지도를 그려 보려고합니다.

누구든지 패닝, 축소 및 회전이 일반적으로 구현되는 방법을 설명 할 수 있습니까?

예를 들어, 패닝 및 확대 / 축소를 통해 단순히 내 뷰포트를 조정 하는가? 그래서 나는지도를 작성하는 모든 줄을 플롯하고 그려서 사용자가 클릭하고 드래그 할 때 내 뷰포트를 조정합니까?

패닝의 경우 뷰포트의 x/y 값을 전환하고 축소를 위해 뷰포트가 어느 정도 증가/감소합니까? 회전은 어떻습니까?

회전을 위해 캠퍼스 맵을 나타내는 각 폴리 라인에 대해 아핀 변환을해야합니까? 괜찮은 크기의지도에서 즉시 비용이 들지 않습니까?

아니면 뷰포트가 동일하게 남아 있고 다른 길에서 패닝/확대/축소/회전이 이루어 집니까?


예를 들어, 당신이 이것에 가면 링크 당신은 그가 뷰포트를 수정함으로써 내가 위의 방법을 정확히 정확히 푸닝하고 확대하는 것을 묘사하는 것을 볼 수 있습니다.

이것이 맞지 않습니까?

도움이 되었습니까?

해결책

그들은 장면을 그리기 전에 일련의 gltranslate, glrotate 명령 (카메라 위치 및 방향을 나타내는)을 적용하여 달성합니다. (기술적으로, 당신은 전체 장면을 회전하고 있습니다!)

glulookat와 같은 유틸리티 기능이 있습니다.

사물을 간단하게 설명하려면 카메라를 나타내는 두 개의 벡터가 있다고 가정합니다 : 위치와 방향.

Glulookat은 위치, 대상 및 UP 벡터를 취합니다.

벡터 클래스를 구현하는 경우 destinaion = position + direction 목적지 지점을 제공해야합니다.

다시 한 번 물건을 단순하게 만들려면 UP 벡터가 항상 (0,1,0)라고 가정 할 수 있습니다.

그런 다음 장면에서 무엇이든 렌더링하기 전에 Identity Matrix를로드하고 Glulookat에 전화하십시오.

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );

그런 다음 물체를 그리기 시작하십시오

위치를 오른쪽 또는 왼쪽으로 약간 변경하여 사용자가 스팬을 가질 수 있습니다. 방향 벡터를 회전해야하므로 회전은 조금 더 복잡합니다. 회전하는 것이 장면의 물체가 아니라 카메라라고 가정합니다.

한 가지 문제는 방향 벡터 만 "앞으로"만 있으면 어떻게 이동합니까? 오른쪽과 왼쪽은 어디에 있습니까?

이 경우의 나의 접근 방식은 단지 "방향"과 (0,1,0)의 십자형 제품을 취하는 것입니다.

이제 카메라를 다음과 같은 것을 사용하여 왼쪽과 오른쪽으로 이동할 수 있습니다.

position = position + right * amount; //amount < 0 moves to the left

"방향 벡터"를 사용하여 앞으로 이동할 수 있지만 IMO는 수평 평면으로 이동을 제한하는 것이 좋습니다. 따라서 오른쪽 벡터를 얻은 것과 같은 방식으로 전방 벡터를 가져 오십시오.

forward = cross( up, right )

솔직히 말해서, 이것은 다소 해킹 된 접근법입니다.

적절한 접근법은 더 "정교한"데이터 구조를 사용하여 전방 방향뿐만 아니라 카메라의 "방향"을 나타내는 것입니다. 그러나 방금 시작했기 때문에 한 번에 한 걸음 씩 일을하는 것이 좋습니다.

다른 팁

이러한 모든 "작업"은 모델 뷰 매트릭스 변환 기능을 사용하여 달성 할 수 있습니다. Gltranslatef (Panning), Glscalef (Zoom), Glrotatef (회전)에 대해 읽어야합니다. 또한 OpenGL에 대한 기본 자습서를 읽어야합니다. 이 링크 유용한.

일반적으로 OpenGL 내의 3D 공간에서 어떤 점을 참조 할 때마다 적용되는 세 단계가 있습니다.

로컬 포인트가 주어졌습니다

  • 지역 -> 세계 변환
  • 세계 -> 카메라 변환
  • 카메라 -> 화면 변환 (일반적으로 투영. 원근법 또는 직교를 사용하는지에 따라 다름)

이러한 각 변환은 3D 포인트를 취하고 매트릭스를 곱합니다.

카메라를 회전시킬 때는 일반적으로 변환 매트릭스에 회전/팬/줌 애플리케이션 변환으로 변환 매트릭스에 곱하여 카메라 변환을 변화시키고 있습니다. 모든 포인트가 각 프레임을 다시 렌더링하므로 새 매트릭스가 포인트에 적용되며 회전의 모양을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top