ogre first steps

Post on 22-Feb-2016

116 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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”

• 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

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

the OGRE_HOME path by setting an environment variable:

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.

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

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

sure that Working Directory is set properly.

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.

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).

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.

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 +=

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("", "");

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

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

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

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

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);

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

Compiling OgreTemplate (cont’d)

• The view of the project in the Solution Explorer:

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

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

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

Running OgreTemplate

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

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();

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!

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);

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

top related