2011-03-04 4 views
0

NEHE 튜토리얼의 lesson 9을 이해하려고했는데, 이는 3D 공간에서 이동하는 비트 맵에 관한 것입니다.OpenGL : 변환 이해

여기에서 가장 흥미로운 점은 3d 공간을 통해 간단한 쿼드에 2d 비트 맵 텍스처를 이동하고 화면 (뷰어)을 계속 유지하는 것입니다. 따라서 비트 맵은 3D로 보이지만 3D 공간에서 어디에 있든지 관계없이 항상 뷰어를 향하고 있습니다.

9 번째 단원에서는 원 안에 움직이는 별 목록이 생성되어 정말 멋지게 보입니다. 별을 보는 것을 피하기 위해 코더는 스타가 항상 뷰어를 향하도록 까다롭게 코딩하고 있습니다. 이것은 이하

코드이다 (다음의 코드는 루프의 각 등급을 요구한다) 위의 줄 이후

glLoadIdentity(); 
glTranslatef(0.0f,0.0f,zoom); 
glRotatef(tilt,1.0f,0.0f,0.0f); 
glRotatef(star[loop].angle,0.0f,1.0f,0.0f); 
glTranslatef(star[loop].dist,0.0f,0.0f); 
glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); 
glRotatef(-tilt,1.0f,0.0f,0.0f); 

, 별의 드로잉이 시작된다. 마지막 두 줄을 확인하면 3 행과 4 행의 변환이 취소 된 것처럼 보입니다. 끝에있는이 두 줄은 항상 스타가 뷰어를 향하게 할 수있는 가능성을 제공합니다. 하지만 왜 이것이 작동하는지 모르겠습니다.

그리고 이것이 OpenGL이 실제로 변환을 어떻게하는지에 대한 오해에서 비롯된 것이라고 생각합니다. 나를 위해 마지막 두 줄은 이전에 수행 한 작업을 실행 취소하는 것과 같습니다. 이는 나에게 의미가 없습니다. 그러나 그것의 작동.

그래서 glTranslatef를 호출하면 뷰의 현재 행렬에 glTranslatef와 함께 제공된 변환 값이 곱해집니다. 즉, "glTranslatef (0.0f, 0.0f, zoom);" 줌이 음수이면 내 별을 그려 넣을 장소를 옮길 것입니다. 승인.

하지만 정확히 무엇이 여기에 옮겨 졌습니까? 뷰어가 "멀리"이동했거나 glTranslatef로 장면으로 이동하는 개체 좌표계가 있습니까? 여기서 뭐하는거야?

다음 glRotatef, 여기에서 회전 한 것은 무엇입니까? 다시 좌표 시스템, 뷰어 자체?

현실 세계. 그 별을 3 차원 공간의 어딘가에 놓은 다음 세계의 세계 공간에서 회전시켜 별이 원점으로 이동하고 가장자리에서 다시 시작하면 움직입니다. 그러면 저는 회전을합니다. 별 자체가 뷰어를 향하게합니다. 그리고 나는 이것이 여기에서 끝났다고 생각한다. 그렇다면 먼저 세계 기원을 중심으로 회전 한 다음 별 주변을 어떻게 회전합니까? 나를 위해 그것은 OpenGL은 세계 coord 시스템과 당신이 보는 것처럼 실제로 일어나는 개체 coord 시스템 사이를 전환하는 것 같습니다.

나머지 코드는 추가하지 않아도됩니다. 3D 그리기, 회전하는 물건, 그리고 블렌딩을 사용한 별 모양의 QUADS의 간단한 그림을위한 간단한 GL 초기화. 그게 전부 야.

누군가 내가 여기에 오해를 설명 할 수 있습니까?

+0

OpenGL에서, 관례는 객체를 원점에서 회전시킨 다음 이동해야하는 곳으로 객체를 변환하는 것입니다. 이것은 기본적으로 '로컬 좌표'회전을 시뮬레이트합니다. 이 모든 것이 스택에서 발생하므로 순서가 중요하다는 것을 기억하십시오! 이 코드는 객체의 로컬 축을 중심으로 두 번의 회전을 수행 한 다음이를 변환 한 다음 두 번 더 회전하고 변환 (효과적으로 월드 좌표를 변형)합니다. – fjlksahfob

답변

4

gl 매트릭스 스택에 대한 또 다른 생각은 그리기 호출에서 뒤로 이동하는 것입니다. 귀하의 경우 무승부가 마지막 행이므로 다음 코드를 단계별로 살펴 보겠습니다.

1) 먼저 별이 원점을 기준으로 X 축을 중심으로 기울기로 회전합니다.

2) 스타는 원점을 기준으로 Y 축을 중심으로 -star [루프]. 각도만큼 회전합니다.

3) 스타는 [루프] .dist 별에 의해 X 축을 따라 이동합니다.

4) 스타는 원점을 기준으로 Y 축을 중심으로 스타 [루프]. 각도로 회전합니다. 별이 3 단계로 인해 더 이상 원점에 있지 않으므로이 회전은 별의 중심을 이동시키고이를 로컬로 회전시킵니다.

5) 별이 원점을 기준으로 X 축을 중심으로 기울어 져 회전합니다. (4와 동일한 메모)

6) 별이 줌 단위로 Z 축 아래로 이동합니다.

여기에있는 속임수는 텍스트로 입력하기는 어렵지만 이동 순서를 시도해보십시오. 2 단계와 4 단계는 서로 반전 된 것처럼 보일 수 있지만, 둘 사이의 이동은 회전의 특성을 변경합니다. 핵심 구절은 회전이 원점 주위에 정의된다는 것입니다. 별을 움직이면 회전의 효과가 바뀝니다.

이렇게하면 무언가를 회전하려는 경우 스태킹 행렬이 일반적으로 사용됩니다. 먼저 원점으로 이동 한 다음 회전시킨 다음 다시 이동합니다. 당신이 여기있는 것은 거의 같은 개념입니다.

두 손을 사용하여 행렬을 시각화하는 것이 유용하다는 것을 알았습니다. 한 손으로 원점을 표현하고 두 번째 손 (보통 OpenGL과 같은 오른 손잡이 좌표계에있는 경우 오른쪽)은 오브젝트를 나타냅니다. XYZ 축과 같은 손가락을 펴서 원점 주변뿐만 아니라 국부적으로 회전을 시각화 할 수 있습니다. 이와 같이 시작하여 원점을 중심으로 회전하는 순서와 선형 이동은 쉽게 묘사 할 수 있어야합니다.

두 번째 질문은 일반적인 OpenGL 설정에서 카메라 행렬이 어떻게 작동하는지에 관한 것입니다. 먼저, 화면 공간 좌표 (마찬가지로, 장치 좌표)의 개념을 이해하십시오. 실제로 표시되는 공간입니다. X와 Y는 화면의 벡터이고, Z는 깊이입니다. 공간은 일반적으로 -1에서 1 범위입니다. 객체를 Z 아래로 움직이면 객체가 효과적으로 이동합니다.

일반적으로 카메라 (또는 원근 행렬)는 '세계'공간을이 화면 공간으로 변환해야합니다. 이 행렬은 '뷰어'를 정의하지만 결국에는 또 다른 행렬입니다. 행렬은 항상 '마지막'으로 적용됩니다. 따라서 앞에서 설명한대로 변환을 위쪽으로 읽는다면 카메라는 보통 맨 위에있는 것처럼 보입니다. 이 경우 마지막 변환 (확대/축소로 변환)을 카메라를 줌 단위로 다시 이동시키는 아주 간단한 카메라 매트릭스로 생각할 수 있습니다.

행운을 비네. :)

+0

좋은 답변입니다. 고마워, 닉. 귀하의 의견에 포인트 4 흥미 롭습니다. 점 3에서 별을 움직이면 회전 동작이 변경되고 별이 로컬로 회전합니다. 그냥 단계를 시각화, 지금 그것이 의미가 있습니다. 예. :-D – NovumCoder

+1

나는 입문 그래픽을 가르치는 데 몇 년을 보냈다. :) 환영합니다. –

1

중간 의 glTranslatef는 회전에 의해 영향 : 그것은 '거리 DIST하고, 축 X'는 x 축 방향 별 이동 원래의 X 축에 비해 (기울기 + 각도)로 회전하는 시간에있을 .

여러분은 투영 행렬 (스택)을 곱한 객체 좌표를가집니다. 그래서 당신은 사물을 움직이고 있습니다."카메라 이동"을 원한다면 카메라 위치와 축의 역행렬을 곱해야합니다 :

ProjectedCoords = CameraMatrix^-1. ObjectMatrix. ObjectCoord

0

나는 또한 매우 혼란 스럽지만, GlTranslatef() 및 glRotatef()에 대한 더 나은 이해를 얻으려면 NeHe 코드 중 일부를 가지고 놀았습니다.

현재 glRotatef()는 실제로 glRotatef (90.0f, 0.0f, 0.0f, 1.0f)가 y 축이 이전에 있던 위치가되도록 좌표계를 회전합니다. 이 회전 후에 glTranslatef (1.0f, 0.0f, 0.0f)는 객체를 화면 위로 이동시킵니다.

따라서 glTranslatef()는 좌표계의 현재 회전에 따라 객체를 이동합니다. 따라서 glTranslatef와 glRotatef의 순서는 튜토리얼 9에서 중요합니다.

기술적 인면에서 내 설명이 완벽하지는 않지만 저에게는 효과적 일 수 있습니다.