문제
나는 3D 렌더링에 대해 배우기 시작했고 좋은 진전을 이루고 있습니다. 나는 매트릭스와 그에 대해 수행 할 수있는 일반 작업에 대해 많은 것을 선택했습니다.
내가 아직 따르지 않는 한 가지는 OpenGL의 행렬 사용입니다. 나는 이것 (그리고 그와 같은 것들)을 많이 본다 :
x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
그래서 나의 가장 좋은 이해는 그것이 정규화 된 (크기 없음) 4 차원, 열기 매트릭스라는 것입니다. 또한이 행렬은 특히 "Identity Matrix"라고합니다.
몇 가지 질문 :
- "Nth"차원은 무엇입니까?
- 언제 어떻게 적용됩니까?
나의 가장 큰 혼란은 OpenGL이 이런 종류의 데이터를 어떻게 사용하는지에서 비롯됩니다.
해결책
시작하는 데 도움이 될 수있는 짧은 대답은 'Nth'차원이 부르는 것처럼 시각화 가능한 수량을 나타내지 않는다는 것입니다. 번역 및 원근 투영을 유발하는 매트릭스 곱셈을 가능하게하는 실용적인 도구로 추가됩니다. 직관적 인 3x3 매트릭스는 그런 일을 할 수 없습니다.
공간의 지점을 나타내는 3D 값은 항상이 트릭을 만들기 위해 네 번째 값으로 1을 추가합니다. 방향을 나타내는 3D 값 (즉, 해당 용어에 익숙한 경우 정상)은 네 번째 지점에 0이 추가됩니다.
다른 팁
대부분의 3D 그래픽에서 포인트 A 점은 4 성분 벡터 (X, Y, Z, W)로 표시되며, 여기서 W = 1. 지점에 적용되는 일반적인 작업에는 번역, 스케일링, 회전, 반사, 왜곡 및 이들의 조합이 포함됩니다.
이러한 변환은 "매트릭스"라는 수학적 객체로 표시 될 수 있습니다. 매트릭스는 다음과 같은 벡터에 적용됩니다.
[ a b c tx ] [ x ] [ a*x + b*y + c*z + tx*w ]
| d e f ty | | y | = | d*x + e*y + f*z + ty*w |
| g h i tz | | z | | g*x + h*y + i*z + tz*w |
[ p q r s ] [ w ] [ p*x + q*y + r*z + s*w ]
예를 들어, 스케일링은 다음으로 표시됩니다
[ 2 . . . ] [ x ] [ 2x ]
| . 2 . . | | y | = | 2y |
| . . 2 . | | z | | 2z |
[ . . . 1 ] [ 1 ] [ 1 ]
그리고 번역
[ 1 . . dx ] [ x ] [ x + dx ]
| . 1 . dy | | y | = | y + dy |
| . . 1 dz | | z | | z + dz |
[ . . . 1 ] [ 1 ] [ 1 ]
4 번째 구성 요소의 이유 중 하나는 행렬로 변환을 표현할 수있는 것입니다.
행렬을 사용하는 장점은 다중 변환이 행렬 곱셈을 통해 하나로 결합 될 수 있다는 것입니다.
이제 목적이 단순히 테이블에 번역을 가져 오는 것이라면 (x, y, z, 1) (x, y, z, w) 대신 매트릭스의 마지막 행을 항상 만듭니다. [0 0 0 1]
, 일반적으로 2D 그래픽에서 수행 된대로. 실제로, 4 성분 벡터는이 공식을 통해 일반 3 벡터 벡터에 다시 매핑됩니다.
[ x(3D) ] [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ] [ z / w ]
이것은 ... 불리운다 균질 한 좌표. 이것을 허용하면 관점 프로젝션을 매트릭스로도 표현할 수 있습니다. 다른 모든 변환과 다시 결합 할 수 있습니다.
예를 들어, 화면에서 더 멀리 떨어진 객체가 더 작아야하므로 3D 좌표를 공식을 사용하여 2D로 변환합니다.
x(2D) = x(3D) / (10 * z(3D))
y(2D) = y(3D) / (10 * z(3D))
이제 투영 행렬을 적용하면
[ 1 . . . ] [ x ] [ x ]
| . 1 . . | | y | = | y |
| . . 1 . | | z | | z |
[ . . 10 . ] [ 1 ] [ 10*z ]
그러면 실제 3D 좌표가 될 것입니다
x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1
따라서 우리는 z 좌표를 2D로 돌리기 위해 자르기 만하면됩니다.