그래픽 카드는 벡터의 네 번째 요소를 최종 위치로 어떤 역할을합니까?


25

에서 이 질문에 행렬 곱셈과 위치를 수정하는 간단대로 네 요소의 위치 벡터를 원하는 것이 나타납니다.

자체적으로 이것은 4D 요소가 3D 포인트 (변형이 없다고 가정)의 표현으로 고려할 때 단순히 무시해야 함을 암시하지만 GPU에 vector4를 제공 할 때와 같이 이것이 사실이 아니라는 것을 알고 있습니다. 요소는 하나가 아니며 렌더링되지 않습니다. 왜 그렇습니까?

네 번째 요소가 래스터 라이저에 있으면 네 번째 요소의 중요성은 무엇입니까?

편집 : 검토 시이 질문은 다소 잘못 표현되었습니다. 두 번째 단락에서 "네 번째 요소의 값이 특정 범위 내에 있지 않으면 '정확하게'/ '예상 한대로'렌더링되지 않습니다"라고 말하는 것이 더 정확합니다.


좌표 (x, y, z, 0.5)를 가진 vector4가 좌표 (2x, 2y, 2z, 1)를 가진 vector4와 동일한 결과를 제공하지 않습니까?
FxIII

@ FxIII, 나는 그것을 정확하게 재현 할 수 없었지만 더 많은 실험을 한 후에 원래 게시물에 작성된 잘못된 담요 진술이었습니다.
sebf

답변:


23

네 번째 구성 요소는 투시 투영을 추적하는 트릭입니다. 원근 투영을 수행 할 때 z : x '= x / z, y'= y / z로 나누려고하지만 x의 벡터에서 작동하는 3x3 행렬로 구현할 수있는 작업이 아닙니다. y, z. 이를 위해 표준이 된 트릭은 네 번째 좌표 w를 추가하고 모든 변환이 적용된 후 및 래스터 화 전에 x, y, z가 항상 w로 나눌 것이라고 선언하는 것입니다.

그런 다음 z를 w로 이동하는 행렬을 사용하여 원근 투영을 수행하므로 결국 z로 나눕니다. 그러나 나누기를 원하지 않으면 w = 1.0을 유지하는 유연성도 제공합니다. 예를 들어 평행 투영 또는 회전 등을 원할 경우.

위치를 w = 1로 인코딩하고, 방향을 w = 0으로 인코딩하고 변환에 행렬의 네 번째 행 / 열을 사용하는 것은 좋은 이점이지만 w를 추가하는 주된 이유는 아닙니다. 아핀 변환 (3x3 행렬 + 3 성분 번역 벡터)을 사용하여 눈에 띄지 않고 번역을 수행 할 수 있습니다. (위치와 방향을 추적하고 각각에 다른 변형 함수를 적용해야합니다. 이는 다소 불편하지만 실제로는 큰 문제가 아닙니다.)

(BTW, 수학적으로 w로 증대 된 벡터는 동종 좌표 라고하며 투영 공간 이라는 곳에 살고 있지만 3D 그래픽을 수행하기 위해 더 높은 수학을 이해할 필요는 없습니다.


점과 벡터 사이에 동형이 있기 때문에 벡터와 점에 대해 이야기하는 것은 다시 한 번 부정확합니다 (점과 원점을 그 점으로 이동시키는 벡터는 동일 엔티티입니다). 점 / 벡터 (w! = 0) 및 (투사) 방향 (w = 0)에 대해 이야기하는 것이 더 정확합니다. 어쨌든 "벡터"라는 용어의 오용은 3d 라이브러리 언어에서 상당히 통합 된 표준입니다.
FxIII

@FxIII : 수정되었습니다. 표준 수학 의미에서 "벡터"를 사용하고 같은 게시물에서 "방향"의 동의어로 사용하는 것은 혼란 스러웠습니다.
Nicol Bolas

@ FxIII와 Nicol Bolas : 동의하지 않습니다. 방향을 나타내는 벡터와 길이가 중요한 실제 벡터를 포함하여 벡터 를 w = 0으로 인코딩 합니다. 예를 들어, 객체 행렬을 사용하여 로컬 공간과 월드 공간 사이에서 객체의 각속도 벡터 (방향 = 회전축, 길이 = 속도)를 변환 할 수 있습니다. 각속도가 객체의 변환을 추가하는 것을 원하지 않습니다. 당신은 그것을 회전하고 싶어합니다. 그래서 당신은 w = 0으로 설정합니다. 문제가 보이지 않습니까?
Nathan Reed

@NathanReed 나는 내 게시물이 요점을 명확히하는 데 도움이되기를 바랍니다. 어쨌든 요점의 대부분은 정의와 표준 벡터의 오용에 표준 3D 라이브러리 용어에 대한 선형 대수의 우선 순위에 있습니다. 물론 모든 정의와 우선 순위 주장은 다음과 같이 논쟁의 여지가 있습니다.
FxIII

@Nathan, 이제 네 번째 요소의 목적과 그것이 포함 된 정보가 래스터 라이저에 의해 어떻게 사용되는지 분명히 알 수 있습니다. 고마워요!
sebf

10

Natan에 대한 적절한 의견에 대답하기 위해 Affine Space의 벡터를 사용하여 표준 유클리드 공간에서 3D 벡터를 나타낼 때 실제로 어떤 일이 발생하는지 이해하는 데 도움이되는 몇 가지 고려 사항이 있습니다.

먼저 좌표가있는 벡터를 벡터 라고 부를 것이므로 점과 벡터는 같은 개체입니다. 두 점의 차이로 벡터를 볼 수 있습니다. V = B - A ; A + V = A + B - A = B 이므로 VA 에서 B 로 이동 합니다. 넣어 = 0 (원점) 및 당신은 얻을 것이다 V = B - 0 = B : 점 B 와 벡터 것을 이동 0B는 같은 일이다.

아핀 공간의 벡터가 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 이어야 한다고 가정하는 것은 합리적 입니다.


네 번째 구성 요소의 관계가 사용되는 방식과 필요한 이유를 이해하는 데 도움이되었으므로이 질문에 대한 답을 하나 선택하기가 매우 어려웠습니다. 유클리드와 아핀 공간에 대한 당신의 설명은 매우 도움이됩니다. 나는 그 세부 수준이 없이는 지금 그것을 이해하지 못했을 것입니다. 대단히 감사합니다!
sebf

투영 공간에 대한 설명과 다이어그램을 보려면 +1하십시오. 그러나 아핀 공간과 투영 공간은 동일하지 않습니다 (아 피칸 공간 의 위키피디아 정의 참조 ). 아마도 이것을 말하기에 좋은 방법은 : 투영 3 공간과 아핀 3 공간을 모두 R ^ 4에 포함시킬 수 있지만 삽입이 완전히 자음이되는 것은 아닙니다. 아핀 공간에서 벡터를 w = 0으로 인코딩하는 것이 가능하고 유용하지만, 투영 관점에서는 의미가 없습니다. 마찬가지로, 투사 방향 (무한 점)은 적절한 관점에서 의미가 없습니다.
Nathan Reed

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를 나누면 객체가 화면에서 멀어 질수록 짧아집니다.


고맙습니다! 3D 공간에서 실체를 실제로 유용하게 표현할 때 네 번째 구성 요소를 사용해야 할 필요성이 점점 더 커지고 있습니다.
sebf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.