OGRE First Steps

27
OGRE First Steps Instructor: Dmitri A. Gusev Spring 2012 CSCI 340: Game Programming Lecture 3, January, 2012

description

OGRE First Steps. Instructor: Dmitri A. Gusev. Spring 2012 CSCI 340: Game Programming Lecture 3, January, 2012. Reading. Felix Kerger , Ogre 3D 1.7 Beginner’s Guide , Packt Publishing, 2010: Chapter 1, “Installing Ogre 3D ” Chapter 2, “The Ogre Scene Graph” - PowerPoint PPT Presentation

Transcript of OGRE First Steps

Page 1: OGRE First Steps

OGRE First Steps

Instructor: Dmitri A. Gusev

Spring 2012

CSCI 340: Game Programming

Lecture 3, January, 2012

Page 2: OGRE First Steps

Reading

• Felix Kerger, Ogre 3D 1.7 Beginner’s Guide, Packt Publishing, 2010:– Chapter 1, “Installing Ogre 3D”– Chapter 2, “The Ogre Scene Graph”

• http://www.ogre3d.org/tikiwiki/Installing+the+Ogre+SDK • How to compile samples for Ogre v. 1.7.3 SDK (Solution) http://

www.ogre3d.org/forums/viewtopic.php?f=2&t=68402 • http://www.ogre3d.org/tikiwiki/Building+Ogre (optional)• http://www.ogre3d.org/tikiwiki/SceneManagersFAQ • Basic Tutorial 1,

http://www.ogre3d.org/tikiwiki/Basic+Tutorial+1&structure=Tutorials

Page 3: OGRE First Steps

Compiling QuickStart1. Having compiled OGRE from source and/or installed it (as an SDK), add

the OGRE_HOME path by setting an environment variable:

Page 4: OGRE First Steps

Compiling QuickStart (cont’d)2. Open QuickStart.sln in Microsoft Visual Studio 2010 and convert the

project to a modern format if the need be.

Page 5: OGRE First Steps

Compiling QuickStart (cont’d)3. In main.cpp, make sure that the catch clause is as follows:

Page 6: OGRE First Steps

Compiling QuickStart (cont’d)4. Under Project→Properties→Configuration Properties→Debugging, make

sure that Working Directory is set properly.

Page 7: OGRE First Steps

Compiling QuickStart (cont’d)5. Under Project→Properties→Configuration Properties→C/C++, make sure that

Include Directories are set properly, so that Ogre.h and Boost can be found.

Page 8: OGRE First Steps

Compiling QuickStart (cont’d)6. Under Project→Properties→Configuration Properties→Linker→Input,

make sure that Additional Dependencies are set properly, so that OgreMain_d.lib and Boost can be found.

7. Build Solution (F7).

Page 9: OGRE First Steps

Running QuickStart

The OGRE Render Window will close after 15 sec. Challenge: See if you can modify main.cpp so that the Rendering Setup window appears on every run, and not just the first time around.

Make sure that plugins.cfg is in your working directory! Clone plugins_d.cfg if needed.

Page 10: OGRE First Steps

Compiling and Running Manual• The process is similar to compiling and running QuickStart• Some peculiarities:

– #include "OgreTimer.h" … Ogre::Timer* timer = new Ogre::Timer(); ... delete timer;

– add _d to all plugin names for the Debug mode– const RenderSystemList *rList = &(root->getAvailableRenderers()); // for type matching

RenderSystemList::const_iterator it; it = rList->begin();

– RenderWindow *window = root->createRenderWindow( // Changed rSys to root!– // accumulate total elapsed time

s = (float)timer->getMilliseconds() / 1000.0f; // use = instead of +=

Page 11: OGRE First Steps

Ogre Log• The log output that Ogre generates contains:

– all events– system initialization– state and capabilities information from each run

• You are required to have an Ogre log file!• Creating a LogManager:// create an instance of LogManager prior to using LogManager::getSingleton()LogManager* logMgr = new LogManager;Log *log = LogManager::getSingleton().createLog("mylog.log",true,true,false);

// third param is not used since we have already created a log in the previous step

Root *root = new Root("", "");

Page 12: OGRE First Steps

Embedding the Ogre Render Window

• Ogre’s NameValuePairList class is a typedef of the STL map class// hWnd is a handle to an existing Win32 window// renderSystem points to an existing, initialized instance of D3D9RenderSystemNameValuePairList opts;opts["parentWindowHandle"] = StringConverter::toString(hWnd);// Everything but "opts" is somewhat irrelevant in the context of // an explicitly parented windowRenderWindow *window = renderSystem->createRenderWindow(

"WindowName",800, 600,false, &opts);

• This code will allow you to embed the Ogre render window in an existing window of your choice

Page 13: OGRE First Steps

Types of Scene Manager• A scene is an abstract representation of what is shown in a virtual world.

Scenes may consist of – static geometry such as terrain or building interiors, – models such as trees, chairs or monsters, – light sources that illuminate the scene, and – cameras that view the scene.

• A SceneManager instance is created like this:SceneManager *sceneMgr = root->createSceneManager(ST_GENERIC);

• Types of scene manager:– ST_GENERIC — Generic scene manager (Octree if you load

Plugin_OctreeSceneManager, DotScene if you load Plugin_DotSceneManager); Most useful for minimally complex scenes

– ST_INTERIOR — BSP scene manager; Optimized for rendering interior– ST_EXTERIOR_CLOSE — Terrain Scene Manager; Optimized for rendering outdoor

scenes with near-to-medium visibility, such as those based on tiled single-page terrain mesh or heightfield

– ST_EXTERIOR_REAL_FAR - Paging Scene Manager; Typically suited for paged landscape, such as a planet

Page 14: OGRE First Steps

Camera

• A camera “takes a picture” of your scene each frame, from a particular vantage point

• A camera has a position and an orientation• If you have one camera in the field of view of

another, the camera object will not be rendered

• A camera can be either attached to a scene node, or moved around manually

Page 15: OGRE First Steps

Camera Frustum• A camera has a field of view with near and far clip planes.

This geometry defines a frustum, which is a pyramid with its tip chopped off

Page 16: OGRE First Steps

Setting Up a Camera• You supply:– position,– direction,– the near and far clip distances,– the aspect ratio of the camera (defined as X/Y),– the vertical field-of-view angle W (in radians) between the line of sight and the lower frustum-bounding plane

• Example:// Create the camera for mSceneMgr, an existing SceneManager instancemCamera = mSceneMgr->createCamera("PlayerCam");// Position it at 80 in Z directionmCamera->setPosition(Ogre::Vector3(0,0,80));// Look back along -ZmCamera->lookAt(Ogre::Vector3(0,0,-300));// Set near and far clip distances to 5 and 1000mCamera->setNearClipDistance(5.0f);mCamera->setFarClipDistance(1000.0f);// Set field-of-view Y angle to the radian equivalent of 30 degreesmCamera->setFOVy((Ogre::Radian)30.0f*3.14159265358979f/180.0f);

Page 17: OGRE First Steps

Compiling OgreTemplate

• OgreTemplate is our name for the application found in Basic Tutorial 1, http://www.ogre3d.org/tikiwiki/Basic+Tutorial+1&structure=Tutorials

• The process of setting up the application using MS Visual Studio 2010 is described at http://www.ogre3d.org/tikiwiki/Setting+Up+An+Application+-+Visual+Studio&structure=Development?tikiversion=Visual+Studio+2010+-+VC10

• Some discrepancies between the online document referenced above and my actual implementation are covered in the subsequent slides

Page 18: OGRE First Steps

Compiling OgreTemplate (cont’d)

• The view of the project in the Solution Explorer:

Page 19: OGRE First Steps

Compiling OgreTemplate (cont’d)• Project → Properties → Configuration Properties → General:

Page 20: OGRE First Steps

Compiling OgreTemplate (cont’d)• Project → Properties → Configuration Properties → Debugging:

Page 21: OGRE First Steps

Compiling OgreTemplate (cont’d)• Project → Properties → Configuration Properties → C/C++ → General →

Additional Include Directories:– include;– "$(OGRE_HOME)\include";– "$(OGRE_HOME)\Dependencies\include\OIS";– "$(OGRE_HOME)\Samples\Common\include";– "$(OGRE_HOME)\boost_1_43_0"

• Project → Properties → Configuration Properties → Linker → General → Additional Library Directories:

– "$(OGRE_HOME)\lib\$(ConfigurationName)";– "$(OGRE_HOME)\Dependencies\lib\$(ConfigurationName)";– "$(OGRE_HOME)\boost_1_43_0\lib"

• Project → Properties → Configuration Properties → Linker → Input → Additional Dependencies:

– For Debug configuration: OgreMain_d.lib OIS_d.lib– For Release configuration: OgreMain.lib OIS.lib

Page 22: OGRE First Steps

Running OgreTemplate

Page 23: OGRE First Steps

Running OgreTemplate (cont’d)

• Controls:– F — toggle visibility of advanced frame stats– G — toggle visibility of debugging details– T — cycle polygon rendering mode: trilinear, anisotropic, none, bilinear

(difference is not noticeable)– R — cycle polygon rendering mode: wireframe, points, solid– W, A, S, D, ↑,←,↓,→ — camera movement: position change– mouse movement — camera movement: orientation change– Esc — exit

Page 24: OGRE First Steps

Rendering Modes

• Wireframe:camera->setPolygonMode(PM_WIREFRAME);

• “Points” (only the vertices are rendered):camera->setPolygonMode(PM_POINTS);

• Solid (the default):camera->setPolygonMode(PM_SOLID);

• Retrieving the current rendering mode value:PolygonMode mode = camera->getPolygonMode();

Page 25: OGRE First Steps

Camera Movement• void move(const Vector3& vec); // move in world space• void moveRelative(const Vector3& vec); //move in local space• void roll(const Radian& angle); // rotate anticlockwise around

// the camera’s local Z axis• void yaw(const Radian& angle); // rotate anticlockwise around

// the camera’s local Y axis• void pitch(const Radian& angle); // rotate anticlockwise around

// the camera’s local Z axis• void setAutoTracking(bool enabled, SceneNode* target = 0,

const Vector3& offset = Vector3::ZERO); // follow a node

// turn off tracking before deleting the tracked node!

Page 26: OGRE First Steps

Viewports• A single Camera instance can drive zero or more Viewport objects• Viewports can overlap• A z-order determines what viewports will render “on top” of

other viewports in use• The z-order of zero belongs to the viewport underneath all others• Only one viewport can occupy a given z-order for a render

window• Each viewport can have an independent background color• Overlays are rendered by default in all viewports; you can turn off

overlay rendering on a per-viewport basis:vpTop->setOverlaysEnabled(false);

Page 27: OGRE First Steps

Main Rendering Loop

• A typical Ogre application renders one frame after another until you tell it to stop

• So far, we invoked the main rendering loop by calling Root::startRendering()

• Root::startRendering() starts a loop that repeatedly calls another method: renderOneFrame().

• You can implement the main rendering loop “manually” using renderOneFrame().

• If you do that, you can still use FrameListener classes: renderOneFrame() is the method that notifies any registered frame listeners in Root