기초 튜토리얼 1-1
Ogre3D 삽질란/Basic Tutorial 1 2008. 11. 8. 16:58
기초 튜토리얼 1 (번역 : n_Sys)
입문자 튜토리얼 1: SceneNode, Entity, SceneManager 의 구성
이 튜토리얼을 진행하다가 문제점이 생기면 Help 포럼(http://www.ogre3d.org/phpBB2/viewforum.php?f=2)에 문의하세요.
목차 3.2.4 비주얼 스튜디오에서 프로그램이 동작하지 않는문제 |
미리 알아야 할 것들
이 튜토리얼은 C++ 프로그래밍을 할줄 알고 오우거 어플리케이션을 셋업하고 실행할 줄 안다는 가정하에 진행됩니다. (만약 오우거 어플리케이션 설정에 문제점이 있으면 컴파일러별 프로그램 설정 가이드를 참고하세요. - 역자주 : 프로그램 설정 가이드는 번역을 생략합니다) 이 튜토리얼은 설정가이드에서 설정이외의 사전 지식은 필요 없습니다..
소개
이번 튜토리얼에서는 오우거엔진에서 가장 기초적인 구성물을 소개합니다. (장면관리자-SceneManager, 장면노드-SceneNode, 엔티티-Entity 객체) 앞으로 코드의 많은부분을 다루지는 않을것이지만 독자가 오우거 엔진을 시작하는데 필요한 일반적인 컨셉들에 촛점을 맞출 것 입니다.
튜토리얼을 진행하면서 독자는 진행단계에 맞추어서 천천히 코드를 스스로 입력하고 결과물을 지켜 볼 필요성이 있습니다. 오우거엔진의 개념을 따라잡는대에는 이것만한 방법이 없습니다! 대충 눈으로 훑고 넘어가지 마세요.
시작하기
최초 코드
이 튜토리얼에서는 미리 작성된 기본코드를 사용할 것입니다. 나중에 내용을 채우게 될createScene 함수를 제외하고는 모두 무시하셔도 됩니다. 나중에 오우거 어플리케이션이 어떻게 동작되는지를 좀 더 자세하게 살펴볼 예정이지만 지금은 이제 막 시작한 단계에 불과합니다. 독자가 사용하는 컴파일러에서 프로젝트를 생성하고 아래 코드를 포함한 소스파일을 추가하세요.
#include "ExampleApplication.h"
class TutorialApplication : public ExampleApplication
{
protected:
public:
TutorialApplication()
{
}
~TutorialApplication()
{
}
protected:
void createScene(void)
{
}
};
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
TutorialApplication app;
try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.what(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occurred: %s\n",
e.what());
#endif
}
return 0;
}
만약 오우거SDK 를 Windows 에서 사용한다면 "[OgreSDK_DIRECTORY]\samples\include" 디렉토리(ExampleApplication.h 파일이 있는곳) 를 include 가 가능하도록 프로젝트에 추가해 주세요. 만약 오우거엔진 소스를 직접 사용하신다면 [OgreSource_DIRECTORY]\Samples\Common\include" 을 추가해 주세요. 비록 이 코드가 까만 화면에 프레임수를 보여주는 썰렁한 화면만 보여주는 프로그램이지만 일단은 컴파일 및 실행이 되도록 해두세요. 다음 과정에서 화면에 뭔가를 더 추가할 것 입니다.
프로그램이 동작되면 WASD 키로 움직이고 마우스로 주변을 둘러보는 기능을 합니다. ESC 키는 종료키 입니다.
문제점 해결하기
만약 진행하는데 문제점이 발생하면 'Setting Up An Application'(http://www.ogre3d.org/wiki/index.php/SettingUpAnApplication) 에서 컴파일러 속성을 체크해 보거나 Ogre.log 파일에서 좀 더 자세한 에러정보를 참조하세요. 만약 도움이 필요하다면 포럼을 검색 (http://www.ogre3d.org/phpBB2/search.php)해 주세요. 아마 다른 많은 사람들도 똑같은 문제점을 겪었을 겁니다. 만약 새로운 이슈라면 포럼규칙 (http://www.ogre3d.org/phpBB2/viewtopic.php?t=11886)을 읽어보시고 질문(http://www.ogre3d.org/phpBB2/viewforum.php?f=2)을 하세요. Ogre.log 파일에서 에러와 관련된 항목이나 예외사항, 에러메세지, 컴파일러 디버거에서 제공하는 정보들을 제공하시는 것이 다른 유저들로부터 답변을 받는데 도움이 될 것입니다.
나중에 있을 튜토리얼에서는 문제점 해결방법을 포함하지 않을 것 입니다. 그러니 문제점이 발생되면 여기 이어지는 섹션을 주의깊게 살펴보세요.
Message Box 문제
유니코드를 지원하는 비주얼스튜디오를 사용한다면 다음 에러가 생길 수 있습니다 :
error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char *' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
이 문제는 MessageBox 함수가 유니코드(Unicode)를 받아야 할 시점에 안시(ANSI) 코드를 받아서 일어난 에러입니다. 이걸 고치기 위해서는 다음라인을 고쳐 주세요 :
MessageBox( NULL, e.what(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
이 라인을 다음 라인처럼 수정합니다:
MessageBoxA( NULL, e.what(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
또는 컴파일러에서 유니코드지원 기능을 끄는 방법도 있습니다. 그러나 그렇게 하면 유니코드지원 기능 자체를 사용하지 못하게 됩니다.
이 에러가 발생하는 이유는 "MessageBox" 함수가 자동적으로 MessageBoxA (ANSI) 또는 MessageBoxW (Wide/Unicode) 를 프로젝트 설정에 기준하여 선택하기 때문입니다. 이 코드에서는 ANSI버젼을 강제적으로 사용하게끔 하게 하여 에러를 고칩니다.
환결성정 파일이나 DLL 파일이 없는 문제
새롭게 작성한 프로그램을 빌드하려는데 DLL 파일이 없다거나 환경설정파일(*.cfg) 이 없다고 빌드가 안된다면 아마 OgreSDK 폴더로부터 복사하지 않았기 때문일 겁니다. 비주얼스튜디오 에서 릴리즈 모드로 빌드할때 릴리즈 실행파일은 [ProjectFolder]\bin\release 에 생성하고 디버그 실행파일은 [ProjectFolder]\bin\debug 폴더에 생성됩니다. 즉 OgreSDK 폴더의 "*.dll" 파일과 "*.cfg" 파일을 해당 폴더로 복사해 주어야 합니다. 다시 말하면 [OgreSDK]\bin\release 폴더로부터 [ProjectFolder]\bin\release 폴더로 복사하고 [OgreSDK]\bin\debug 로부터 [ProjectFolder]\bin\debug 로 복사해야 한다는 말 입니다. 그리고 resources.cfg 파일이 옳바른 경로를 가르키도록 수정해줄 필요도 있습니다. 다음 섹션에서 이 부분에 대해서 더 자세하게 다룰 것 입니다.
리소스나 플러그인 문제점들
Plugin.cfg 파일과 Resources.cfg 파일을 실행파일과 같은 폴더에 두세요. Plugin.cfg 파일은 오우거엔진에게 어떤 렌더링 라이브러리가 사용 가능한지(Direct3D9, OpenGL, 기타등등..)를 알려줍니다. Resources.cfg 파일은 ExampleApplication 클래스나 텍스쳐, 메쉬, 그리고 스크립트가 어디에 위치하고 있는지에 대한 상세한 경로를 기술합니다. 둘다 텍스트 파일기때문에 어렵지 않게 내부에서 가르키는 경로를 옳바른 경로로 수정할 수 있습니다. 경로가 잘못된다면 오우거엔진 설정 대화상자로 아무런 렌더링 라이브러리를 선택할 수 없게 되거나 화면상으로 에러메세지를 출력하거나 Ogre.log 파일에 다음과 비슷한 에러메세지를 보게 될 겁니다.:
Description: ../../Media/packs/OgreCore.zip - error whilst opening archive: Unable to read zip file
이 경우에는 Resources.cfg 파일을 열고 폴더 위치를 오우거엔진에 포함된 미디어 폴더가 위치한 포인트로 경로를 바꿔주세요. 알아 두셔야 할것은 $(변수) 와 같은 환경경로변수 는 이 파일 내부에서 사용할 수 없습니다.
비주얼 스튜디오에서 프로그램이 실행되지 않는문제
만약 비주얼스튜디오 또는 비주얼 C++ 에서 어플리케이션을 생성하고 실행하는데 환경설정문제가 있다면 다수의 경우 디버거 설정문제 입니다. 만약 플레이버튼(메뉴에서 Start Debugging을 누르는것과 동일) 을 누르고 환경설정 파일(*.cfg)을 찾을 수 없다는 예외처리 메세지를 보게 된다면 작업 디렉토리 (Working Directory) 가 제대로 설정되지 않았다는 뜻 입니다.
이러한 문제점을 해결하기위한 정확한 해결방법은 비주얼 C++ 버젼에 따라서 다양하기때문에 제가 정확한 해결방법을 제시할 수 는 없지만 기본적인 해결 방법은 동일합니다. 프로젝트의 Solution explorer 에서 (Solution 자체가 아닙니다) 오른쪽 클릭을 하고 properties 메뉴로 갑니다. 어딘가에 디버깅 옵션을 위한 속성이 있을겁니다. 디버깅 옵션에는 "Working Directory" 입력창이 있을겁니다. 그 입력창에 해당 프로젝트의 실행파일이 생성 되는 위치로 바꿔주세요.
만약 여기다가 뭘 입력해야 할지 모르겠으면 "Command" 입력란에 입력된 내용을 똑같이 "Debugging" 에 써 넣어주세요. 예를 들면 비주얼C++ 2003에서는 "Command" 입력란은 "..\..\bin\$(ConfigurationName)\$(TargetFileName)" 과 비슷해야 합니다. "Working Directory" 의 내용에서는 파일명(TargetFileName)을 제거해야 합니다. 이런 경우에는 작업디렉토리는 "..\..\bin\$(ConfigurationName)" 가 되어야 합니다. 정확한 입력은 비주얼C++ 버젼에 따라 다르고 빌드환경에 따라서도 달라집니다. 그렇기 때문에 이 작업을 하기전에 Command 입력란을 체크해 두세요. 작업디렉토리의 릴리즈모드와 디버그 모드 둘다 바꾸는것도 잊지 마세요.
비주얼C++ 2005에서는 전체적으로 많이 다를겁니다. "..\..\bin\$(ConfigurationName)" 로 먼저 해보시는걸 권장하고, 여전히 문제가 지속된다면 Help 포럼에서 상담을 받아보세요.
이렇게 하는 이유는 오우거엔진은 실행파일과 동일한 디렉토리에 특정한 중요한 필수 파일들을 필요로 하기때문에 Working Directory 는 필수적으로 있어야 하는 파일들이 포함된 디렉토리가 되어야 합니다..