OGRE 第一个程序

OGRE 第一个程序

江西理工 FangSH 2010109日星期六

 

关于VS2005的搭建。我自己的经验。编译时出现了什么错误就加什么。所以最后所有需要的头文件和库文件如下:

包含文件:

Samples\Common\include

Include

OgreMain\include

Dependencies\include

Dependencies\src\ois-1.2.0\include

库文件 :

lib\debug

bin\debug

lib\release

bin\release

Dependencise\lib\Debug

Dependencies\lib\Release

 

 

当然这之前是要先在VS2005配置好DirectX9.0的。

 大致的框架:

 

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

BasicTutorial2 app;
//<----这是我们要做的事!

try

{

app.go();

}

catch (Ogre::Exception &e)

{

::MessageBox(NULL, e.getFullDescription().c_str(),
"An exception has occured!",

MB_OK
| MB_ICONERROR | MB_TASKMODAL);

}

return0;

}

 

 我们要做的就是写一个BasicTutorial2了。

第三BasicTutorial2类

 

#pragma once

#include
"resource.h"

#include
"ExampleApplication.h"



class BasicTutorial2 : public ExampleApplication

{

public:

BasicTutorial2(
void);

virtual~BasicTutorial2(void);

protected:

virtualvoid createScene(void);

virtualvoid createCamera(void);

virtualvoid createViewports(void);

};

 

 

说明:

1 这个类主要是三个函数createCamera()createScene() createViewports();

2 ExampleApplication 这个类在ExampleApplication.h中, 而ExampleApplication.h在Samples\Common\include中。

 

void BasicTutorial2::createCamera(void)

{

// 创建一个摄像机

mCamera
= mSceneMgr->createCamera("PlayerCam");

// 设置摄像机的位置和方向

mCamera
->setPosition(Ogre::Vector3(0, 10, 500));

mCamera
->lookAt(Ogre::Vector3(0, 0, 0));

// 近距离裁剪

mCamera
->setNearClipDistance(5);

}

 

 

 

说明:由mSceneMgr创建。因为它是场景管理对象。OGRE的基石——实体,场景节点,场景管理器

 

void BasicTutorial2::createViewports(void)

{

// 创建一个视口并加入到窗口中

Ogre::Viewport
* vp = mWindow->addViewport(mCamera);

// 设置背景颜色

vp
->setBackgroundColour(Ogre::ColourValue(0.2, 0.1, 1));

// 设置纵宽比

mCamera
->setAspectRatio(Ogre::Real(vp->getActualWidth())/

Ogre::Real(vp
->getActualHeight()));

}

 

 

说明 :

什么是视口:你必须告诉渲染窗口哪些摄像机去呈现场景,哪部分窗口被渲染进来。你告诉渲染窗口的摄像机所呈现的区域就是视口,并且这里只有一个视口实体。

2 建立视口的方法通常是简单的调用渲染窗口中addViewport函数,把她提供给正在使用的摄像机。

 

 

void BasicTutorial2::createScene(void)

{

mSceneMgr
->setAmbientLight(Ogre::ColourValue(0, 0, 0));

// 设置加成模板阴影

mSceneMgr
->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);

// 人物加载进来

Ogre::Entity
* entNinja = mSceneMgr->createEntity("Ninja", "ninja.mesh");

// 投射阴影

entNinja
->setCastShadows(true);



// 将实体与场景节点绑定在一起

mSceneMgr
->getRootSceneNode()->createChildSceneNode()->attachObject(entNinja);



// 定义一个平面

Ogre::Plane plane(Ogre::Vector3::UNIT_Y,
0);



// 创建一个平面

Ogre::MeshManager::getSingleton().createPlane(
"ground",

ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,

1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);



// 创建场景结点并将实体与场景节点绑定在一起

Ogre::Entity
* entGround = mSceneMgr->createEntity("GroundEntity", "ground");

mSceneMgr
->getRootSceneNode()->createChildSceneNode()->attachObject(entGround);



// 贴纹理

entGround
->setMaterialName("Examples/Rockwall");

entGround
->setCastShadows(false);



// 点光源设置

Ogre::Light
* pointLight = mSceneMgr->createLight("pointLight");

pointLight
->setType(Ogre::Light::LT_POINT);

pointLight
->setPosition(Ogre::Vector3(0, 150, 250));

pointLight
->setDiffuseColour(1.0, 0.0, 0.0);

pointLight
->setSpecularColour(1.0, 0.0, 0.0);



// 有向光设置

Ogre::Light
* directionalLight = mSceneMgr->createLight("directionalLight");

directionalLight
->setType(Ogre::Light::LT_DIRECTIONAL);

directionalLight
->setDiffuseColour(Ogre::ColourValue(.25, .25, 0));

directionalLight
->setSpecularColour(Ogre::ColourValue(.25, .25, 0));

directionalLight
->setDirection(Ogre::Vector3( 0, -1, 1 ));



// 聚光源设置

Ogre::Light
* spotLight = mSceneMgr->createLight("spotLight");

spotLight
->setType(Ogre::Light::LT_SPOTLIGHT);

spotLight
->setDiffuseColour(0, 0, 1.0);

spotLight
->setSpecularColour(0, 0, 1.0);

spotLight
->setDirection(-1, -1, 0);



// 设置位置和方向来确定聚光源

spotLight
->setPosition(Ogre::Vector3(300, 300, 0));

spotLight
->setSpotlightRange(Ogre::Degree(35), Ogre::Degree(50));

}

 

 

说明:

1 ogre目前支持3种类型的阴影:

调制纹理阴影 (SHADOWTYPE_TEXTURE_MODULATIVE) 

调制模板阴影 (SHADOWTYPE_STENCIL_MODULATIVE)

加成模板阴影 (SHADOWTYPE_STENCIL_ADDITIVE)

2 用阴影在Ogre中相对来说是比较简单的。SceneManager类中有一个setShadowTechnique成员函数,我们可以使用她设置我们想要的阴影类型。这样只要你创建了一个实体,调用setCastShadows方法来设置这个实体是否投射阴影。

3 光源种类

点光源 (LT_POINT) - 从一个点发出光放射到四周。 

聚光源 (LT_SPOTLIGHT) - 严格来说聚光灯工作有点像手电筒。 你在某个地方设置了灯光的起点,然后灯光射向一个方向。你可以告诉光源内锥角度大小和外锥角度大小(你知道手电筒内部会明亮一些。) 

有向光 (LT_DIRECTIONAL) - 有向光模拟非常遥远地方的灯光,在场景中从某个方向照射物体。如果你想要一个夜晚的场景你就需要模拟月光。你可以通过为场景设置环境光来做到这个,但是这并非是真实场景的模拟因为月光并不平等地照亮所有物体(日光也不是)。一种方法解决这个是设置一个有向的光源然后指向一个方向,月光就会显示出来。

 

程序控制: 用键盘上WASD来移动,用鼠标观察四周。Ese键退出(OGRE框架默认的)

程序截屏:

 

--end

 

 

 

 

posted @ 2010-10-09 17:14  xyecho  阅读(841)  评论(0编辑  收藏  举报