에서 이 질문에 행렬 곱셈과 위치를 수정하는 간단대로 네 요소의 위치 벡터를 원하는 것이 나타납니다.
자체적으로 이것은 4D 요소가 3D 포인트 (변형이 없다고 가정)의 표현으로 고려할 때 단순히 무시해야 함을 암시하지만 GPU에 vector4를 제공 할 때와 같이 이것이 사실이 아니라는 것을 알고 있습니다. 요소는 하나가 아니며 렌더링되지 않습니다. 왜 그렇습니까?
네 번째 요소가 래스터 라이저에 있으면 네 번째 요소의 중요성은 무엇입니까?
편집 : 검토 시이 질문은 다소 잘못 표현되었습니다. 두 번째 단락에서 “네 번째 요소의 값이 특정 범위 내에 있지 않으면 ‘정확하게’/ ‘예상 한대로’렌더링되지 않습니다”라고 말하는 것이 더 정확합니다.
답변
네 번째 구성 요소는 투시 투영을 추적하는 트릭입니다. 원근 투영을 수행 할 때 z : x ‘= x / z, y’= y / z로 나누려고하지만 x의 벡터에서 작동하는 3×3 행렬로 구현할 수있는 작업이 아닙니다. y, z. 이를 위해 표준이 된 트릭은 네 번째 좌표 w를 추가하고 모든 변환이 적용된 후 및 래스터 화 전에 x, y, z가 항상 w로 나눌 것이라고 선언하는 것입니다.
그런 다음 z를 w로 이동하는 행렬을 사용하여 원근 투영을 수행하므로 결국 z로 나눕니다. 그러나 나누기를 원하지 않으면 w = 1.0을 유지하는 유연성도 제공합니다. 예를 들어 평행 투영 또는 회전 등을 원할 경우.
위치를 w = 1로 인코딩하고, 방향을 w = 0으로 인코딩하고 변환에 행렬의 네 번째 행 / 열을 사용하는 것은 좋은 이점이지만 w를 추가하는 주된 이유는 아닙니다. 아핀 변환 (3×3 행렬 + 3 성분 번역 벡터)을 사용하여 눈에 띄지 않고 번역을 수행 할 수 있습니다. (위치와 방향을 추적하고 각각에 다른 변형 함수를 적용해야합니다. 이는 다소 불편하지만 실제로는 큰 문제가 아닙니다.)
(BTW, 수학적으로 w로 증대 된 벡터는 동종 좌표 라고하며 투영 공간 이라는 곳에 살고 있지만 3D 그래픽을 수행하기 위해 더 높은 수학을 이해할 필요는 없습니다.
답변
Natan에 대한 적절한 의견에 대답하기 위해 Affine Space의 벡터를 사용하여 표준 유클리드 공간에서 3D 벡터를 나타낼 때 실제로 어떤 일이 발생하는지 이해하는 데 도움이되는 몇 가지 고려 사항이 있습니다.
먼저 좌표가있는 벡터를 벡터 라고 부를 것이므로 점과 벡터는 같은 개체입니다. 두 점의 차이로 벡터를 볼 수 있습니다. V = B – A ; A + V = A + B – A = B 이므로 V 는 A 에서 B 로 이동
합니다. 넣어 = 0 (원점) 및 당신은 얻을 것이다 V = B – 0 = B : 점 B 와 벡터 것을 이동 0에 B는 같은 일이다.
아핀 공간의 벡터가 w = 0 인 경우 대부분의 3D 라이브러리에서 사용되는 의미에서 “벡터” 를 호출 합니다.
이 행렬은 소형 / 우아한 / 효율적인 형태로 선형 함수를 나타낼 수 있기 때문에 사용되지만 선형 함수는 원점을 변환 할 수없는 주요 단점이 있습니다. F ( 선형)를 원할 경우 F ( 0 ) = 0 F (λ X ) = λF ( X ) 및 F ( A + B ) = F ( A ) + F ( B ) 와 같은 다른 것들
이것은 0 벡터를 절대로 이동시키지 않기 때문에 변환을 수행하는 행렬을 구성 할 수 없음을 의미합니다 . 여기 Affine Space가 있습니다. 아핀 공간은 유클리드 공간에 치수를 추가하여 스케일링과 회전으로 traslantion을 수행 할 수 있습니다.
Affine Space는 Affine과 Euclidean 벡터 간의 등가 관계를 구성하여 (포인 및 벡터와 마찬가지로) 혼동 할 수 있다는 점에서 투영 공간입니다. 동일한 방향으로 원점으로 투영되는 모든 아핀 벡터는 동일한 유클리드 벡터로 볼 수 있습니다.
이것은 좌표에서 비율이 같은 모든 벡터가 동등한 것으로 간주 될 수 있음을 의미합니다.
수학적으로 :
즉, 모든 아핀 벡터는 w = 1 인 캐논 버전으로 축소 될 수 있습니다 (모든 등가 벡터 중에서 가장 선호하는 것을 선택합니다).
시각적으로 (2D 유클리드-3D 아핀) :
그러므로 “투사” 공간 의 평균 ; 여기서 유클리드 공간은 2D (청록색 영역)입니다.
(하이퍼) 평면 w = 0에있는 정식 버전으로 쉽게 넣을 수없는 특정 아핀 벡터 집합이 있습니다.
시각적으로 보여줄 수 있습니다 :
당신이보아야 할 것은 w-> 0 인 동안 유클리드 공간으로 투영 된 벡터는 무한대로 가지만 특정 방향으로 무한대로 간다는 것 입니다.
이제 유클리드 공간에서 합 벡터를 투영 벡터로 간주 할 때 투영 공간에 두 개의 벡터를 더하면 문제가 발생할 수 있음을 알 수 있습니다. 이것은 아핀 공간에서 W 성분을 합한 다음에 투영하기 때문에 추가됩니다. 유클리드 (하이퍼) 비행기.
이것이 바로 “벡터”가 “포인트”의 w 좌표를 변경하지 않기 때문에 “포인트”만을 “벡터”로 합칠 수있는 이유입니다. 이는 w = 1 인 “포인트”에 대해서만 적용됩니다 .
초록색 점은 청록색 “점” 과 V “벡터” 를 나타내는 두 개의 아핀 벡터를 추가하여 얻은 점 이지만 , 캐논과 다른 형태의 모든 아핀 벡터에 V 를 적용 하면 잘못된 결과 (빨간색 “”포인트 “”).
당신은 볼 아핀 공간을 투명하게 사용할 수 없습니다 유클리드 공간에서 작동하고 설명하는 용어 “벡터”의 오용을 계산 금액의 (엄격한) 제약에서 의미가 만 에 캐논 투영 벡터를 .
실제로 GPU가 Vector4 가 w = 0 또는 w = 1 이어야 한다고 가정하는 것은 합리적 입니다.
답변
(x, y, z, w)와 같은 벡터를 가정하십시오. 이 벡터에는 4 개의 구성 요소 x (x 공간의 x 좌표), y (y 공간의 y 좌표), z (z 공간의 z 좌표) 및 흥미롭고 신비로운 w 구성 요소가 있습니다. 실제로 대부분의 3D 게임은 4D 공간에서 작동하며 4D 균질 공간이라고도합니다. 그것의 명백한 이점이 있습니다->
1> 그것은 변환과 회전의 행렬을 하나로 결합시키는 데 도움이됩니다. 그러나 당신은 그것을 사용하는 것이 무엇인지 생각하고 번역과 회전 행렬을 곱할 수 있다고 생각할 것입니다. 그러나 그것은 더 이상 없습니다. 모든 벡터의 w 구성 요소 다음 3d 벡터 (xyz)를 변환 및 회전의 결합 된 행렬에 곱하면 x, y 또는 z로 값을 스케일링 할 것입니다 (매트릭스 곱셈이 작동하는 방식). 스케일링으로 인해 위치 행렬 (결합 된 행렬의 변환 부분)이 손상되었을 수 있습니다.이 문제를 해결하기 위해 4 번째 성분 벡터가 도입되고이 벡터 성분 (w)은 99 %의 경우 1.0 값을 보유하게됩니다. 스케일링되지 않은 위치 값 (번역)을 갖습니다.
[x y z w] [rx1 rx2 rx3 1]
[ry1 ry2 ry3 1]
[rz1 rz2 rz3 1]
[px py pz 1]
간단하면서도 강력한 행렬이 있습니다. 🙂
2> 투시 투영 단계에서 z 값을 w 구성 요소에 복사하고 x, y를 나누면 객체가 화면에서 멀어 질수록 짧아집니다.