중급 튜토리얼 4-1
중급 튜토리얼 4 (번역 : n_Sys)
중급 튜토리얼 4: Volume Selection(영역 선택) 및 Manual Object기초
이 튜토리얼 진행에 있어서 문제가 생긴다면 Help 포럼에 문의하세요.
목차 |
소개
이 튜토리얼에서는 영역 선택(volume selection)에 대한 내용을 다룹니다. 마우스를 드래그하여 생성되는 흰색 사각형안에 포함되는 영역이 선택되게끔 하는 기법입니다. 마우스버튼을 떼면 선택된 영역안의 모든 객체들이 하이라이트화 됩니다. 이런 기능을 구현하기 위해서 2가지 종류의 객체들에 대한 사용법을 익혀야 합니다 : ManualObject(사각형생성용)와 PlaneBoundedVolumeListSceneQuery입니다. 앞으로 소개드릴 ManualObject에 대한 기초적인 사용법은 간단한 소개에 불과한 내용이며 3D객체를 생성하는 내용은 담고있지 않습니다. 이 튜토리얼에서 필요한 내용만 다룰예정 입니다.
이 튜토리얼에 대한 코드는 여기서 찾을 수 있습니다. 이 내용을 스스로 천천히 진행하면서 완성되어지는 결과물을 직접 확인하세요
사전 준비사항
프로젝트에서 Cpp 소스파일을 하나 생성한 다음 다음 코드를 추가하세요 :
#include <CEGUI/CEGUI.h>
#include <OgreCEGUIRenderer.h>
#include "ExampleApplication.h"
class SelectionRectangle : public ManualObject
{
public:
SelectionRectangle(const String &name)
: ManualObject(name)
{
}
/**
* Sets the corners of the SelectionRectangle. Every parameter should be in the
* range [0, 1] representing a percentage of the screen the SelectionRectangle
* should take up.
*/
void setCorners(float left, float top, float right, float bottom)
{
}
void setCorners(const Vector2 &topLeft, const Vector2 &bottomRight)
{
setCorners(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
}
};
class DemoListener : public ExampleFrameListener, public OIS::MouseListener
{
public:
DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager)
: ExampleFrameListener(win, cam, false, true), mSceneMgr(sceneManager), mSelecting(false)
{
mMouse->setEventCallback(this);
} // DemoListener
~DemoListener()
{
}
/* MouseListener callbacks. */
bool mouseMoved(const OIS::MouseEvent &arg)
{
CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
return true;
}
bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
void performSelection(const Vector2 &first, const Vector2 &second)
{
}
void deselectObjects()
{
std::list<MovableObject*>::iterator itr;
for (itr = mSelected.begin(); itr != mSelected.end(); ++itr)
(*itr)->getParentSceneNode()->showBoundingBox(false);
}
void selectObject(MovableObject *obj)
{
obj->getParentSceneNode()->showBoundingBox(true);
mSelected.push_back(obj);
}
private:
Vector2 mStart, mStop;
SceneManager *mSceneMgr;
PlaneBoundedVolumeListSceneQuery *mVolQuery;
std::list<MovableObject*> mSelected;
SelectionRectangle *mRect;
bool mSelecting;
static void swap(float &x, float &y)
{
float tmp = x;
x = y;
y = tmp;
}
};
class DemoApplication : public ExampleApplication
{
public:
DemoApplication()
: mRenderer(0), mSystem(0)
{
}
~DemoApplication()
{
if (mSystem)
delete mSystem;
if (mRenderer)
delete mRenderer;
}
protected:
CEGUI::OgreCEGUIRenderer *mRenderer;
CEGUI::System *mSystem;
void createScene(void)
{
mRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
mSystem = new CEGUI::System(mRenderer);
CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme");
CEGUI::MouseCursor::getSingleton().setImage((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
mCamera->setPosition(-60, 100, -60);
mCamera->lookAt(60, 0, 60);
mSceneMgr->setAmbientLight(ColourValue::White);
for (int i = 0; i < 10; ++i)
for (int j = 0; j < 10; ++j)
{
Entity *ent = mSceneMgr->createEntity("Robot" + StringConverter::toString(i + j * 10), "robot.mesh");
SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(i * 15, 0, j * 15));
node->attachObject(ent);
node->setScale(0.1, 0.1, 0.1);
}
}
void createFrameListener(void)
{
mFrameListener = new DemoListener(mWindow, mCamera, mSceneMgr);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
};
#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
DemoApplication app;
try {
app.go();
} catch(Exception& e) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBoxA(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;
}
컴파일이 제대로 되는지 확인하세요. 실행시키면 마우스커서를 움직일 수 있을겁니다. 하지만 그 외에는 아무기능도 없습니다. ESC키를 눌러서 빠져나오세요.