지금까지는  로컬좌표계 <-> 월드좌표계 하는 위주로 살펴봤스빈당

이게 왜 중요하냐면

각 모델들은 각자의 로컬좌표계에서 데이터를 가지다가

월드에 박혀버릴테죠 , 


아니면 어떤 모델을 기준으로 월드가 어떻게 보이는가?

도 해결할수도 있습니다.


우선 점들의 좌표변환이 이제 3d에서 어떻게 이루어지는지 보겠스빈당

 (이미지: 구글링)



이제 월드가 대충 어케 동작하는지 알았으니 Camera를 만듭시다.

Camera 는 Obj3d 객체를 상속합니다.

 
(Camera.js)


카메라는 어떤 물체를 바라봅니다. 

이때 카메라가 바라볼때 월드의 좌표계산은

로컬 -> 월드 의 계산이죠

이를 모델뷰 변환 이라고 합니다.


그런데 여기서는 at 방향 벡터가 반대군요 이는 좌표 변환의 용이성을 위해서 그런겁니다.


카메라로 세상을 보면 원근감이 나타나죠

실제로 세상의 좌표를 우리가 보는 것은 

3차원 -> 2차원으로 옮기는 겁니다. 투영을 하는거죠 여기서는

이는 그 유명한 절두체(Frustum) 공간을 만들고 이를 압축시키는 과정 입니디.


절두체 공간안에 있는 물체를 강제로 정육면체 공간으로 바꿔버립니다. 그러면

그 안에 있던 모든 점들은 가까이 있던 점은 더 벌어지고 하겠죠

이것이 원근감을 느끼는 원리입니디

자세한 원리는 



절두체를 45도 각도의 절두체로 변환한뒤 정육면체 공간으로 바꿔버립니다. 



이것들은 전부 4 by 4 행렬로 표현 가능합니다

정말 행렬은 강력한 툴이져


깊이값에 따른 왜곡 계산과 스케일변환 ( 압축 ) 에다가 삐뚤어진것을 똑바로 잡아주는 쉬어링 변환이 연속으로 배치됩니다.

전부 계산되면


엄충 복잡하져... 근데 대충 흐름만 알아두고

그냥 저 행렬을 사용만 합시다. 너무 복잡하잔아여

l: left , r: right, b: bottom , t: top, n:near , f: far

입니다.



그런데 카메라에서  left 좌표라든지 right 좌표, top 좌표 bottom 좌표를 입력하는것을 본적이 없스빈당 

대개 시야각을 정해주고 가까운 초점거리와 가장 먼 초점거리를 지정하죠

FOV (Field Of View) : 시야각


솔직히 어떤 보고싶은 영역을 사각형으로 지정하는것은 좀 그렇죠

정확한지도 잘 모르고 얼마나 넓은 시야로 보고 있는지 모르지 않습니까?

 
그래서 (FOV , aspect, near, far) 네가지 변수를 가지고

(left, right, bottim, top, near, far) 를 추출해낼수 있어야 댑니다.


이 그림이 개념이 잘 나와 있네요



위에 모든것들을 반영하여

Mat4 에다가 기능추가를 하겠습니다.

카메라 때문에 추가된 부분을 찾아보세요

 
(Mat4.js)


Posted by 멍충한아싸

댓글을 달아 주세요