ashen-aetna-ko

잿빛 에트나(Ashen Aetna)

— 재 덮인 화산 위에서 서툴게 비틀거리기

(3D 그래픽스, Rust, Vulkan, ash에 대한 튜토리얼)

동차 좌표계(Homogeneous coordinates)

이전 장에서 우리는 세 개의 성분을 가진 벡터에 값 1을 갖는 성분을 추가하여 네 개의 성분을 가진 벡터로 확장했습니다. 이것은 어찌 됐든 이동(translation)을 선형 변환(linear map)으로 바꾸는 데 도움이 되었고(그리고 저는 이것이 원근 투영과도 관련이 있을 수 있다고 암시했습니다), 우리는 이것이 작동하는지 또는 실제로 무슨 일이 일어나고 있는지 자세히 살펴보지는 않았습니다.

저는 이 과정을 몇 가지 그림으로 설명하고 싶습니다. 우리는 3차원에서 4차원 공간으로 갔는데, 이는 그리거나 따라가기가 어렵습니다. 따라서 대신 1차원에서 2차원 공간으로 가는 경우를 살펴보겠습니다. 네, 한 개의 성분을 가진 벡터, 즉 숫자에서부터 시작하겠습니다.

여기 숫자들이 있습니다:

이들은 “점” 입니다. 이 선을 평면에 포함시켜 봅시다(embed):

이 평면의 원점은 선 바깥 어딘가에 있습니다(굵은 점). 이전에 추가했던 1이 바로 추가 성분이 되도록 원점을 옮겼습니다. 이 새로운 평면에서 두 기저 벡터 의 의미는 다음과 같습니다: 는 한 점에서 다른 점으로 가는 방법을 설명하므로, 선의 방향과 축척(scale)을 나타냅니다. 는 ‘우리 선은 어디에 있는가?’ (더 정확히는: 선 위의 0은 어디에 있는가?)라는 질문에 답합니다.

이제 이동을 어떻게 기술할 수 있는지 알아봅시다. 우리는 모든 숫자(즉, 우리 선 위의 모든 점)를 오른쪽으로 만큼 이동시키려고 합니다.

무슨 일이 일어날까요? 우리 선의 방향이나 축척이 바뀌었나요? 아닙니다. 따라서, 는 그대로 입니다.

이 함수를 행렬(벡터가 두 개의 성분을 가지므로 2x2 크기)로 만들 수 있다면, 이런 형태가 될 것입니다:

는 어떻게 될까요? 음, 우리는 이것을 만큼 이동시키고 싶었습니다. 따라서 가 되어야 합니다. 이렇게 해서 비어있는 부분을 채울 수 있습니다:

이 변환을 시각화해보면, 다음과 같은 그림을 얻게 될 것입니다 (인 경우):

에서

로 변환됩니다. (첫 번째 그림의 모든 점 에 대해, 두 번째 그림에서는 같은 색의 점이 위치에 그려졌습니다.)

이것은 이동(translation)이라기보다는 다음과 같은 결과를 낳았을 것입니다:

— 이것은 오히려 층밀림 변환(shearing)에 가깝습니다.

하지만, 관심 있는 단일 선(그림의 노란색 선)에 국한해서 보면, 이동과 동일하게 작동합니다. (그리고 이 선 위의 모든 이동은 평면의 층밀림 변환으로 확장될 수 있으며, 층밀림 변환은 선형이라는 점에 주목해야 합니다. 이것이 우리가 이동을 선형 함수로 변환한 방법입니다.)

하지만 운 좋은 우리 선 바깥의 점들은 이동과 층밀림의 차이를 느끼게 됩니다. (그림: 원본(회색), 층밀림(파란색), 이동(보라색))

또는 한 좌표계에 점들을 모두 표시하면 다음과 같습니다:

(파란색과 보라색) 원들은 서로 겹치지만, 십자 표시는 다릅니다.

로 이동하는 동안, 가 아닌) 에 위치하게 되었습니다. 이것을 해석할 방법이 있을까요? 음, 한번 살펴봅시다 (층밀림의 결과만):

실제로, 변환되기 전 두 점(즉, 빨간 점들)은 (원점을 지나는) 하나의 직선 위에 놓여 있었고, 변환 후에도 두 점(즉, 이제 파란 점들)은 (원점을 지나는) 같은 직선 위에 놓여 있는 것처럼 보입니다:

(이것은 우연이 아닙니다. 만약 이면, 입니다. 즉, 모든 선형 변환 A에 대해, 가 서로의 스칼라배이면 그 변환 결과인 의 변환과 의 변환도 서로의 스칼라배가 됩니다.)

이제, 우리는 두 빨간 점(또는 빨간 선 위의 다른 점들)을 구별해서는 안 된다고 주장할 수 있습니다: 위쪽 점을 선택한 것이 매우 임의적인 선택 아니었나요? 대신 아래쪽 선(아래쪽 빨간 점과 파란 점이 있는)을 숫자의 표현으로 삼을 수도 있었습니다.

그래도 우리 변환과는 잘 맞습니다: 빨간 점을 파란 점에 대응시킨다고 주장하든, 빨간 선을 파란 선에 대응시킨다고 주장하든, 실제로는 다르지 않습니다.

공식적으로 선언합시다: 이제부터 원점을 지나는 같은 직선 위에 있는 모든 점(원점 제외)은 동일한 것으로 간주합니다. 이것이 좌표에서 무엇을 의미할까요? 가 같은 직선 위에 있을 때, 즉 가 존재하여 다음을 만족할 때 “동일하다”고 말합니다.

또는, 에 대해: 이고, 이는 일 때 성립합니다. 따라서: 또는:

(13장에서 두 점

	    gl_Position = vec4(0.8,0.4,0.0,2.0);

	    gl_Position = vec4(0.4,0.2,0.0,1.0);

이 일치했던 것을 기억하시나요? 이것이 바로 같은 원리입니다!)

실제로 한 직선 위의 모든 점을 동일시하는 것이 자연스러운 “실세계” 설정이 있습니다: 바로 원근 투영입니다. 여러분의 눈(또는 카메라)이 원점에 있다고 상상해 보세요. 그러면 파란 선 위의 모든 점은 같은 방향에 놓이게 되어 구별할 수 없습니다. (더 정확히 말하면, 그 점들 중 단 하나만 보게 됩니다: 볼 것이 있고 투명한 공기만 있는 것이 아닌, 가장 가까운 점 말이죠.)

이것이 바로 이 좌표계가 이전 장에서 언급한 원근 투영과도 잘 들어맞는 이유입니다. 나중에 언젠가 투영에 대해 다시 다룰 것이므로, 여기서는 더 자세히 들어가지 않겠습니다.

하지만 이제 우리 셰이더의 좌표에 있는 네 번째 성분이 어디에서 왔는지, 그리고 대략적으로 무엇을 의미하는지 알게 되었다고 생각합니다.

이제 우리 셰이더로 돌아갑시다.

계속하기