리뉴얼 하면서 많이 손대고 있는 부분 중 하나인 SceneGraph 입니다. SceneGraph라 하면 3D Scene을 구성하는데 있어 가장 기본 적인 단위라 할수 있는데, SceneNode의 기본 적인 토대는 대부분 비슷하지만 그걸 이루는 방식은 엔진마다 방법이 다 다르다 할 정도로 다양 합니다.
SceneNode 자체는 구현이 굉장히 간단합니다. 부모와 자식을 갖을수 있도록 해주면 됩니다.
class ev_CSceneNode { public: ev_CSceneNode( const tstring& strName ); virtual ~ev_CSceneNode( void ); public: virtual HRESULT Update( const DWORD dwElapsedTime ); virtual HRESULT AddChild( ev_ISceneNodePtr spChild ); virtual HRESULT RemoveChild( const tstring& strName ); virtual HRESULT RemoveAllChild( void ); private: ev_CSceneNode* m_pParent; ISceneNodeList m_Children; };
ISceneNode는 ev_CSceneNode의 인터페이스 클래스이고, 뒤의 Ptr은 Boost의 shared_ptr을 통해 재정의한 스마트 포인터 타입니다. ISceneNodeList는 vector 컨테이너를 ISceneNodePtr 타입으로 정의해놓은 타입니다.
SceneNode는 행렬 정보를 갖으며, 부모와 자식을 포함 합니다. 자식은 여럿이 될수 있습니다. 간단한 예를 들면 인체 표현을 들수 있습니다. 몸통 메시가 있고, 그 자식으로 머리/팔/다리 등이 몸통에 붙죠. 앞서 말씀 드린대로 SceneNode는 행렬 정보를 갖는데, 자식은 부모 행렬을 기반으로 업데이트 됩니다. 그렇기 때문에 몸통이 움직이면 머리/팔/다리도 몸통을 따라가게 되죠( 이부분은 Update 함수내에서 구현 되겠죠. m_pParent를 통해 부모의 행렬 정보를 얻게 됩니다 ).
여기까지는 대부분의 SceneGraph를 사용하는 엔진의 공통된 부분이라 할수 있습니다. 이후 문제는 이 SceneNode를 어떻게 활용하냐인데, 방식이 굉장히 많습니다. 3D 게임에서는 메시만 덜렁 그린다고 해서 게임이 되는것이 아니니 말입니다.
리뉴얼을 위해 MindMap을 이용해 생각나는대로 끄적여봤습니다. 간단히 오우거3D와 GCC방식도 비교해봤고, 게임브리오2.6 방식은 좀더 분석해봐야 겠습니다.
클릭하시면 크게 보입니다
언리얼은 어떤 방식인지도 궁금한데 구경해볼 기회가 없네요. SceneGraph를 구현해보신 분들은 어떻게 하셨나요?
같이 정보를 공유해보아요. :)