문제

나는 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로 돌리기 위해 자르기 만하면됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top