반응형

모든 점들을 옮긴다고 하면 CPU의 부담이 크다 -> 덩어리로 뭉쳐서…

이런 변환들을 수학적으로 어떻게 변환하느냐: 동차좌표계…

P라는 점을 Q로 옮겨 놓음(바뀜)
어떤 백터를 새로운 백터로 바뀌어 놓는 것이 변환이다.
대표적으로 이동이 변환이다. 절대 좌표 공간 속에서.
회전. 원점을 중심으로 회전할 수 있겠죠. 그리고 특정 점(피봇)을 중심으로 회전시킬 수 있 겠죠. 하지만 3차원에서는 축이 있어야 겠죠.

회전을 하든, 이동을 하든, 크기를 변환시키든.. 모두 어핀(Affine) 트랜지션입니다.
크기 변환시 모양은 원래와 닮은꼴이죠.
강체 변환은 어핀 변환의 …
전단변형: 휘게 만드는 겁니다. 화투를 쌓아서 옆으로 기울일 수 있죠. 이것도 어핀 변환의 일종 입니다.
직선이 직선으로, 평행선이 평행선으로 유지되는 것이 어핀 변환입니다.
우리가 주어진 점만 가지고 연산하기 위해서는 어핀을 사용해야 한다.

모든 점들은 트랜스포메이션을 거치게 됩니다. 로테이트 같은 걸 줘봤죠. 여러분들이 던져 준 점들에 곱해지게 됩니다. 카메라 역시 변환입니다. 카메라를 어디에 두고, 어디를 쳐다보고. 카 메라는 기본적으로 Z축에서 원점을 쳐다보게 됩니다. 카메라를 들면 OpenGL은 물체를 내리는 작업을 해 줍니다.

옮기는 양은 d로 표현됩니다.
p'는 p에 이동 백터 d를 더하기만 하면 됩니다. 매우 간단하죠.

동차 좌표계는 흔히 쓰는 좌표계에 w가 더 있죠.
동차 좌표계에서는 x,y,z,1
2x,2y,2z,2 (2로 나누면 같음)
일반적으로 w가 1인 표현을 선호합니다.(계산 시 편하니까)
3차원 좌표로 표현하면 똑같은 것을, 동차 좌표계에서 벡터는 z가 0인 것으로 표현합니다.

T를 이동 행렬, 이동시키는 것이라고 보면 …
4*4 행렬로 표현하면 위 식에 어떤 좌표를 곱해보세요.
위 식은 이동을 표현하는 행렬이죠.

회전은 행렬로 표현할 수 밖에 없습니다.
회전 변환이라고 인터넷에서 찾아 보시면 나옵니다.
위 식을 행렬로 변환해 보세요. 어떻게 하면 되겠습니까.

자, Z축에 대한 회전을 보면, 2차원에서의 회전과 똑같죠.
동차 좌표계로 바꾸면 위와 같죠.
위 식을 유도해 봤죠? 작년에…

x,y축에서도 위와 같은 식을 유도할 수 있습니다.
실제 회전은 임의의 축에 대해 일어나겠죠. 그것도 행렬로 표현됩니다.

크기 변경도 행렬로 표현 가능합니다.

이것도…

이동시킨 것을 다시 가져오고 싶으면 백터 d를 빼주면 되죠.
Rotation은 R의 역행렬이 되겠죠. R의 역행렬은 마이너스 시타만큼 넣어서 쉽게 계산할 수 있 습니다. 모든 회전 행렬은 전치만 시키면 역행렬이 됩니다.
회전 행렬은 정교, 직교 성질을 갖죠. 모든 회전 행렬은 전치만 시키면 됩니다. 이는 매우 중요 한 특성이고 꼭 기억해 놓아야 합니다.

변환을 행렬로 표현한 이후. 생각해 봅시다.
어떤 물체를 이동시키고 다시 이동시켜서 회전을 시켰다. 어떤 p에 ABCD를 곱해주면 되죠. 행 렬로 4*4 행렬을 곱하는 걸 M으로 표현한다고 하면 각각의 점을 변환해야 할 때 M을 한 번만 곱하면 됩니다. 실제 그래픽카드 OpenGL에서 하는 것은 좌표를 한번만 곱합니다. 이를 CPM, Current P? Matrix



모델뷰는 물체의 변환과 관련된 겁니다. 프로젝션은 물체를 화면상의 좌표로 떨어뜨리기 위한 겁니다. OpenGL은 모델과 뷰를 하나로 뭉쳐서 사용합니다.
지금부터 하는 모든 매트릭스 연산은 프로젝션 매트릭스에서 수행되어야 합니다. 물체를 움직 이기 위해 2개의 중요한 연산을 하는데, GLU_Perspective 라는 함수가 있습니다. 이건 GL_PROJECTION에 포함됩니다. 카메라는 3차원을 2차원으로 떨어뜨리는 겁니다.
카메라가 이동하거나 보는 것은 물체가 이동하거나 하는 것과 같기 때문에 GL_MODELVIEW에 해당합니다.

투영행렬을 조작하는 방법은 매트릭스를 조작하지 않고, (일반적으로 직접 만들지는 않고) 이 미 있는 함수를 사용합니다. 원근이 없는 GL오스를 쓰든지, 원근이 있는 PROJECTION을 쓰든 지.. 일반적으로 GL_PROJECTION이나 OL_ORTHO를 씁니다. 지금 하는 모든 것은 모델뷰에 적 용됩니다.

OpenGL은 CTM 하나를 갖고 있다가 여러분이 정점을 던져주면 좌표를 변환해서 CTM에 적용 합니다. 우리가 500개를 던져줘도 CTM 하나로 합니다. 동차좌표계는 미리미리 곱해 놓을 수 있죠. 모두 4*4 행렬로 표현되니 누적된 변환을 묶어 줄 수 있죠.

이런 작업이 이루어진다는 거구요.

물건을 던지기 위해 좌표를 던지면 물건 …
glRotatef(45,0,1,0); // y축으로 45도 회전.
glTranslatef(1,1,1); // 1,1,1 로 이동
DrawABook(); // 책이 그려집니다.
명령의 순서는 회전, 이동이지만
실제로는 반대로 일어난다.
OpenGL은 위와 같은 값이 들어올 때 마다 곱해준다.

CTM = I
CTM= IRT
p' = IRT p
여러분들이 표현한 것과 반대로 적용되는 겁니다.
OpenGL을 처음 시작하는 사람들이 어려워 하는 것.
자기가 회전되면서 좌표를 가지고 있으면 된다.

자기의 지역 좌표계를 가지고 움직인다고 보면 됩니다.

원래의 좌표축이 있는데 회전, 변환을 하면 이 축에서 변환(Translate)되는겁니다.

Translate, scalef도 똑같은 식으로 곱해지게 됩니다.

거꾸로 하면 됩니다. Translate -> Rotate -> Translate

완전 새로운 임의의 매트릭스를 적용하려면 ? glLoadMatrix(m)하면 이를 CTM으로 바로 바꿉 니다.

CTM을 스택에 저장할 수 있습니다.
즉, 푸쉬를 해놓고 변환하고 나서 지금껏 해놧던 변환을 취소하려면 푸쉬 시 정보를 받아올 수 있습니다.
실제 코딩을 하면서 진행하도록 하겠습니다. 

반응형

'이론 수업 > 3D 그래픽스' 카테고리의 다른 글

3D그래픽스5: 종료  (1) 2020.09.23
3D 그래픽스4: 관측  (0) 2020.09.23
3D 그래픽스2: 뷰포트, 저수준, 좌표  (0) 2020.09.21
3D 그래픽스1: 무엇을 배우나  (0) 2020.09.21
,