ashen-aetna-ko

Ashen Aetna

— 잿빛 에트나

— 잿더미 화산 위를 녹슨 채로 비틀거리며

(3D 그래픽스, Rust, Vulkan, ash에 대한/속의/관한/함께하는 튜토리얼)

그다지 선형적이지 않은 (Not so linear)

이동 (Translations)

우리는 방금 선형 변환을 행렬 형태로 얼마나 멋지게 표현할 수 있는지 보았습니다. 문제는, 몇몇 중요한 함수들이 선형이 아니라는 점입니다. 가장 악질적인 녀석은 바로 상수(0이 아닌) 벡터, 예를 들어 만큼 이동(translation)시키는 것입니다. 즉,

왜 이것이 선형이 아닐까요? 음, 이전 장에서 정의를 확인해보세요: . 이 조건은 예를 들어 일 때 성립하지 않습니다:

혹은, 훨씬 더 확인하기 쉬운 방법도 있습니다: (여기서 를 줄여 쓴 것이며, 모든 선형 사상은 으로 보낸다는 점을 주목하세요). 이 사상이 선형이 아니라면, 행렬로 표현할 수 없습니다. 하지만 우리는 행렬로 표현하고 싶습니다! (행렬은 잘 알려져 있고 편리하며, 행렬 관련 계산에 사용할 수 있는 크레이트(crates)도 있으니까요…)

어떻게 해야 할까요? 아주 영리한 트릭을 사용합니다. 바로 네 개의 성분을 가진 벡터를 사용하는 것입니다. (물론 짐작하셨을 겁니다. 결국, 우리를 지금의 옆길로 새게 만든 것이 바로 그 미스터리한 네 번째 성분이었으니까요.) 벡터 공간을 소개할 때 사용했던 세 개의 숫자 묶음(triplets)처럼 네 개의 숫자 묶음(quadruplets)도 잘 작동하며, 3x3 대신 4x4 크기의 행렬로 쉽게 다룰 수 있습니다. 그리고 모든 벡터 를 다음과 같이 표현합니다.

네, 마지막 성분은 항상 입니다.

(참고: 이 모든 벡터들의 집합, 은 벡터 공간이 아닙니다 (두 원소를 더하면 마지막 성분이 1이 아니게 되어 집합을 벗어나기 때문입니다). 하지만 그건 문제가 되지 않습니다. 이 집합은 의 부분집합이고, 은 벡터 공간이 맞기 때문입니다.)

모든 3x3 행렬은 4x4 행렬로 볼 수 있습니다.

예를 들어, 가 있다고 합시다. 그렇다면 4x4 행렬은 이고, 이는 다음을 줄여 쓴 것입니다:

이 행렬에 벡터 , 즉 를 곱하면 무슨 일이 일어나는지 확인해 봅시다:

정말로, 3차원 공간에서 를 계산한 결과에 해당하는 4성분 벡터를 얻었습니다.

다시 말해, 우리는 아무것도 잃지 않았습니다. 뭔가 나아진 게 있을까요?

오! 다음을 한번 보시죠:

이것이야말로 이 장의 시작 부분에서 행렬이 아니라고 했던 바로 그 이동을 정확히 설명하는 행렬입니다!

짐작하시겠지만, 비디오 게임 등에서 3D 모델을 다른 위치로 옮기는 것과 같은 이동 작업은 결코 중요하지 않다고 할 수 없습니다. 그러니 이건 정말 멋진 일이고, 우리는 3x3 행렬보다 4x4 행렬을 더 좋아하기 시작해야 하며, 세 개의 좌표를 가진 점을 네 개의 좌표로 써야 합니다. 마지막 좌표는 1로요.

이것이 왜 작동하는지는 위 설명만으로는 명확하지 않습니다. 지금으로서는 그냥 영리한 속임수일 뿐입니다. 다음 장에서 이를 더 자세히 다룰 것입니다. 우선, 다른 “항상 선형적이지는 않은” 사상들을 살펴봅시다.

투영 (Projections)

무언가를 그릴 때 깊이감이 느껴지도록 하려면, 이미지 “안으로” 들어가는 모든 선들이 서로 가까워지다가 수평선 위의 어떤 “소실점(vanishing point)”으로 수렴하는 원근 투영법을 사용할 수 있습니다. 사진 이미지에서도 비슷한 효과를 볼 수 있습니다. 기찻길 이미지 (위키피디아에 감사드립니다). 저 기찻길이 보이시나요? 철로의 양쪽 경계가 이미지 “안으로” 들어갈수록 어떻게 더 가까워지는지 보이시나요?

여기에도 문제가 있습니다. 왜 그런지 알아보기 위해, 평행선에 대해 이야기해야 합니다.

어떤 점 를 지나고 방향 (벡터) 를 갖는 직선은 의 배수를 더해서 도달할 수 있는 모든 점들의 집합입니다. 기호로는 다음과 같습니다.

또는 더 짧게는 입니다. 이 표현은 유일하지 않다는 점에 유의하세요. 같은 직선을 다른 방식으로 표현할 수 있습니다. 예를 들어, 라고 두면, 가 다르고 가 다르더라도 가 성립합니다. 이 주장은 라는 것이 아니라, 모든 수 에 대해 를 만족하는 수 를 찾을 수 있고, 그 반대도 마찬가지라는(모든 에 대해 해당하는 가 있다는) 것입니다. 그리고 실제로 그렇습니다. (직접 해보세요. 아마 라는 결과를 얻게 될 겁니다.)

두 직선은 같은 방향을 가질 때 평행하다고 합니다. 다시 말하지만, 이는 라는 의미가 아니라( 형태로 직선이 표현된 경우),

를 의미합니다. 결국 “의 배수”라는 것으로 귀결됩니다. 따라서 두 직선은 형태로 쓸 수 있을 때 (그리고 오직 그럴 때만) 평행합니다. 이때 는 다를 수 있지만, 는 동일합니다.

이제 선형 변환(예: )이 평행선()에 어떤 작용을 하는지 살펴봅시다. 선형성에 의해,

즉, 가 됩니다. 같은 방식으로, 입니다. 이 결과들의 방향 벡터인 를 비교해 보면, 우리는 다음을 알 수 있습니다: 선형 사상으로 평행선을 변환하면 그 결과 역시 평행선이 됩니다.

사진으로 돌아가 봅시다. 현실에서는 분명히 평행했던 선들이 사진 속에서는 명백히 평행하지 않은 선으로 바뀌었습니다. (대략 왼쪽 아래 모서리에서 어떤 점으로, 그리고 오른쪽 아래 모서리에서 같은 점으로 향하는 선들. 이들은 같은 방향을 갖지 않습니다.)

이는 곧 현실을 사진으로 바꾸는 데 사용된 변환이 무엇이든, 그것은 선형 사상이 아니었다는 의미입니다. 참 안타까운 일이죠. 카메라와 같은 방식으로 사진을 찍는 것은 가상 세계의 장면을 화면 속 이미지로 바꾸는 데 꽤나 현실적인 방법이 될 것 같았는데 말입니다.

투영법에 너무 불공평하게 굴지는 맙시다. 선형인 투영도 있습니다. 예를 들어, 를 단순히 세 번째 성분을 무시하여 점 로 바꾸는 투영이 그렇습니다. (이것이 우리가 마지막으로 그래픽스를 다루고 이론만 파고들지 않았을 때, 우리의 “상자 같은” 화면 속 점들을 스크린 위의 점으로 해석했던 방식입니다.)

하지만 카메라의 원근 투영은요? 아뇨, 그렇지 않습니다. 다행히도, 이 문제를 해결하기 위해 새로운 트릭까지는 필요하지 않습니다.

이제 이 기적적인 추가 성분으로 대체 무슨 일이 벌어지고 있는지 더 잘 이해해 보도록 합시다.

계속