복습
우리가 지난 시간에 했던 게, linear transform.
여러개의 좌표가 있어서, 여러 개의 좌표로 가는 매핑.
각각의 좌표가 서로의 1차함수로 표현되는게 linear transform이었죠.
Affine transformation.
사실 이것도 linear하기는 해요.
여기에 하나가 더 붙었죠.
좌표와 상관없는 상수항이 더 붙었죠.
하나 더 붙은 이 상수term이, transformation을 의미해요.
이해 다들 해요…?
못 하는 사람? (아무도 손 안 듦ㅋㅋㅋ)
Rigid Transformation
앞에서는 transform을 정의할 때 invariance를 가지고 정의했죠.
linear할 경우 linear transform.
여기서는 좀 다르게 정의해요.
모든 포인터에서 포인터까지의 거리가 일정한 경우의 transform이에요.
transform을 하고 난 뒤에도 변하지 않아요.
왜 rigid인지 알겠죠?
딱딱해서 형태가 변하지 않아요.
그런데 세번째 조건이 있어요.
안팎을 뒤집어도 여전히 거리는 유지돼요.
세번째 조건은 그것을 뒤집을 수 없다는 거예요.
closs product가 preserve된다는거죠.
모든 좌표들을 다 뒤집으면, cross product가 방향이 바뀔텐데, 이런 거는 빼겠다는거에요.
말 그대로 모든 형태가 유지되는게, rigid transform이에요.
회전, 평행이동.
여기에 순서를 정해놨어요.
항상 회전 먼저, 그다음 평행이동.
convention이에요.
rotation이 성립하기 위한 조건이 뭘까요.
orthogonal한 게 있으면, 회전 후에도 그래야 해요.
물체 안에서의 rigid함은 거리로 이야기했는데, 여기에서는 직교함을 가지고 이야기하는거죠.
orthogonality가 유지되면 회전입니다.
으아 딴짓함
4차원 외적!
이 수업에서는 4차원 이상은 안 다뤄요.
어차피 그림도 못 그리는데 뭐 (?)
가능하면 선대 안 듣고도 이해할 수 있도록 설명하려고 하는데..
어려울 수 있어요 ㅠㅠ
내가 어떤 물체를 가지고 x, y, z축으로만 돌리는 건 누구나 할 수 있어요.
그러나 원점을 지나지도 않는 어떤 선을 기준으로 회전하는 것.
그렇게 돌리려면 어떻게 해야 할까요?
우리 지난시간에 했던 pivotting의 아이디어를 그대로 써요.
한 축에 맞춰서 변환을 하고, 다시 원래 축으로 돌아갔죠.
두 점을 지나는 벡터를 기준으로, 물체를 회전하고자 합니다.
일단은 물체 혹은 축을 원점으로 가져옵니다.
쉽게 하려면, 축을 원점으로 가져옵니다.
그다음에 뭔가의 방법(?)을 동원해서 이것을 primary axis에 맞도록 회전합니다.
그리고 작업을 한 뒤, 원래 축으로 되돌리고, 원래 위치로 보냅니다.
아이디어는 간단한데, 여기서 tricky한게 있어요.
primary axis에 맞출 때 또 다시 x, y, z로만 돌려야 해요.
임의의 axis u가 있어요.
처음에는 x축을 기준으로 얼마-a만큼을 돌려요.
그리고 돌려서, yz 평면에 들어오도록 해요.
여기서 다시 회전해서, z 축으로 가도록 합니다.
그럼 a는 어떻게 계산합니까?
u를 projection 합니다.
그렇게 해서 a를 구해요.
문제는 뭘까요.
코사인을 구해서, arccosine을 구합니다.
이 경우 방향이 어디인지 모르기 때문에, 두 가지 값을 구한 뒤…
그런데 이렇게 계산을 하계 되면 보통 얻는 게 NAN이죠.
그래서 arccosine은 라이브러리에는 있지만, 사용이 금기시됩니다.
할 수 있는 방법.
- 직접 cos, sin 값을 구해서 해버립니다.
- c에 있는 atan2. 방향성을 맞춰줍니다.
atan은 쓰지 말고요, atan2를 씁니다.
제대로 된 방법이 있는데.. 그건 나중에 말합시다.
Euler angles
이분이 3차원 변환을 두가지 말하고 돌아가셨어요.
오일러 앵글은 굉장히 쉬워요.
공간에 있는 물체의 orientation을 설명할 수 있는데,
x, y, z에 대해 회전을 정해주면, 해당 위치까지 갈 수 있다는 거에요.
x, y축의 translation은 서로 orthogonal해요.
x, y축으로 돌리는 건 이야기가 달라요.
한 번 돌리고 나면, 나머지 axis들이 영향을 받아요.
서로 corelation이 있습니다.
그럼에도 불구하고, 각각 한번씩 돌리면 모든 orientation을 나타낼 수 있습니다.
그런데 vector에서 x, y, z로 쪼개는 것과는 달라요.
이거를 physical하게 나타내면, Gimble입니다.
가장 바깥은 x로만, 그 다음은 y, 그 다음은 z로만 회전할 수 있습니다.
이것은 인공위성의 카메라가 항상 지구를 향하게 하는데 쓰이죠.
물론 이거 말고도 다양한 combination이 가능합니다.
XYX도 가능합니다.
그런데 안 되는 것은, XXY 같이 같은 축을 연속해서 두번 돌리는 것입니다.
Gimble lock
degree of freedom이 하나 줄어드는 상태가 있습니다.
한 방향으로 아주 열심히 돌려봤자, 돌아갈 수가 없습니다.
기하에서 생기는 문제와, 수학적 표현 사이의 mismatch이죠.
Composition of Transforms
으앙 열심히 문제 풂
linear에서부터는 직관이 안 맞기 시작해요..?
다음 시간부터는 여러분들이 3차원에서의 geometry를 완벽히 이해하게 하는 게 목표입니다.
이제 첫번째 숙제가 나갑니다.
원래 다음 시간에 수업이 없는 걸로 공지되어있는데,
출장이 취소되어 수업을 합니다.
첫번째 숙제는 openGL에 익숙해지기입니다.
transform을 쓰는 게 숙제입니다.
ㅇㅂㅇ 파워딴짓…
DFS를 하려면 stack이 필요하죠.
그래서 스택 구조로 관리합니다.
push pop push pop 하다보면 그려집니다.
call back 구조로 이루어져있댔죠.
이 화면이 뜰 때 뭘 그릴지.
display call back 속에 이걸 집어넣으면…
대충 컨셉은 알겠죠?
OpenGL에 선언되어있는 것을 가져다가, 디자인해다가 붙입니다.
뭘 디자인 할지는 상관 없습니다.
단계를 3단계 이상 갖고 있는 hierarchical model을 만드세요.
당연히 각자 움직여야하고요.
제출은?
- 조교 이메일로
- due 자정
- 소스코드
- 보고서
- 3단계가 어떻게 구현되었는지
- 어떻게 확인할 수 있는지
- 어떻게 컴파일 하는지
이 모든 것이 포함되어 있어야 합니다.
ppt에 조건 붙어있잖아요.
이 조건대로 채점해요.
그러니까 이 조건을 다 만족하도록 하세요.
보통 minimal하게 써놔요.
언제나 학생들이 더 해서 문제에요.