기초 튜토리얼 1-3 (마지막)

Ogre3D 삽질란/Basic Tutorial 1 2008. 11. 8. 12:04

해볼만 것들

이제 여러분은 Entity, SceneNode 그리고 SceneManager 기본기를 익혔습니다. 위에서 언급한 소스로부터 로봇을 추가하고 제거하는것을 해보길 권합니다. 해보셨으면 createScene 내용을 모두 지우고 다음의 소스코드들을 동작시켜 보시기 바랍니다 :

 

Scale

SceneNode scale 함수를 이용해서 메쉬의 크기를 조절할 있습니다. 스케일 수치를 바꿔보고 어떻게 바뀌는지 확인해 보세요 :

        Entity *ent1 = mSceneMgr->createEntity( "Robot", "robot.mesh" );

        SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode" );

        node1->attachObject( ent1 );

 

        node1->scale( .5, 1, 2 );

 

        Entity *ent2 = mSceneMgr->createEntity( "Robot2", "robot.mesh" );

        SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode2", Vector3( 50, 0, 0 ) );

        node2->attachObject( ent2 );

 

        node2->scale( 1, 2, 1 );

 

Rotations

yaw, pitch, roll 함수에 Degree 또는 Radian 수치를 적용해서 객체를 회전시킬 있습니다. Pitch x 축을 주위로 회전합니다. yaw y 그리고 roll z축을 중심으로 회전합니다.

오른손으로 방향을 있습니다 : 엄지손가락을 축으로 다음 다른 손가락이 가르키는 방향이 양의 각도입니다. 예를 들면 pitch(Degree(90)) 라면 엄지손가락은 오른쪽을 가르키고 다른 손가락은 회전방향을 의미합니다. 차근차근 생각해 보세요.

사용자 삽입 이미지

각도(Degree) 수치 조절과 위치변화를 다양하게 조합해 보세요 :

        Entity *ent1 = mSceneMgr->createEntity( "Robot", "robot.mesh" );

        SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( -100, 0, 0 )  );

        node1->attachObject( ent1 );

 

        node1->yaw( Degree( -90 ) );

 

        Entity *ent2 = mSceneMgr->createEntity( "Robot2", "robot.mesh" );

        SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode2");

        node2->attachObject( ent2 );

 

        node2->pitch( Degree( -90 ) );

 

        Entity *ent3 = mSceneMgr->createEntity( "Robot3", "robot.mesh" );

        SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode3", Vector3( 100, 0, 0 ) );

        node3->attachObject( ent3 );

 

        node3->roll( Degree( -90 ) );

 


Ogre
실행환경

OgreSDK "bin" 폴더 아래의 debug 또는 release 폴더에서 있는 많은 파일들 (*.dll, *.cfg) 섹션에서 참조할 있습니다. 디버그버젼으로 생성된 프로그램은 OgreSDK debug 폴더내의 파일들을 이용하고 릴리즈버젼의 프로그램은 release 폴더의 파일들을 사용하게 됩니다.

섹션의 대부분은 윈도우즈 환경하에서 다뤄집니다. 리눅스에서도 기본적인 사항들은 동일하게 적용되지만 몇몇 사항들은 약간 다를 있습니다. 만약 리눅스에서 오우거엔진 사용시 문제가 발생하면 오우거 help포럼에 글을 남겨주세요.

 

DLLs and Plugins

우리는 방금 오우거 환경에서 흥미로운 체험을 해봤습니다. 이제 평상시에 오우거 라이브러리를 사용할때 어떤 편리한 점이 있는지 설명하고자 합니다.

오우거는 크게 3개의 중요그룹으로 나눠지는데, 메인 라이브러리, 플러그인 그리고 써드파티 라이브러리로 나뉘어 집니다.

Main library.

첫번째 그룹은 오우거 라이브러리 자체와 밀접하게 연관되는 공유 라이브러리들을 포함합니다. OgreMain.dll 오우거본체 라이브러리가 포함됩니다. dll 파일은 cg.dll 같은 몇몇 다른 라이브러리를 필요로 합니다. DLL 들은 반드시 항상 오우거 어플리케이션과 함께 포함되어야 합니다.

Plugins.

두번째 공유 라이브러리는 플러그인 입니다. 오우거는 효율적인 기능성분할을 위해 공유라이브러리로 기능을 나누었으며 라이브러리들은 유저의 어플리케이션이 필요로 하는 정도에 따라서 기능을 제공할 도있고 그렇지 않을 있습니다. 오우거와 함께 사용되는 기본적 플러그인들은 "Plugin_" 이라는 prefix 시작되는 파일명을 가집니다. 유저가 필요로하는 플러그인은 유저 스스로 새로운 플러그인을 작성할 있지만, 어떤 튜토리얼에서도 다루지는 않을 계획입니다. 오우거는 렌더링 시스템을 위해서도 플러그인을 사용합니다(OpenGL, DirectX, 기타등등). 이러한 플러그인들은 "RenderSystem_" 이라는 prefix 가집니다. 플러그인들을 추가하거나 삭제하는것 으로도 유저의 어플리케이션의 렌더링 시스템을 설정할 있습니다. 다음과 같은 상황에서는 매우 유용한데 만약 유저가 (예를들면) OpenGL에만 해당되는 쉐이더 프로그래밍이나 특별한 작업을 하는경우 또는 DirectX 에서 동작되는 프로그램에서 OpenGL 기능을 강제로 끄고 싶을때 유저는 단순히 해당되는 렌더링시스템 플러그인을 제거하는 만으로도 기능은 제공되지 않도록 있십니다. 추가적으로 만약 유저가 비표준 플랫폼을 염두한다면 튜토리얼에서는 다루지는 않지만 유저만의 렌더링시스템 플러그인을 작성할 수도 있습니다. 플러그인을 어떻게 제거하는지는 다음 섹션에서 다룰 입니다.


써드파티 라이브러리와 helper 라이브러리.

세번째 공유라이브러리는 써드파티 라이브러리와 helper 라이브러리입니다. 오우거 자체로는 그냥 그래픽 렌더링 라이브러리일 입니다. GUI 시스템이라던지 입력컨트롤, 물리엔진, 기타등등.. 이러한 기능들은 가지고 있지 않습니다. 다른 라이브러리들을 사용하기위해서 다음과 같은 절차를 거쳐야 합니다. 오우거 데모들과 SDK 소수의 써드파티 helper 라이브러리들을 포함하고 있습니다. CEGUI 라이브러리는 오우거와 통합된 GUI 시스템이며 "OgreGUIRenderer.dll" "CEGUI*" 부터 시작되는 파일들은 GUI 시스템의 일부 입니다. CEGUI 사용하는 방법은 나중에 있을 튜토리얼에서 다루어질 입니다. 키보드와 마우스입력은 OIS(입력 시스템) 통해서 최종 처리됩니다. OIS OIS.dll 포함합니다. 이것들 말고도 다른 기능(물리엔진이나 사운드)들을 제공하는 라이브러리들 역시 존재하며(SDK 포함되지 않은것들) 이와 관련된 많은 정보는 위키와 같은 다른 포럼에서 찾을 있습니다.

가장 실용적이고 진정한 문제는 바로 눈앞에서 스스로 테스트 해보는 어플리케이션에서 나오며 모든 기능을 상태(아무것도 제거하지 않은상태) 하에서 테스트해 있습니다. 유저의 어플리케이션 배포가 준비되었을때 릴리즈모드에서 빌드를 해야 것이고 어플리케이션이 필요로 하는 모든 릴리즈용 DLL 파일은 포함되어야 해야 하며, 쓰지않는 DLL 파일은 제거되어야 입니다. 만약 프로그램이 CEGUI 쓰지 않지만 OIS 쓸때, CEGUI 관련 DLL 파일들을 포함하는데 고민할 필요는 없지만 OIS DLL 파일은 반드시 포함되어야 합니다. 그렇지 않으면 어플리케이션은 실행되지 않을 입니다.

 

환경설정 파일

오우거는 몇몇 환경설정파일을 사용합니다. 파일들은 어떠한 플러그인이 로드되어야 할지, 어플리케이션의 리소스들은 어디에 위치되었는지, 기타등등을 제어합니다. 이제 각각의 환경설정 파일들이 어떠한 일을 하는지 간단하게 살펴볼 것입니다. 만약 세부적인 궁금증이 있다면 바로 오우거 help 포럼으로 보내주세요.

plugins.cfg 파일은 유저의 어플리케이션이 사용하는 플러그인들을 포함합니다. 만약 유저 어플리케이션에서 플러그인을 추가하거나 제거하고 싶다면 파일을 수정하면 됩니다. 플러그인을 제거하기 위해서는 간단히 해당 라인을 제거하거나 라인 가장 앞에 # 붙이는 것으로 주석처리를 하면 됩니다. 플러그인을 추가하고 싶다면 "Plugin=[PluginName]" 같이 라인을 추가하면 됩니다. 참고로 플러그인 이름 끝에 ".DLL" 붙이지 마세요. 플러그인은 "RenderSystem_" 또는 "Plugin_" 으로 시작되어서도 안됩니다. 오우거가 플러그인들을 찾는 위치를 수정하기위해 "PluginFolder" 변수를 수정할 수도 있습니다. 상대경로, 절대경로 모두 사용가능하지만 $(변수) 형태의 환경변수는 사용할 없습니다.

resources.cfg 파일은 오우거가 리소스를 찾기위해 검색해야할 디렉토리 리스트를 담고 있습니다. 리소스는 스크립트, 메쉬, 텍스쳐, 기타 여러가지를 포함하고 있습니다. 절대경로, 상대경로 모두 사용 가능하지만 $(변수) 같은 환경변수는 사용할 없습니다. 참고로 오우거는 하위폴더를 검색하지 않기때문에 만약 여러단계의 폴더를 입력할 필요가 있다면 일일이 작성해 주어야 합니다. 예를 들면 "res\meshes" "res\meshes\small" 디렉토리 트리구조를 가진다면 위해 리소스 파일이 포함된 경로의 2가지 진입점을 리소스 파일에 추가해야 합니다.

media.cfg 파일은 리소스의 일부분에 대한 상세한 정보를 말해줍니다. 지금 시점에서는 수정할 필요가 없으므로 자세한 설명은 생략하겠습니다. 자세한 정보는 메뉴얼과 오우거 포럼에서 찾을 있습니다.

ogre.cfg 파일은 오우거 환경설정 화면에서 생성됩니다. 파일은 유저의 컴퓨터와 그래픽 설정 내용을 기술합니다. 다른 사람들이 각각 다른 설정을 가지는 처럼 유저가 어플리케이션을 배포할때는 파일이 같이 포함되어서는 안됩니다. 유의하실 점은 환경설정을 통하지 않고 파일을 직접적으로 수정하시면 안됩니다.

quake3settings.cfg 파일은 BSPSceneManager 함께 사용됩니다. BSPSceneManager(지금 시점에서는 쓰지 않습니다) 사용하기 전에는 필요하지 않은 파일이므로 무시하세요. 유저 어플리케이션에서 필요없다면 배포하지 마세요. 반면에, 만약 유저가 BSPSceneManager 이용한다면 프로그램의 필요성에 의해 포함될 있습니다.

모든 환경설정 파일들은 오우거에 직접적인 영향을 줍니다. 오우거는 "plugins.cfg", "resources.cfg", 그리고 "media.cfg" 파일들이 실행시 반드시 참조 가능해야합니다. 나중에 있을 튜토리얼에서는 파일들에 관한 내용과 세부적인 작업을 위해 어떻게 그들의 위치정보와 내용을 수정해야 할지를 다룰 입니다.

 

어플리케이션 테스트를 위한 나은 환경 구성하기

윈도우즈에서 비주얼C++ 사용하는 사람에게만 해당되는 내용입니다.

앞서 여러번 언급했던것 처럼(문제해결 섹션을 포함하여), 오우거는 유저의 프로그램에서 사용되는 각종 환경설정파일, DLL, 미디어 리소스 자원들에 대한 접근이 가능해야 합니다. 많은 사람들은 문제를 위해 OgreSDK bin 폴더로 부터 유저의 프로젝트 디렉토리로 필요한 DLL 파일들을 실행파일과 같은 위치로 복사하여 해결합니다. 방법이 아마 게임이든 다른종류의 프로그램이든 배포에 있어서 최고의 방법일 지도 모릅니다. 배포를 위해서 각종 플러그인을 넣고 빼고 하는 귀찮은 과정을 생략할 있기 때문이죠. 모든 DLL 파일들을 각각의 오우거 프로젝트 폴더로 복사해 넣는것은 공간적, 시간적 낭비임에도 불구하고 많은 상황에서 발생되고 있습니다. 여기 그런 낭비를 줄일 있는 방법이 몇가지 있습니다.

한가지 대안은 OgreSDK DLL 파일들을(플러그인 빼고) 윈도우즈 시스템 폴더로 복사하는 입니다. 이건 오우거를 이용한 실행파일이 어디에 있던간에 필요한 DLL 파일에 접근할 있는게 장점입니다. 작업을 수행하려면 resources.cfg, plugins.cfg 파일에서 media 폴더와 plugins 폴더의 절대경로를 알맞게 각각 수정해 줘야 합니다. 그럼 어디서 프로젝트를 생성하던지 수정된 환경설정 파일들만bin\debug bin\release 디렉토리로 부터 복사하기만 하면 됩니다. 그러나 저는 OgreSDK DLL 파일들의 위치관리가 안될것 같아서 개인적으로는 쓰지 않는 방식입니다. 오우거는 자주 새버젼이 발표되는데 방법으로 업데이트 하려면 귀찮아 집니다.

나은 대안으로는 OgreSDK 파일들은 그대로 놔두고 프로젝트의 작업디렉토리를 OgreSDK bin\release bin\Debug 디렉토리로 설정하는 입니다. 이렇게 하려면 프로젝트의 속성(디버깅 옵션에서)에서 "Working Directory" 입력창 내용을 "C:\OgreSDK\bin\$(ConfigurationName)" 바꿔 주세요. 기본값이 아닌 다른경로로 오우거를 설치했다면 "C:\OgreSDK" 부분을 실제로 설치한 경로로 바꿔줘야 합니다. 그렇게 하신다면 오우거 프로그램 동작을 위해서 아무런 파일도 복사하지 않아도 됩니다. 접근방법이 제가 개인적으로 사용하는 방법입니다. 가지 단점은 환경설정파일을 수정해야 경우, 모든 오우거 프로젝트를 수정해야 한다는것인데.. 안좋긴 합니다. 만약 접근방법을 이용하고 유저 프로젝트를 위해 환경설정파일을 수정해야 한다면 방법 대신에 하던대로 모든 파일을 프로젝트로 복사해 넣으시고 작업디렉토리를 원래 지정되어졌던 내용으로 바꿔주세요.

 

맺음말

이제 독자는 SceneManager, SceneNode 그리고 Entity 클래스에 대한 기초지식을 습득했습니다. 여기서 소개드린 모든 함수들에 대해서 억지로 익숙해질 필요는 없습니다. 소개드린것은 가장 기초적인 객체들이며 앞으로 자주 쓰이게 것입니다. 다음에 있을 몇몇 튜토리얼에서 여기서 소개드린 모든 것이 자연스럽게 친숙해 것입니다.

그리고 오우거 환경을 설정하는데에도 익숙해져야 합니다.

: