중급 튜토리얼 2-1

Ogre3D 삽질란/Intermediate Tutorial 2 2008. 12. 10. 18:33

중급 튜토리얼 2 (번역 : n_Sys)

중급 튜토리얼 2: RaySceneQuery, Mouse 조작법 기본

튜토리얼 진행에 있어서 문제가 생긴다면 Help 포럼 문의하세요.

 

목차

                               1 소개

                               2 사전 요구사항

                               3 시작하기

                               4 장면 설정

                               5 FrameListener 소개

                               6 FrameListener 설정

                               7 Mouse Look 추가

                               8 지형충돌 감지

                               9 지형 선택

                               10 심화학습용 문제들

                                       10.1 쉬운 문제

                                       10.2 보통 문제

                                       10.3 어려운 문제

                                       10.4 고급 문제

 

소개

이번 튜토리얼에서는 기초적인 장면 에디터를 만들예정입니다. 진행하면서 다음 내용들을 다룹니다 :

1.    RaySceneQuery 이용하여 지형밖으로 카메라가 이탈하는 것을 방지하는법

2.    the MouseListener MouseMotionListener 인터페이스의 사용법

3.    마우스를 이용해서 지형의 x, y좌표를 선택하는법

튜토리얼에 대한 코드는 여기 찾을 있습니다. 내용을 스스로 천천히 진행하면서 완성되어지는 결과물을 직접 확인하세요.

 

사전 요구사항

튜토리얼은 여러분이 Ogre project 어떻게 설정하고 컴파일 하는지에 대해서 이미 알고있다고 가정합니다. 오우거의 기본적인 객체들(장면노드, 엔티티, 기타등등) 알고 있어야 합니다. 튜토리얼에서 쓰이는 STL 반복자에 대한 지식도 필요합니다. (오우거에서 STL 사용이 잦습니다. STL 대해서 익숙치 않다면 짬을내서 배워두시는게 좋을겁니다.)

 

시작하기

데모를 만들기위해서 새로운 프로젝트를 생성합니다. "MouseQuery.cpp" 이름의 파일을 추가하고 다음 내용을 추가하세요 :

#include <CEGUI/CEGUISystem.h>

#include <CEGUI/CEGUISchemeManager.h>

#include <OgreCEGUIRenderer.h>

 

#include "ExampleApplication.h"

 

class MouseQueryListener : public ExampleFrameListener, public OIS::MouseListener

{

public:

 

    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer)

        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer)

    {

    } // MouseQueryListener

 

    ~MouseQueryListener()

    {

    }

 

    bool frameStarted(const FrameEvent &evt)

    {

        return ExampleFrameListener::frameStarted(evt);

    }

 

    /* MouseListener callbacks. */

    bool mouseMoved(const OIS::MouseEvent &arg)

    {

        return true;

    }

 

    bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)

    {

        return true;

    }

 

    bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)

    {

        return true;

    }

 

 

protected:

    RaySceneQuery *mRaySceneQuery;     // The ray scene query pointer

    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down

    int mCount;                        // The number of robots on the screen

    SceneManager *mSceneMgr;           // A pointer to the scene manager

    SceneNode *mCurrentObject;         // The newly created object

    CEGUI::Renderer *mGUIRenderer;     // CEGUI renderer

};

 

class MouseQueryApplication : public ExampleApplication

{

protected:

    CEGUI::OgreCEGUIRenderer *mGUIRenderer;

    CEGUI::System *mGUISystem;         // cegui system

public:

    MouseQueryApplication()

    {

    }

 

    ~MouseQueryApplication()

    {

    }

protected:

    void chooseSceneManager(void)

    {

        // Use the terrain scene manager.

        mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);

    }

 

    void createScene(void)

    {

    }

 

    void createFrameListener(void)

    {

        mFrameListener = new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer);

        mFrameListener->showDebugOverlay(true);

        mRoot->addFrameListener(mFrameListener);

    }

};

 

 

#if OGRE_PLATFORM == PLATFORM_WIN32 || 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

    MouseQueryApplication app;

 

    try {

        app.go();

    } catch(Exception& e) {

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32

        MessageBox(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);

#else

        fprintf(stderr, "An exception has occurred: %s\n",

            e.getFullDescription().c_str());

#endif

    }

 

    return 0;

}


컴파일이 제대로 되는지 확인하세요.

 

: