행렬은 무엇을 나타 냅니까?


19

최근에 OpenGL을 배우기 시작했으며 컴퓨터 그래픽에서 매트릭스가 무엇인지와 그 역할을 시각화하는 데 문제가 있습니다. 다음과 같이 4x4 행렬의 템플릿이 주어집니다.

여기에 이미지 설명을 입력하십시오

이와 같은 각 행렬은 월드 공간에서 꼭짓점의 좌표라고 가정합니다. 그리고 그중 몇 개가 모여 음영 처리되어 개체를 제공합니까?

그러나 왜 a Xx, a Xy가 Xz있습니까? 나는 그것의 다른 축 (위, 왼쪽, 앞으로)을 읽었지만 여전히 중요성의 머리 나 꼬리를 만들 수는 없습니다.

답변:


19

컴퓨터 그래픽스의 행렬은 모델의 각 좌표에 대한 변환입니다. 각 행렬은 좌표 (3 개의 공간에있는 점)에 적용 할 여러 변형의 조합입니다.

변환 작성은 변환, 회전 및 크기 조정의 세 가지 변환 유형 중 하나를 기반으로합니다.

변환 행렬은 다음과 같습니다.

번역 매트릭스

그리고 스케일 매트릭스 : 스케일 매트릭스

회전 행렬은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

이 행렬 중 하나를 결합하려면 함께 곱하면됩니다. 변환을 정점에 적용하려면 변환 다이어그램에서 볼 수 있듯이 정점에 곱하면됩니다.


4
행렬은 점을 나타내지 않습니다. 난 지금 당황
— 슬픈 CRUD 개발자

많은 시간은 그들은 (당신이 사시도 대 당신 오르 얼마나 그게 전부) 개체 또는 전체 뷰포트에 적용됩니다
— 알렉스 셰퍼드

3
@BDillan : 아니요. 그러나 확실히 포인트를 포함 할 수 있습니다. 예를 들어 ModelView 행렬의 마지막 열 (GL / column-major)은 원점이 어떻게 변환되는지 정의합니다. 또는 이것을 다시 말하면, 세계 공간에서 눈이 어디에 위치하는지 정의하고 문자 그대로 그 자체로 포인트로 사용될 수 있습니다.
— Andon M. Coleman

당신의 좌표 3 튜플. 왜 행렬이 3 곱하기 3이 아닌가? 세 가지 유형의 변환을 단일 행렬로 결합하고 여전히 충분한 공간을 가지고 있다고 가정 해보십시오. 그러면 오른쪽 하단 모서리는 항상 1처럼 보입니다.
— n611x007

네 번째 행 / 열은 번역을 위해 특별히 존재합니다. 행렬 수학의 가장 좋은 특징 중 하나는 달성하려는 모든 변환 및 회전을 단일 행렬로 결합 할 수 있다는 것입니다. 이는 매우 복잡한 변환 집합 (이론적으로 무한)을 1 행렬로 압축 할 수 있음을 의미합니다. 그렇습니다. 마지막 셀은 1로 남아 있지만 나머지 수학을 수행 할 수 있습니다.
— Alex Shepard

10

컴퓨터 그래픽에서는 행렬을 사용하여 변환 을 인코딩 합니다 .

변환, 회전 또는 스케일링 변환 만 포함하는 행렬에는 일반적으로 사용되는 해석이 있습니다. 행렬의 왼쪽 상단 3x3에는 회전 또는 배율 데이터 만 포함되며 맨 아래 행 또는 오른쪽 열에는 번역 데이터가 포함됩니다. 이것은 일반적 이지 는 않지만 사람들이 그것을 사용하는 컴퓨터 그래픽으로 표현 된 변환의 하위 집합에 대해서는 종종 충분합니다.

마찬가지로, 매트릭스 값과 매트릭스가 나타내는 해당 좌표 프레임 사이에는 관계가 있습니다 (항상 "월드 공간"은 아닙니다). 왼쪽 위 3x3 열 (또는 행)은 좌표 프레임의 X, Y 및 Z 축을 나타냅니다.

행이 축을 나타내는 지 또는 열이 나타내는 지의 여부는 row vector * matrix또는 로 곱하는 규칙을 사용하는지 여부에 따라 다릅니다 matrix * column vector. 행렬 곱셈을 수행 할 때 두 행렬의 내부 차원이 일치해야하므로 벡터를 행 행렬 또는 열 행렬로 나타내는 지 여부는 선택에 영향을 미칩니다 (OpenGL 및 기존 수학은 열 벡터를 선호하는 경향이 있음).

선형 대수학에 대한 좋은 책을 얻거나 최소한 매트릭스 및 쿼터니언 FAQ 와 DirectX 및 OpenGL의 매트릭스 레이아웃에 대한이 게시물을 살펴 보는 것이 좋습니다 .


선형 대수학에 관한 많은 "좋은"책을 가지고 있습니다. 문제는 그것이 조금 도움이되지 않는다는 것입니다. 나는 당신의 마지막 조언이 잘못된 가정에 대답하고 있다고 생각합니다.
— n611x007

9

매트릭스 란?

매트릭스와 m열 및 n행 벡터 소비 함수 나타낸다 * 와 m요소 (또는 좌표)와 함께 벡터 생성 n요소.

이를 통해 행렬이 정사각형 인 경우에만 벡터의 차원이 변경되지 않음을 알 수 있습니다. 예 : 3D 벡터 변환, 2D에서 2D 등으로 3D 벡터를 얻습니다.

* : 물리학에서 벡터는 일반적으로 속도 나 가속도와 같은 것들을 "이동"하는 힘이나 다른 "영향"을 나타내는 데 사용됩니다. 그러나 벡터를 사용하여 점 또는 임의의 숫자 배열을 나타내는 것을 막을 수는 없습니다 (일부 라이브러리 및 프로그래밍 언어는 "1"배열을 의미하기 위해 "벡터"를 사용하기도합니다). 행렬과 함께 사용하려면 행렬의 요소에 관계없이 벡터를 더하고 빼고 곱하는 방법이 있다면 벡터의 요소 (문자열 또는 색상조차)가 될 수 있습니다. 따라서 "캐리어"를 의미 하는 이름 벡터 는 값을 전달 하거나 보유 합니다.

행렬을 곱하는 것은 무엇을 의미합니까?

행렬이 함수라면 어떤 종류의 함수 입니까? 기능은 무엇을합니까? 그것을위한 레시피는 행렬의 요소에 의해 정의됩니다. input u, output v, 행렬 M(곱셈 M*u=v은 다음과 동일 f(u)=v)을 호출하고 th 요소를 u(i)제공합니다 (예를 들어 두 번째 요소는 y 좌표입니다). 행렬의 경우 row , column을 의미합니다 .iuM(i,j)ij

v(1)결과의 첫 번째 요소 인 element의 구성 은 행렬의 첫 번째 행으로 설명됩니다. u(1)시간 M(1,1), 더하기 u(2)시간 M(1,2), ... 더하기 u(i)시간 M(1,i). 행렬은 매우 간단한 프로그래밍 언어와 비슷합니다. 입력 주위를 뒤섞거나 자체에 추가하는 등의 기능을 수행하는 프로그래밍 기능에만 적합합니다. **

한 번에 하나의 출력 요소로 작업하고 있으므로 한 번에 한 행의 행렬 만 사용한다고 상상하는 것이 좋습니다. 당신은 u수평으로 씁니다 . 당신은 그 M아래 의 i 번째 줄을 씁니다 . 모든 위 / 아래 쌍을 곱하고 아래에 제품을 작성한 다음 제품을 더합니다. 의 모든 요소를 ​​얻으려면 모든 행에 대해 반복하십시오 v. 이제 mby by n행렬이 m벡터에서 작동하고 벡터를 생성 해야하는 이유를 알 수 있습니다 n.

이것에 대해 생각하는 또 다른 방법-우리가 3D에서 3D로 변환하고 있다고 가정 해 봅시다. 그래서 3x3 매트릭스 (또는 종종 "이 기능"은 척도 할 수 있기 때문에 호출되는 3D 변환 은 실제로는 3D 포인트입니다. 그냥 숫자를 변경). 첫 번째 행이라고 가정 해 봅시다 [1 2 0]. 즉, 결과 x를 얻으려면 입력 x의 1, 입력 y의 2, 입력 z의 0을 가져옵니다. 정말 레시피입니다.

** : 매트릭스가 프로그래밍 언어 인 경우 Turing이 완료되지도 않습니다.

두 행렬을 곱하는 것은 무엇을 의미합니까?

둘 다 적절한 크기의 행렬 이면 " A*B먼저 적용되는 함수" 를 의미 합니다. 크기가 입력 및 출력 크기를 결정하고 한 행렬이 다른 행렬의 출력을 소비하기 때문에 곱하기 크기에 대한 제약 조건이 존재하는 이유를 알 수 있습니다. 곱셈은 ​​왜 결합 함수를 의미합니까? 그것이 있어야한다는 것을 쉽게 알 수 있습니다. 경우 와 동일합니다 및BAA*uf(u)B*u 이다 같은 g(u)후는 f(g(u))것과 동일하다 f(B*u)동일하다 A*(B*u).

마찬가지로, 동일한 기능을 반복적으로 적용하는 경우는 힘으로 표시 할 수 있습니다 . 3 A*A*A을 A나타내는 기능을 적용하는 것을 의미하기 때문 입니다.

행렬은 어떻게 유용합니까?

new_x = 1*x+2*y+0*z(첫 번째 행이 [1 2 0] 인 경우) 와 같은 변환은 무엇입니까 ? 그다지 명확하지는 않지만 다른 2D 매트릭스를 사용하여 설명하겠습니다. 매트릭스는 다음과 같습니다.

[ 0 1
  1 0 ]

또는 [0 1; 1 0]편리한 Matlab 표기법을 사용하십시오. 이 매트릭스는 무엇을합니까? 다음과 같이 2D 벡터를 변환합니다. 결과의 x에 대해 입력 y의 1을 가져옵니다. 결과 y에 대해서는 입력 x의 1을 취합니다. 입력의 x와 y 좌표를 바 꾸었습니다.이 행렬 은 x = y 선에 대한 점을 반영합니다 . 유용합니다! 확장하면 SW - NE 라인을 따라 1이있는 모든 행렬이 반영됩니다. 항등 행렬이 왜 입력을 돌려 주는지 알 수 있습니다 (x 출력의 경우 x 입력, y 입력의 경우 y 입력 ...).

이제 상징이 왜 그런지 알 수 있습니다. Xx, Yx- 그들은 입력의 양을 의미한다 X,Y 출력에 들어가는 등 x.

행렬은 어떻게 더 유용합니까?

다른 어떤 변형을 할 수 있습니까? 단위 행렬을 사용하여 크기를 조정할 수 있지만 대각선을 따라 1과 다른 번호를 사용합니다. 예를 들어 [2.5 0; 0 22.5]입력의 모든 좌표에 2.5를 곱하고이 행렬을 그림의 모든 점에 적용하면 그림의 크기는 2.5가됩니다. 2.5를 하나의 행 ( [2.5 0; 0 1]) 에만 넣으면 x 좌표 만 곱해 지므로 x를 따라 늘어납니다.

다른 행렬은 다양한 정도의 유용성을 갖는 "꼬임"과 같은 다른 변형을 제공 할 수 있습니다. 개인적으로, 왜곡은 매트릭스가 너무 단순 해 보이지만 변환 자체는 그림 맹 글링을 제외하고는 거의 수행하지 않기 때문에 내가 가장 좋아하는 것입니다. 유용한 것은 "회전"입니다-포인트를 어떻게 회전합니까? 포인트의 위치를 ​​운동 해보십시오(x, y) 을 중심으로 theta시계 반대 방향으로 회전 한 후 하십시오. 새로운 x와 y 좌표는 오래된 x와 y에 세타의 사인과 코사인을 곱하여 나옵니다. 이 함수에 해당하는 사인과 코사인을 사용하여 회전 행렬을 쉽게 작성할 수 있어야합니다.

정사각형이 아닌 행렬을 사용하면 입력의 차원을 변경할 수도 있습니다. 2D 입력을 3D로 전환하는 것은 새로운 좌표에 넣을 무언가를 "제조"하기가 어렵 기 때문에 매우 유용하지는 않지만 3D는 2D로 매우 유용합니다. 무엇보다도,이 컴퓨터가 프로젝트에 알고있는 방법입니다 *** 모니터에 그리는 2D 이미지로 3D 장면.

벡터는 다른 것을 가질 수 있기 때문에 문자열 n 문자를 한 번에 셔플 링하거나 "곱셈"하여 곱셈 / 더하기 기능을 사용해야하는 행렬을 설명 할 수도 있습니다.

*** : 투사 할 때 조각과 같은 3D 객체를 가져와 빛을 비추고 벽에 어떤 2D 그림자가 떨어지는 지 확인합니다.

행렬의 한계는 무엇입니까?

행렬로 모든 기능을 수행 할 수 있습니까? 그래픽으로 생각하면 매트릭스가 할 수 없었던 것을 상상하기는 어렵습니다 (그러나 존재합니다 : 예를 들어 "소용돌이"효과를 수행 할 수 없습니다). 그러나 다음은 쉬운 예입니다. 함수 f가 모든 요소를 ​​제곱으로f(u) 되돌려주는 함수라고 가정 해 봅시다 . 행렬을 작성할 수 없다는 것을 알 수 있습니다. 행렬에는 좌표에 상수를 곱하는 레시피를 설명하는 기능 만 있으며, 힘과 같은 다른 멋진 함수는 표현할 수 없습니다.u

**** : 이것은 또한 선형 대수학 이라고 불리는 이유입니다 -거듭 제곱은 비선형 이며, 플롯 할 때 직선을 만들지 않습니다.

4D 행렬의 이상한 추가 행

이제 예제 4의 행렬이 왜 4입니까? 이것이 4 차원 공간을 의미하지 않습니까? 우리는 4D 컴퓨터를 가지고 있지 않습니다. 왜 그렇습니까? 이것은 실제로 선형 연산에 대한 이전 포인트와 관련된 행렬의 흥미로운 트릭입니다.

행렬로 수행 할 수없는 기능과 관련하여 : 2D 점을 2 단위 씩 오른쪽으로 이동하기위한 행렬이란 무엇입니까? (x+2, y) ? ( 합니까? 다시 말하지만 우리는 멈춤. 입력을 곱하는 방법이 있지만 추가 할 수있는 방법은 없습니다 2D 작업의 경우 속임수는 실제로 2D 공간이 아니라 3D 공간에있는 것입니다. 단, 모든 것의 높이 (z 좌표 또는 3 번째 요소)는 항상 1입니다 (2D 유니버스가 3D 유니버스의 바닥을 따라 평평하게 놓인 "플레이트"–이 경우 세 번째 좌표는 항상 0).이 입력 값은 항상 모든 입력에 대해 1이라는 것을 알고 있으므로이 마지막 좌표를 상수로 사용할 수 있습니다.

마찬가지로 3D 점을 이동하려면 4D 좌표가 필요합니다. 그렇기 때문에 모든 3D 변환 행렬이 [0 0 0 1]마지막 행으로 표시되는 이유도 있습니다. 4 차원을 절대 변경해서는 안됩니다. 그렇지 않으면 결과가 너무 복잡하여 3D로 표현할 수 없습니다!


추가를 위해 행렬을 어떻게 수행합니까? 행이 Xx Yx Zx Tx...이고 마지막 행이 실제로 0t 0t 0t 1t로 대체 되었다고 말하십시오 Xt Yt Zt Tt. 확인하려면 (x+2, y)에서 (x, y)갈 수 당신 1x 0y 0z 2t이 당신을 줄 것 1*x + 0*y + 0*z + 2*1때문에 t=1바로? x + 2에 상당합니다. 오, 이제 당신은 재미있는 T 값으로 렌더링을 망칠 수 있습니다. -grin- (긴 읽기, 여전히 최상의 가치, thx)
— n611x007

2

그것은 4x4 열 주요 행렬이며, 그 관점에서 볼 때 뷰 행렬입니다.

처음 3 개의 열은 기본 벡터의 방향 (위, 왼쪽, 앞으로 호출 한 방향)을 정의하고 마지막 열은 시점의 변환을 정의합니다. 그것들을 합치면 카메라의 방향을 설명 할 수 있으며, 더 중요한 것은이 행렬을 사용하여 점을 "눈 공간", "보기 공간"또는 "카메라 공간"으로 알려진 좌표 공간으로 변환 할 수 있습니다.

그것들은 모두 같은 좌표 공간에 대한 동의어입니다. 불행히도 다른 책과 사람들이 다른 이름으로 부르기 때문에 컴퓨터 그래픽을 다룰 때 모든 동의어를 배워야합니다. 대부분의 좌표 공간에는 여러 이름이 있습니다.

그런데 뷰 매트릭스의 세 열은 일반적으로 직교합니다. 즉 서로 직각을 이룹니다. 이것은 필수는 아니지만 전통적인 카메라를 만들 때 매우 일반적인 속성입니다.


1

TL; DR 버전 :

[x y z]각 행 의 처음 세 요소 는 변환 된 좌표계의 단일 기본 벡터 를 나타냅니다 . 마지막 요소 w는 번역 구성 요소입니다.

긴 버전

정점에 적용될 때 45도만큼 원점을 기준으로 정점을 회전시키는 행렬을 원한다면 변환 된 축을 나타내는 3 개의 벡터로 행렬을 채 웁니다.

  • 점 i상의 x축 [1 0 0],하지만 45도 회전. 이는 단순히 [i_x i_y i_z], 여기서 i_x및 i_yX 축에 45도 각도 내부와의 삼각 다리 같습니다 [cos(45) sin(45) 0].
  • jy 축의 한 점 [0 1 0]이지만 해당 축에서 45도 회전했습니다. 한 장의 종이에 스케치하면 시계 반대 방향으로 회전 할 때 구성 요소가임을 알 수 있습니다 [-sin(45) cos(45) 0].
  • 점 k상의 z축. 이 예에서는 z(화면 정렬) xy 평면에서 회전하기 때문에 영향을받지 않습니다.

그래서 우리는 i, j, k의 세 가지 새로운 벡터를 갖게되었습니다. 이것을 시각화하는 쉬운 방법은 X 및 Y 축을 취하고 전체 교차 배열을 회전시키는 것입니다.

이것을 행렬에 어떻게 넣습니까?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

또는

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

정점에 해당 행렬을 곱하면

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

에 대한 v = [1 0 0], 그리고 Θ = 90°,이된다v1 = [0 1 0]

번역을 위해 네 번째 행과 열을 추가하고 번역 구성 요소를 마지막 열에 넣습니다. 우리는 정점에 네 번째 구성 요소를 추가 w일반적이다 1. 따라서 정점에 행렬을 곱하면 w 구성 요소가 입력 정점에 마지막 열을 추가하여 정점이 이동 또는 변환되도록합니다. 이를 "균일 좌표"라고합니다. (우리의 목적 상, "균질" w은 각 벡터에 4 번째 성분이 있다는 것을 의미 하며 3x3 대신 4x4 행렬을 사용합니다. 자주 사용하지 않는 4 번째 행을 보내지 않기 위해 4x3 행렬을 사용하는 쉐이더가 자주 나타납니다. 귀중한 메모리와 대역폭을 소비하는 GPU까지.

이것이 도움이되기를 바랍니다.


2
3 년 전에 이미 답변 한 질문에 답했다는 사실을 알게 된 순간 ...
— 3Dave

: P 항상 답변하기 전에 질문 날짜를 살펴보십시오 ...
— HolyBlackCat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.