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로 정규화할 필요가 있따. 그것을 그 자체로 나누어서, 슈도 코드에서, 그것은 다음과 같은 것을 준다.














댓글 없음:

댓글 쓰기