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


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 이므로 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 이어야 한다고 가정하는 것은 합리적 입니다.


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