앞서는 좌표계산이 거의 정해져 있는 형식이라면

이제부터는 좀 자유로운 형식으로 만들수 있습니다.

제가 지금부터 만드는 방식이  구릴 가능성이 크다는거죠 ㅎㅎ


우선 저는 행렬스택을 만들겁니다.

왜 스택을 만드냐면,

어떤 3차원 객체는 좌표계라고 하였습니다. 각각의 객체의 회전행렬과, 이동행렬을

스택에 넣고

좌표를 계산할때는 스택을 역으로 훑으면서 단번에 좌표를 계산시켜 버리는겁니다.

게다가

어떤 3차원 객체는 자기 내부에 또 새끼를 칠 경우도 있죠

그러면 부모의 변환 행렬이 필요하게 됩니다.

이것은 OpenGL에서도 있죠, 행렬스택 push , pop 하는거요

일맥상통하빈다.

한번 행렬스택을 만들어보겠습니다.

 
(MatStack.js)

 뷰포트는 따로 빼놨는데 그 이유는

나중에 클리핑이나 컬링을 해야할지도 모르게 때문입니다.


transform 메서드를 사용하면  해당 로컬 좌표계 좌표가

스택에 쌓인 행렬들을 순차적으로 거꾸로 계산하면서 결국 CVV 공간으로 압축된 좌표로 바뀝니다.

 


그 다음에는 장면 (Scene) 을 만들겠습니다.

이건 뭐 거창한건 아니고 , 3차원 객체들 (Obj3d) 들을 모아놓은 자료구조라고 생각하겠습니다.


그래서 나중에 장면과, 카메라를 인자로 주면 렌더러가 그걸 처리하는거죠~ 캬~ 죽이져



우선은 그냥 배열로 만들어 버릴겁니다. 

 
(Scene.js)

엄충 단순하져



마지막으로 렌더러를 만들겠습니다.

렌더러는 실질적으로 캔바스 객체도 가지며

창의 폭, 너비도 알고 있으며, 장면과 카메라를 받아서

모든 오브젝트에 대해서 일괄적으로 계산을 적용하는


가장 짱먹는 녀석이죠




(Renderer.js)


render 메서드를 보면 장면에 담긴 모든 오브젝트를 가져와

행렬을 스택에 담고 , 각 오브젝트가 수행하는 프로그램을 실시한후

다시 행렬을 스택에서 뽑습니다.


흠...

결국엔 화면에 그리는 일을 오브젝트가 하라구 위임시켜 버렸는데요...

좀 프로그램 구조가 구리긴 하네여

이름만 렌더러지 전혀 렌더러 역할을 하지 않는 놈임 

어쨋든 이제 도구들을 더 만들어 놨기 때문에

저번보다는 쉽게 어떤 그럴싸한것들을 만들수 있을 겁니다.

 
Posted by 멍충한아싸

댓글을 달아 주세요

  1. 아델짱응

    오오미 잼난당께

    2012.07.03 10:04 [ ADDR : EDIT/ DEL : REPLY ]