Post Lists

2019년 7월 1일 월요일

1. Geometry

https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry

Geometry

목차
Points, Vectors and Normals
Coordinate Systems
Math Operations On Points and Vectors
Matrices
How Does Matrix Work : Part 1
How Does Matrix Work : Part 2
Transforming Points and Vectors
Row Major vs Column Major Vector
Matrix Operations
Spherical Coordinates and Trigonometric Functions
Creating an Orientation Matrix or Local Coordinate System
Transforming Normals
Source Code

============================================
Chapter 1 - Points, Vectors and Normals

경고의 말
~

Introduction to Geometry
~~ 수학에 편안함을 느끼지 않고, 행렬이 무엇인지 이해하지 않기 때문에, 컴퓨터 그래픽스 프로그래밍이 너를 위한 것이 아니라 생각한다면, 지금 포기해라.

~~ 이 수업은 또한 선형 대수에서와의 다른 conventions을 설명할 것인데, 그것은 CG 연구자들이 그들의 문제들을 해결하고 코드를 작성할 때 몇년 간 사용해왔던 것이다. 너는 이러한 conventions을 인지할 필요가 있는데, 그것들이 종종 책에서 언급되지 않기 때문이다 (그리고 웹에서 좋지 않게 문서화 되어있다). 이러한 convetions는 중요하다; 너가 또 다른 개발자의 코드 또는 기술을 읽거나 사용하기 전에, 너는 처음에 그들이 사용하는 컨벤션이 무엇인지를 체크해야 한다.


선형 대수가 무엇인가? Introduction to Vectors
a vector는 numbers의 한 배열로 나타내어질 수 있다.
어떤 요구되는 길이를 가정할 수 있는 숫자들의 이 배열은 또한 수하에서는 가끔씩 tuple이라고 불려진다. 만약 우리가 그 벡터의 길이에 대해 구체적이길 원한다면, 우리는 n-tuple이라고 말하기를 선택할지도 모른다. 거기에서 n은 벡터 원소들의 개수를 나타낸다.

~~ 한 벡터의 내용을 변환 (transfomring) 하는 과정은 linear transformation이라고 불려지는 것을 통해 이뤄진다.

Points and Vectors
point는삼차원 공간에서 position(위치)이다. 반면에, vector는 보통 삼차원 공간에서 direction(방향)을 나타낸다 (그리고 어떤 일치하는 크기 또는 사이즈).

A Quick Introduction to Transformations

생략

Normals
normal은 CG에서 (그리고 기하학에서) 한 기하학적 오브젝트의 표면의 방향을 그 표면에 있는 한 점에서 설명하기 위해 사용되는 기술적 용어이다. 기술적으로, 점 P에 있는 한 표면에 대한 surface normal은 점 P에 있는 surface에 접하는 평면과 수직인 벡터로서 보아진다. Normals은 shading에서 중요한 역할을 하는데, 거기에서 오브젝트들의 밝기를 연산하는데 사용된다.

Normals은 한 경고장이 있는 벡터로서 생각될 수 있다: 그것들은 벡터들이 하듯이 같은 방식으로 변환할 수 없다. 이것은 우리가 그것들을 미분하는데 시간이 걸리는 주된 이유 중 하나이다. 너는 Transforming Normals 챕터에서 이 주제에 대해 좀 더 많은 정보를 알게 될 것이다. 지금은, 그것들이 무엇인지 이해하는 것 만이 중요하다.

From Theory to C++
~

Summary
이 첫 챕터로 부터, 너는 수학적으로 한 벡터가 어떤 차원이든지 될 수 있다고 기억해야만 한다. 그러나 CG에서, 우리는 좀 더 구체적인 정의를 사용한다: 한 vector는 3D공간에서 한 방향이다 (그러므로, 세 개의 숫자들에 의해 나타내어 진다). 추가적으로, 우리는 points를 positions의 표현으로 말한다 (또한 3D 공간에서이고, 세 개의 숫자로 나타내어 진다). Homogeneous points는 4개의 숫자로 나타내어지지만, 우리가 나중에 공부할 특별한 경우이다.

점과 벡터들은 linear transformations을 사용하여 변환될 수 있다.
~~

What's Next?
우리가 아직 설명하지 않은 한 가지 중요한 것은 점과 벡터들을 정의하는 그 세 개의 숫자들이 무엇을 나타내는지 이다. 이 숫자들은 레퍼런스와 관련하여 (또한 가끔씩 원점으로불려진다) 한 점의 좌표들을 나타낸다 (2D와 3D 공간에서).  기술적으로 우리가 coordinate system(좌표계)라고 부르는, 이 레퍼런스는 우리의 다음 챕터의 주제이다.

============================================
Chatper 2 - Coordinate System

Introducing Coordinate Systems
points나 vectors에서 쓰이는 숫자들이 무엇은 의미하는가? 각 숫자는 한 line의 원점에서 그  라인에 있는 점의 위치까지의 signed distance(양의 거리)를 나타낸다.

~~~ "좌표"는 원점에서 그 점까지의 양의 거리라고 말하는 다른 방법이 될 수 있다.

Dimensions and Cartesian Coordinate Systems
~~~ 따라서, 두 개의 축들을 배치함으로써, 우리는 평면이라고 불려지는 2차원 공간을 정의했다.

그래서 만약 너가 좌표계 A에서의 P의 위치를 안다고 한다면, 또 다른 좌표계 B에서 같은 점의 위치를 찾기 위해 너가 해야 할 것은 무엇인가? 이것은 CG에서 (그리고 일반적으로 수학에서) 매우 중요한 연산을 나타낸다. 우리는 곧 한 좌표계의 한 점의 좌표를 다른 것으로 변환하는 map을 발견하는 방법을 따라서 그 이유를 알게 될 것이다 (Transforming Points and Vectors 챕터참조)

The Third Dimension
기하학에서, 이 3D 좌표계는 Euclidean space라고 좀 더 공식적으로 알려진 것을 정의한다.

우리는 이 챕터의 이 부분을 좌표계의 좀 더 공식적인 정의에 관심이 있는 너를 위해 이 문단을 결론 짓는다. 선형 대수에서, 세 개의 축 (1D와 2D의 경우 개별적으로 한 개 또는 두 개의 축)은 우리가 그 좌표계의 basis(기저)라고 부르는 것을 형성한다. 한 기저는 선형으로 독립적인 벡터들의 한 집합이고, 선형 결합에서, 주어진 벡터 공간에서 모든 벡터를 나타낼 수 있다. 한 집합으로부터의 벡터들은 그 집합에 있는 벡터들 중 어떠한 것도 다그 집합에 있는 다른 벡터들의 선형 결합으로 쓰여질 수 없는 다면 선형으로 독립이라고 말해진다. 기저 변환, 또는 좌표계의 변환은 수학과 그래픽스 파이프라인에서 흔한 연산이다.

Left-Handed vs Right-Handed Coordinate Systems

The Right, Up and Forward Vectors

The World Coordinate System

Things We need to Remember


============================================

Chatper 3 - Math Operations on Points and Vectors

Dot Product
~~ 두 개의 벡터가 서로 (A.B)에 수직일 때, 이러한 두 벡터 사이의 내적은 0이다. 두 벡터가 반대 방향 (A.C)을 가리키고 있을 때, 내적은 -1을 반환한다. 그것들이 정확히 같은 방향 (A.D)를 가리키고 있을 떄, 그것은 1을 반환한다. 그것은 또한 두 벡터 사이의 각도를 찾거나 한 벡터와 한 좌표계의 축 사이의 각도를 연산하는데 매우 잘 사용된다 (그리고 이것은 한 벡터의 좌표를 구면 좌표계로 변환할 때 유용하다. 이것은 trigonometric functions에서 설명된다).

Cross Product



============================================
Chapter 4 - Matrices

행렬에 대해 정말로 복잡한 것은 없다. 몇몇 사람들이 그것들을 두려워하는 이유는 대개, 그들이 행렬이 무엇을 나타내고, 그것들이 어떻게 작동하는지를 완전히 이해하지 않았기 때문이다.

~
이제, 요약해서, (그리고 이것은 해열이 무엇인지에 대한 수학적 정의가 아니다), 한 행렬은 모든 이러한 변환을 하나의 단일 구조로 결합하는 한 방식이다. 이 구조(행렬)에 의해 한 점 또는 벡터를 곱하는 것은 우리에게 a transformed point or vector를 준다. 이러한 변환들을 합치는 것은 다음의 선형 변환의 어떤 조합을 의미한다: scale, rotation, translation.


============================================
Chapter 5 - How Does Matrix Work : Part 1

Point-Matrix Multiplication
행렬 형태로 쓰이는 point는  P = [x y z]

The Scaling Matrix


The Rotation Matrix
이 문단에서 말할 것은, 한 점 또는 한 벡터를 카르테시안 좌표계의 한 축에 대해 회전시킬 한 행렬을 구축하는 것이다. 그렇게 하기 위해서, 우리는 삼각 함수를 사용할 필요가 있다. (1, 0, 0)의 좌표를 가진 삼차원 좌표계에 정의된 한 점 P를 가정하자. 잠시동안, z축을 무시하고, 그 점이 xy 평면에 놓여 있다고 하자. 우리가 원하는 것은, 회전으로 그 점을 P에서 P_T로 옮기는 것이다. P_T는 (0, 1, 0)이다. 너가 그림 1에서 볼 수 있듯이, z축에 대하여 시계 반대 방향으로 90도 회전하여 처리될 수 있다.






~
회전의 순서가 중요하고 차이를 만든다는 것에 주목해라. 만약 너가 한 점을 x축에 대해 처음에 회전시키고, y축에 대해 두 번째로 회전시킨다면, 너는 y축에 대해 회전하고 x축에 대해 회전한 것의 다른 결과를 얻게 될 것이다. Maya, 3DSMax, Softimage, Houdinit 등같은 대부분의 3D Packages에서, 회전이 발생하는 순서를 명시하는 것이 가능하다. 예를들어, 그 순서는 xyz가 될 수 있다.

============================================
Chapter 6 - How Does Matrix Work : Part 2

~
행렬을 이해하는데 있어서 중요한 생각은, 그 행렬의 각 행은 좌표계의 한 축(또는 기저들)을 나타낸다는 것이다. 이것은 나중에 중요해지는데, 너는 한 좌표계에서 다른 것으로 점과 벡터들을 변환하기 위해 어떻게 행렬을 만드는지를 배운다. 이것은 그 좌표계의 각 축의 좌표로 그 행렬의 행을 대체하는 것이다.

이것은 CG에서 흔한 기법이고, 다음 챕터에서 설명될 것이다. 너가 행렬이 한 좌표계의 좌표들을 저장하는 한 방법이고, 거기에서 그 행렬들의 행들은 이 좌표계의 축 또는 우리가 그것들을 가끔씩 orientation matrix라고 부르는 것이라고 이해할 때 덜 신비스럽다.

Orthogonal matrices가 몇 가지 흥미로운 특성을 가지지만, 아마도 컴퓨터 그래픽스에서 가장 유용한 것은, orthogonal matrix의 transpose가 그것의 inverse와 같다는 것이다.

Q^T = Q^-1
QQ^T = I

Affine Transformations
너는 가끔씩 행렬 변환에 사용되는 affine transformations 용어를 보게 될 것이다. 이 기술적 용어는 실제로 우리가 이제까지 설명했던 행렬들의 종류를 상요하여 얻은 변환들로 지정하는 것이 좀 더 정확한다. 요약해서, affine transformation은 straight lines을 보존하는 변환이다. translation, rotation, shearing matrix는 모두 그것들의 조합이 그렇듯이 affine transformations이다. 우리가  CG에서 공부할 변환의 다른 종류는 projective transfomrations이라고 불려진다 (perspective projection이 projective transformation 이다). 너가 추측하듯이, 그러한 transformations은 필수적으로 직선간의 평행성을 보존하지 않는다 (Foundation of 3D Rendering Section에서 perspective and orthographic projection matrix에 대한 강의를 체크해라).


========================================
Chapter 7 - Transforming Points and Vectors

우리의 점은 이제 (x, y, z, 1)으로 보이게 된다. CG에서, 그것은 homogeneous point(또는 homogeneous coordinates를 가진 점)으로 불려진다. 그러한 점으로, 우리는 쉽게 우리의 행렬에서 translation을 넣을 수 있다.

The Trick About Homogeneous Points
한  점을 homogeneous point로 나타내는 것은 [4x4] 행렬과의 point multiplication을 하도록 하기 위해서 필수적이다. 그러나, 코드에서, 그것은 implicitly하게 된다. 왜냐하면 우리가 설명 했듯이 w는 항상 1이다. 우리의 Point C++ class는 4개의 floats를 가진 point type을 정의 하지 않을 것이지만, 오직 (x ,y and z)의 세 개만을 갖는다. 기술적으로, 만약 우리가 한 동차 좌표와 [4x4] 행렬의 곱을 하려고 한다면, 그 변환된 점의 w 좌표는 그 점의 좌표와 그 행렬의 4번 째 열의 계수와 곱하여 얻어질 것이다. 그러나, 우리가 이전에 언급했었듯이, 이 열은, 거의 항상 (0,0,0,1)로 설정된다. 그 경우에, w' (transformed point의 w 좌표)의 값은 1이 되어야 한다. 그리고 최종 transformed x', y' and z' 좌표들은 직접적으로 사용될 수 있다. 그러나 우리가 간단히 언급했었듯이, 이 네 번 째 열은 항상 (0,0,0,1)로 설정되지 않는다. 특히 너가 projection matrices를 다룰 때 ( 스크린에 점을 사영하는 행렬). 이러한 특별한 경우에 w'에 대한 결과는 1과 다를 수 있찌만, 이 점에 대해서 Cartesian point로서 쓸모 있기에, 우리는 w' 다시 1로 정규화할 필요가 있따. 그것을 그 자체로 나누어서, 슈도 코드에서, 그것은 다음과 같은 것을 준다.


P'.x = P.x * M00 + P.y * M10 + P.z * M20 + M30; 
P'.y = P.x * M01 + P.y * M11 + P.z * M21 + M31; 
P'.z = P.x * M02 + P.y * M12 + P.z * M22 + M32; 
w'   = P.x * M03 + P.y * M13 + P.z * M23 + M33; 
if (w' != 1 && w' != 0) { 
    P'.x /= w', P'.y /= w', P'.z /= w'; 
} 

너가 볼 수 있듯이 우리는 Point의 type에 w 좌표를 선언할 필요가 없다. 우리는 도중에 w'를 연산할 수 있다. 왜냐하면 우리는 implicitly하게 가정하는데, 우리가 transform하는 point가 한 Cartesian point라는 것이다. 그리고 우리는 그 point를 w좌표가 explicitly하게 선언되지 않은 하나의 동차 좌표로 볼 수 있다 (왜냐하면 그것은 항상 1과 동일 하기 때문이다). 그러나, 만약 우리가 점과 곱하는 행렬이 예를들어 projection matrix라면, w'의 결과는 1과 다를 지도 모른다. 이 특정한 경우에, 우리는 P'의 모든 좌표들을 정규화할 필요가 있다. 그것을 1로 설정하기 위해서이다. 이것이 되었다면, 우리는 우리의 Cartesian coordinate system에서 사용할 수 있는 point를 다시 얻는다.

너가 기억할 필요가 있는 모든 것은, 일반적으로 너는 동차좌표에 대해 신경쓸 필요가 없을 것이라는 것이다. points가 한 perspective projection matrix 곱해질 때만 예외로 하고. 그러나, 너는 실제로 아마도 만약 너가 한 ray tracer를 작업한다면 이 issue를 만나지 않을 것이다. 이 특별한 행렬의 경우는 ray tracing에서 사용되지 않기 떄문이다. 만약 너가 여전히 이 w좌표를 이해하려고 노력한다면, 그리고 그것이 무엇에 사용되는지 이해하려 한다면, 3D Basic Rendering section에서의 Perspective and Orthographic Projection Matrix의 강의를 참고해라. 너는 3D points를 image plane에 perspective projection을 사용하여 사영시키는 방법을 배울 것이다. 동차 좌표의 개념은 그러고나서 이해가 될 것이다.

Transforming Vectors
Vectors는 points보다 transform하기에 더 쉽다. 이 강의의 서두에서 말 했듯이, Vectors는 방향을 나타내지만, 반면에 points는 공간에서의 position을 나타낸다. vector의 position은 사실 의미없기 때문에, 그것들은 translated 될 필요가 없다. 우리는 vectors가 가리키는 방향에만 관심이 있고, 결국에 가끔씩 geometric or shading 문제를 해결하는데 필요한 정보인 그것들의 길이에만 관심이 있다. Vectors는 우리가 point를 transform한 것처럼 transformed 될 수 있지만, 우리는 translation 부분에 책임이 있는 코드의 부분을 제거할 수 있다. vectors를 transform하는데 사용된 코드는 이것처럼 보인다 (points를 transform 하는 코드와 비교해라)

Transforming Normals
이상하게 들릴지 모르지만, 너는 normals이 vectors와 같고, 같은 코드를 사용해서 transform될 수 있다고 생각할지도 모른다. 사실, 그것은 그렇게 간단하지 않다. 우리는 Transforming Normals 챕터에서 그 이유를 설명할 것이다.
(찬 : uniform scale이 아닌 non-uniform scale은 normal을 이상하게 바꾸므로 transpose(inverse()) 였나 그 반대 순서였나 그 연산이 필요하다)

========================================
Chapter 8 - Raw Major vs Column Major Vector

요약해서, convetion에 의해, 우리가 vectors or points를 row-major order로 표현하려고 결정할 때, 우리는 그 point를 곱의 왼쪽에 넣고, 행렬을 곱하기 부호의 오른쪽에 넣어야 한다. 이것은 수학에서 left or pre-multiplication이라고 불려진다. 만약 너가 그 vectors가 column-major 순서로 쓰기로 결정한다면, 그 행렬은 그 곱의 왼쪽에 있어야 하고, 그 vector or points는 오른쪽에 있어야 한다. 이것은 right or post-multiplication이라고 불려진다.

우리는 이러한 용어들이 실제로 어떻게 사용되는지에 세심하게 할 필요가 있다. 예를들어, Maya 문서는 "Maya에서 행렬들은 post-multiplied됩니다. 예를들어, 한 점 P를 object-space에서 world space(P')로 transform 하기 위해서, 너는 그 worldMatrix로 post-multiply를 할 필요가 있습니다. (P' = P X WM)". 그리고 이것은 혼란스러운데, 왜냐하면 그것은 실제로는 pre-multiplication 이지만, 그들은 이 특정한 케이스의 point와 관련하여 matrix의 position에 대해 말하고 있기 떄문이다. 그것은 실제로 용어의 잘못된 사용이다. Maya에서 points와 vectors는 row-major vectors로 표현되고, 그러므로, 그것들은 pre-multiplied (곱셈에서 matrix 앞에 point or vector가 나타난다는 의미)로 쓰여져야만 한다.

결론적으로, row-major order에서 column-major order로 가는 것은 곱셈에서 point or vectors와 행렬을 바꾸는 것을 포함할 뿐만 아니라, 그 행렬을 transpose하는 것도 포함한다. 이것은 두 conventions이 같은 결과를 주도록(역으로도) 보장하기 위해서 이다.

이러한 관찰로부터, row-major convetion이 사용될 때 우리는 한 point or vector에 적용된 연속의 transformation이 순차적인 순서로 (읽는 순서)로 쓰여질 수 있다는 것을 알 수 있다.

만약 너가 column-major 표기법을 사용하려 한다면, 너는 그 transform을 반대 순서로 읽을필요가 있다. (비직관적이라고 생각할지도 모른다),

그래서 너는 "다른 것보다 한 시스템을 선호하는 이유가 있음에 틀림없다"라고 생각할지도 모른다. 사실, 두 conventions는 옳고, 우리에게 같은 이유를 주지만, 몇 가지 기술적인 이유 때문에, Maths and Physics 교과서들은 일반적으로 vectors를 column vectors로 다룬다.

우리가 column-major matrices를 사용할 때, transformation의 순서는 수학에서 우리가 evaluation과 composition 함수를 작성하는 방식과 비슷하다.

그러나 row-major matrix convention은 matrices를 가르치기에 더 쉽게 만든다. 그리고 그것이 우리가 그것을 Scratchpixel에서 사용하는 이유이다 (뿐만 아니라 Maya, DirectX도. 그것들은 또한 RenderMan 스펙에서 표준으로 정의된다). 그러나 OpenGL같은 몇 3D APIs는 column-major convention을 사용한다.



========================================







댓글 없음:

댓글 쓰기