macOS에서 OpenGL 프로그래밍 (3-6. GLKit 프로젝션 행렬 사용 (왼손 좌표계 → 오른손 좌표계))

macOS에서 OpenGL 프로그래밍의 목차로 돌아가기

소개



지난번은 프로젝션 행렬을 직접 계산하는 방법을 설명했습니다. 물론 이렇게 자전으로 준비한 행렬을 사용해도 좋지만, 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. 뷰 행렬로 카메라 이동)

좋은 웹페이지 즐겨찾기