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.)
지금까지의 기사에서는, 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.)
program->Use();
GLKMatrix4 mat = GLKMatrix4MakePerspective(
GLKMathDegreesToRadians(60.0f), 640.0f / 480.0f, 1.0f, 50.0f);
program->SetUniform("mat", mat);
이번에는 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.)