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


19

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

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

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

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

답변:


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 및 기존 수학은 열 벡터를 선호하는 경향이 있음).

선형 대수학에 대한 좋은 책을 얻거나 최소한 매트릭스 및 쿼터니언 FAQDirectX 및 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*AA나타내는 기능을 적용하는 것을 의미하기 때문 입니다.

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

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_xi_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.