macOS에서 OpenGL 프로그래밍 (3-6. GLKit 프로젝션 행렬 사용 (왼손 좌표계 → 오른손 좌표계))
소개
지난번은 프로젝션 행렬을 직접 계산하는 방법을 설명했습니다. 물론 이렇게 자전으로 준비한 행렬을 사용해도 좋지만, macOS에서 이용할 수 있는 GLKit에는, 「macOS에서 OpenGL 프로그래밍 (10. 텍스처 표시)」에서 해설한 텍스처의 로딩 기능에 더해, 프로젝션 행렬등의 자주(잘) 사용하는 행렬을 요구하기 위해 의 함수도 제공됩니다.
이번에는 프로젝션 행렬을 구하기 위한 GLKit의 함수
GLKMatrix4MakePerspective()
를 사용하여 깊이를 표현해 봅시다.덧붙여서,
GLKMatrix4MakePerspective()
와 동등한 함수로서, OpenGL Utility Libraries (GLU) 의 gluPerspective()
함수, OpenGL Mathematics (GLM) 의 glm::perspective()
함수등이 있습니다만, 모두 같은 계산을 해 주기 때문에, 이러한 함수를 채용한다 경우에도 마찬가지입니다.1. Z 좌표의 값을 오른손으로 재작성
지금까지의 기사에서는, GLSL의 클리핑 좌표에 맞추어, 원점(0, 0, 0)에 있는 카메라로부터, Z축의 플러스 방향에 있는 데이터를 묘화하는 것을 전제로 해설해 왔습니다. 즉, 왼손 좌표계에서 데이터를 생각해 온 것입니다.
Game.cpp의 정점 데이터 선언 (Old)
std::vector<VertexData> data;
data.push_back({ { -0.6f, -0.5f, 5.0f }, { 1.0f, 0.4f, 0.7f, 1.0f } });
data.push_back({ { 0.4f, -0.5f, 5.0f }, { 1.0f, 0.4f, 0.7f, 1.0f } });
data.push_back({ { 0.4f, 0.5f, 5.0f }, { 1.0f, 0.4f, 0.7f, 1.0f } });
data.push_back({ { 0.2f, -0.5f, 10.0f }, { 0.0f, 0.75f, 1.0f, 1.0f } });
data.push_back({ { 1.2f, -0.5f, 10.0f }, { 0.0f, 0.75f, 1.0f, 1.0f } });
data.push_back({ { 1.2f, 0.5f, 10.0f }, { 0.0f, 0.75f, 1.0f, 1.0f } });
OpenGL에서 채택된 오른손 좌표계에서는 Z축의 방향이 반대가 됩니다. 그러나 카메라의 방향은 이전과 동일합니다. 즉, 카메라는 Z 축의 마이너스 방향을 향합니다.

그러므로 기본 카메라에 반영되도록 버텍스 데이터를 준비하려면 Z 좌표를 마이너스로 유지해야 합니다. 그래서 다음과 같이 모든 Z 좌표의 값을 마이너스로 변경합니다.
Game.cpp의 정점 데이터 선언 (New)
std::vector<VertexData> data;
data.push_back({ { -0.6f, -0.5f, -5.0f }, { 1.0f, 0.4f, 0.7f, 1.0f } });
data.push_back({ { 0.4f, -0.5f, -5.0f }, { 1.0f, 0.4f, 0.7f, 1.0f } });
data.push_back({ { 0.4f, 0.5f, -5.0f }, { 1.0f, 0.4f, 0.7f, 1.0f } });
data.push_back({ { 0.2f, -0.5f, -10.0f }, { 0.0f, 0.75f, 1.0f, 1.0f } });
data.push_back({ { 1.2f, -0.5f, -10.0f }, { 0.0f, 0.75f, 1.0f, 1.0f } });
data.push_back({ { 1.2f, 0.5f, -10.0f }, { 0.0f, 0.75f, 1.0f, 1.0f } });
덧붙여 좌표계가 바뀌면 X 좌표나 Y 좌표의 값까지 재기록할 필요가 있는 것은? 라고 신경이 쓰여 버립니다만, 위의 좌표계의 그림으로 카메라의 방향이 고정되어 있는 모습을 봐 주시는 것을 알 수 있듯이, 지금까지 z=5라고 말하고 있던 좌표가 z=-5로 불리는 것만으로, 그 이외의 변화는 실은 없습니다. 그러므로, Z 좌표에 마이너스 기호를 붙이는 것만으로, 정점 데이터의 변경은 완료합니다.
2. GLKit 함수 사용
GLSL의 uniform 변수
mat
에 설정된 행렬의 값을 계산하는 코드를 GLKit 함수 GLKMatrix4MakePerspective()
를 사용하도록 다시 작성하십시오. GLKMatrix4MakePerspective()
함수의 첫 번째 인수는 라디안 단위의 화각, 두 번째 인수는 종횡비, 세 번째 인수는 nearZ, 네 번째 인수는 farZ입니다. 화각은 카메라의 상단에서 하단까지의 각도입니다. nearZ와 farZ는 각각 클리핑 영역의 z = -1.0과 z = 1.0에 해당하는 값이었습니다.행렬 생성 및 세트
program->Use();
GLKMatrix4 mat = GLKMatrix4MakePerspective(
GLKMathDegreesToRadians(60.0f), 640.0f / 480.0f, 1.0f, 50.0f);
program->SetUniform("mat", mat);
실행해 보면, 전회와 같은 실행 결과가 되어, 계산대로 묘화 할 수 있는 것을 알 수 있습니다.

여기까지의 프로젝트: MyGL은 _s로 p3-6. 지 p
3. 정리
이번에는 GLKit의
GLKMatrix4MakePerspective()
함수를 사용하여 퍼스펙티브 행렬을 생성하고 오른손 좌표계에서 데이터를 처리하는 방법을 설명했습니다.이제 오른손 좌표계에서 데이터를 처리하는 방법을 이해할 수 있었습니다. 여기에서 GLKit의
GLKMatrix4MakePerspective()
함수를 사용하여 원근법 행렬을 만들고 OpenGL 관례에 따라 오른손 좌표계에서 데이터를 처리합니다.지금까지는 카메라의 위치나 방향은 고정해 OpenGL의 그래픽 묘화를 해설해 왔습니다. 다음에는 뷰 행렬을 사용하여 카메라를 움직여 다양한 위치의 정점 데이터를 그리는 방법을 설명하고 싶습니다.
다음 문서: macOS에서 OpenGL 프로그래밍 (3-7. 뷰 행렬로 카메라 이동)
Reference
이 문제에 관하여(macOS에서 OpenGL 프로그래밍 (3-6. GLKit 프로젝션 행렬 사용 (왼손 좌표계 → 오른손 좌표계))), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sazameki/items/91401f33f72600b5bed5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)