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 초기화. 그게 전부 야.
누군가 내가 여기에 오해를 설명 할 수 있습니까?
OpenGL에서, 관례는 객체를 원점에서 회전시킨 다음 이동해야하는 곳으로 객체를 변환하는 것입니다. 이것은 기본적으로 '로컬 좌표'회전을 시뮬레이트합니다. 이 모든 것이 스택에서 발생하므로 순서가 중요하다는 것을 기억하십시오! 이 코드는 객체의 로컬 축을 중심으로 두 번의 회전을 수행 한 다음이를 변환 한 다음 두 번 더 회전하고 변환 (효과적으로 월드 좌표를 변형)합니다. – fjlksahfob