- 2022.06.21 과제2022년 06월 22일
- 디지털 블리자드
- 작성자
- 2022.06.22.:25
과제 Space(matrix) , view , projection , ndc (clip) , viewport 에 대해서 정리하세요.
World Space?
각 오브젝트의 공간을 ObjectSpace, LocalSpace, ModelSpace 등으로 부릅니다.
오브젝트들의 각자의 0,0,0이 의미하는 지점이 다릅니다.
그렇기 때문에 world좌표라는 기준을 통해 우리가 컨트롤할 수 있는 실세계로 대려와야합니다.
여기서 실세계로 대려와야한다는 말은, 각 오브젝트의위치를 같은 월드좌표계에 위치시킴으로써 월드좌표로 각 오브젝트의 위치설명할 수 있게되는 과정을 말합니다.
그래서 우리는 각 오브젝트의 로컬좌표에 worldMatrix값을 곱해줌으로써 각 오브젝트들의 위치를 우리 세계(월드공간)로 표현할 수 있게됩니다.
이 과정을 통해 일단 오브젝트들의 위치를 x,y,z로 설명할 수 있게 됩니다.NDC(Noramlize Device Coordinate)(clip space)란?
정규 좌표계라고 부릅니다.
정규화 된 좌표계로 모니터의 액정에 화면을 출력하게됩니다.
따라서 결국 사용자가 보는 화면은 2D인 2차원입니다.
프로그램의 공간이 3D여도 결국 랜더링을 통해 2D로 변환 되는데, 이러한 변환을 투영이라합니다.
위 그림과 같이 투영 변환을 통해 보는 화면에서는 View Plane(뷰 평면)이라 되어있고 실제 사용자가 보는 화면이라 생각하면 됩니다.
그렇게 3D 물체가 투영 변환을 통해 2D 공간에 변환 되면서 가지는 좌표계를 NDC라고 한다.출처 - https://lalyns.tistory.com/14 위 그림에서는 NDC의 범위는 -1 ~ 1로 되어있는데 이 범위는 OpenGL에서 범위이며 DirectX에서는 범위가 -1~1입니다.
OpenGL에서는 왼손 좌표계를 사용하고, DirectX에서는 오른손 좌표계를 사용합니다.
사용하는 좌표계의 따라 NDC 공간으로 변환하는 투영 행렬이 달라지게 됩니다.View Space(matrix) 란?
카메라가 세상의 중심인 공간을 표현합니다.
카메라 기준으로 World를 바라본 공간을 의미합니다.카메라 좌표와 카메라 회전값을 포함하는 메트릭스입니다.
실제로 카메라를 이동시키는것이 아닌 월드 좌표들을 카메라쪽으로 당겨옵니다.
그리고 카메라를 회전시키는 것이 아닌 월드 좌표들을 회전시킵니다.모든 월드 좌표들을 카메라 회전값과 카메라 좌표를 반대로 곱해주게 됩니다.
view 행렬은 scale 값이 없고 TR을 곱해주게됩니다.
HLSL에서는 Tanslation X Rotation의 전치행렬을 곱해줘야하기 때문에 전치행렬을 사용하게되면 Rotation^(-T) X Tanslation^(-T)순으로 곱하게됩니다.게임 엔진들은 자체적으로 3D 씬 에디터가 있어서 개발자들이 씬을 바라보면서 카메라를 배치하고 각도를 조절하게 됩니다.
이렇게 카메라에 새로운 트랜스폼을 적용하는 순서는 오일러 회전 값인 Yaw/Roll/Pitch 값들에 의해서 정해집니다.
이를 사용해 뷰 회전 행렬을 만드는 방법은 각 축에 대응하는 회전 행렬들을 연속으로 곱하면 됩니다.
회전 행렬을 만들 때 Roll→Pitch→Yaw 순으로 적용해 회전 행렬을 만들어냅니다. (z->x->y)
전치행렬을 적용하여 수식으로 표현하면 다음과 같습니다. (틀릴수 있습니다..)출처 - https://blog.naver.com/destiny9720/221423054915 여기서 살짝 변경함 projection Space(matrix) 란?
Projection은 투영 과정이라고 합니다.
간단히 말해서 시야각입니다.
2D 에서는 직교투영이지만 3D에서는 원근투영을 사용하기 때문에 시야각을 가집니다.
투영과정은 현재 뷰공간의 정점들을 Clipping Space라는 일종의 정규화된 3차원으로 끌고오는것을 투영이라고 말합니다.
클리핑공간은 X,Y축은 -1~1의 범위를 가지고, Z축은 0~1의 범위를 가집니다.
완전한 원근법을 적용시키기 위해서는 '원근나누기'도 거쳐야하지만 Directx 렌더링파이프라인에서는 나중에 레스터라이즈(RS)단계에서 원근나누기를 실행하게 됩니다.
투영행렬을 곱해줌으로써 생기는 결과는 클리핑공간으로의 변환합니다.
이렇게 정규화된 공간으로 가져올 경우 나중에 레스터라이즈(RS)단계에서 수행할 최적화단계중 하나인 클리핑이 좀 더 수월해지는 장점도 있습니다.출처 - https://maxlevel-trace.tistory.com/19
투영변환은 나중에 w값(변환전의 z값)을 기준으로 x,y를 나눔으로써 완성됩니다.
우리가 사용하는 모니터는 대부분 직사각형입니다.
width가 height보다 더 깁니다.
그러면 정육면체의 큐브를 화면좌표계로 표현 할 시 아래그림과같은 결과가 나오게 됩니다.출처 - https://maxlevel-trace.tistory.com/19
화면의 비율과 맞추려다보니 메쉬가 가로로 더 늘어난것입니다.
그렇기 때문에 화면비율에 맞춰 클리핑공간으로 이동하는 과정에서 메쉬를 조절하는 연산이 추가적으로 필요하게됩니다.
이 모든과정이 투영행렬을 곱하는과정에서 이루어지게됩니다.프로젝션 결과식은 다음과 같습니다.
이미지 출처 - https://maxlevel-trace.tistory.com/19
자세한 내용은 [DirectX11] 3D에서의 WVP변환과정의 티스토리를 참고하시길 바랍니다.
viewport란?
뷰포트는 3D 장면이 프로젝트되는 2D(2차원) 사각형입니다.
3D 장면을 2D NDC 스크린에 출력할 화면의 정보를 담고 있습니다.
뷰포트를 이용하면 1개의 NCD 좌표에 CCTV 화면과 같이 화면을 분할하여 출력할 수 있습니다.
Direct3D에서 사각형은 시스템에서 렌더링 대상으로 사용하는 Direct3D 표면 내의 좌표로 존재합니다.
프로젝션 변형은 꼭짓점을 뷰포트에 사용되는 좌표계로 변환합니다.
뷰포트는 장면이 렌더링될 렌더링 대상 표면의 깊이 값 범위를 지정하는 데에도 사용됩니다.(일반적으로 0.0~1.0 => NDC).
절두체 보기는 뷰포트의 카메라를 기준으로 배치되는 장면의 3D 볼륨입니다.
볼륨의 셰이프는 모델을 카메라 공간에서 장면으로 프로젝션하는 방법에 영향을 미칩니다.
가장 일반적인 프로젝션 유형인 원근 프로젝션은 카메라에 가까운 개체를 멀리 있는 개체보다 더 크게 표시합니다.
원근 보기의 경우 절두체 보기를 피라미드로 시각화하고, 다음 그림과 같이 카메라를 끝에 배치할 수 있습니다.
이 피라미드에서 전면 및 후면 클리핑 평면이 교차합니다.
전면 및 후면 클리핑 평면 사이의 피라미드 내부에 있는 볼륨이 절두체 보기입니다.
개체는 이 볼륨에 있을 때에만 표시됩니다.출처 - https://docs.microsoft.com/ko-kr/windows/win32/direct3d9/viewports-and-clipping 절두체 보기를 시각화한다는 것은 어두운 방에 서서 사각형 창을 통해 내다보는 행동에 비유할 수 있습니다.
이 비유에서 가까운 클리핑 평면은 창이고, 후면 클리핑 평면은 시야를 방해하는 모든 것입니다.
거리의 고층 빌딩이 될 수도 있고, 멀리 있는 산이 될 수도 있고, 전혀 없을 수도 있습니다.
창에서 시작하고 시야를 방해하는 물체에서 끝이 나는 잘린 피라미드 내의 모든 것을 볼 수 있지만, 그 외에는 아무 것도 볼 수 없습니다.
절두체 보기는 fov(시야각)와 전면 및 후면 클리핑 평면의 거리로 정의되며 다음 도식과 같이 z축 좌표로 지정됩니다.출처 - https://docs.microsoft.com/ko-kr/windows/win32/direct3d9/viewports-and-clipping 이 도식에서 변수 D는 카메라에서 기하 도형 파이프라인의 마지막 부분에서 정의된 공간 원점까지의 거리이며 이것이 시야각의 변형입니다.
이 공간을 기준으로 절두체 보기의 제한을 지정합니다.절두체를 간략히 설명하자면 시야를 차단하는 물체들을 절두체라고 표현합니다.
카메라로부터 절두체까지는 볼수 있지만 절두체에 가려진 뒤쪽시야는 볼수가 없습니다.참고문헌
http://rapapa.net/?p=3531
https://lalyns.tistory.com/14
https://ssinyoung.tistory.com/39
https://sonagi87174.tistory.com/26
https://docs.microsoft.com/ko-kr/windows/win32/direct3d9/viewports-and-clipping
https://support.pix4d.com/hc/en-us/articles/202559089-How-are-the-Internal-and-External-Camera-Parameters-defined
https://blog.naver.com/destiny9720/221423054915
http://www.songho.ca/opengl/gl_anglestoaxes.html
http://icecola89.blogspot.com/2016/05/blog-post.html
https://maxlevel-trace.tistory.com/19
https://www.youtube.com/watch?v=z36g-7UYzlQ'과제(숙제)' 카테고리의 다른 글
22.07.12 과제 (0) 2022.07.13 22.06.29 과제 (0) 2022.06.30 2022.06.10 숙제 (0) 2022.06.12 2022.06.08 숙제 (0) 2022.06.09 2022.06.07 숙제 (0) 2022.06.08 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)