Ogre基础教程二

声明:此文章是根据Ogre官方的wiki翻译的,如有翻译错误,希望高手进行指正,原文在此:

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

 

入门

就象上一篇教程,我们将会使用一个预先定义好的代码模板做为开始,我们将在BasicTutorial2类里添加BasicTutorial2 : createViewport和BasicTutorial2 : createCamera两个方法,虽然这两个函数已经在BaseApplication类里定义了。但是现在我们需要看看Cameras和Viewports是如何被创建及使用的。

BasicTutorial2类的头文件里为createCamera和createViewports函数添加描述,代码如下:

 

/**
BasicTutorial2.h
**/
class BasicTutorial2 : public BaseApplication
{
public:
	BasicTutorial2(void);
	virtual ~BasicTutorial2(void);
 
protected:
	virtual void createScene(void);
	virtual void createCamera(void);
	virtual void createViewports(void);
};
 

   接下来你需要添加函数的定义来实现BasicTutorial2

 

  /**

BasicTutorial2.cpp
**/
//-------------------------------------------------------------------------------------
BasicTutorial2::BasicTutorial2(void)
{
}
 
//-------------------------------------------------------------------------------------
BasicTutorial2::~BasicTutorial2(void)
{
}
 
//-------------------------------------------------------------------------------------
void BasicTutorial2::createCamera(void)
{
}
 
//-------------------------------------------------------------------------------------
void BasicTutorial2::createViewports(void)
{
}
 
//-------------------------------------------------------------------------------------
void BasicTutorial2::createScene(void)
{
}

Cameras

 

Ogre Cameras

一个Camera是用来观察我们创建的场景的,它的工作原理和SceneNode类似,一个Camera对象有setPosition,yaw,roll和pitch函数,而且你可以将他添加到任何SceneNode的对象上,就像SceneNodes对象,它的位置是和父对象(SceneNode)相对的,对于移动和旋转,你基本上可以认为一个Camera就是一个SceneNode。

 

关于Camera,有一件事情和你想的不一样,那就是你应该一次只使用一台Camera。就是说,你不必创建一个Camera去观察场景的其中一部分,然后在创建另一个Camera去观察场景的另一部分,并启用其中一个Camrea来显示你需要的场景。相反,你可以只创建多个SceneNode,他们扮演了相机持有者的角色,他们坐在Camera想观察的场景中,等到需要显示这个场景的时候,只要把Camera添加到合适的SceneNode就可以了,我们会在FrameListener 教程中重温这项技术。

 

创建一个Camera

我们将会重写 BaseApplication中默认的用来创建Camera的方法。

BasicTutorial2.cpp文件里找到BasicTutorial2::createCamera这个成员函数.

由于Cameras是SceneManager的成员变量,所以我们使用 SceneManager对象来创建他们,添加这行代码来创建Camera:

 

void BasicTutorial2::createCamera(void)
{
    // create the camera
    mCamera = mSceneMgr->createCamera("PlayerCam");
}

 这表示创建了一个Camera,并且它的名字是"PlayerCam"。

 

  请注意,如果你决定不持有一个Camera的时候,你可以基于它的名字"PlayerCam"并使用SceneManager对象的getCamera函数来获得一个Camera,然后使用其他操作,比如将他添加到其他的SceneNode(这个是偶根据实际情况自己加的,O(∩_∩)O。原文如下:Note that you can use the getCamera function of SceneManager to get Cameras based on their name if you decide not to hold a pointer to it)。

接下来我们将会设置Camera的位置和朝向

我们将围绕远点放置对象,所以我们在Z轴上选了一个不错的的距离,然后使Camera面朝原点,在上一步的代码后加入以下代码:

 

// set its position, direction  
    mCamera->setPosition(Ogre::Vector3(0,10,500));
    mCamera->lookAt(Ogre::Vector3(0,0,0));

  lookAt函数相当优雅,可以是Camera面向任何你想要的位置,而不必使用yaw, rotate, 和pitch等函数。SceneNode也有这个函数,在很多情况下,它将设置实体(SceneNode)的朝向这个操作变得更加简单。

最后,我们将会设置“近距离剪切”为5个单位(原文:Finally we will set a near clipping distance of 5 units

“近距离剪切”是指当一个Camera离目标多近(或多远)的时候你会看不到它,调整“近距离剪切”可以让你在离目标很近的时候,看到目标背后的东西。也就是说当你离一个东西很近的时候,你只能看到它的一小部分,并且它将填满整个屏幕使你看不到任何东西。你也可以设置“远距离剪切”,这会使引擎停止渲染任何比指定距离远的物体。这项功能的主要用途是:在场景中一个很远的距离需要渲染大量的物体时可以提高你的帧率。

添加以下行来实现"近距离剪切":

 

// set the near clip distance
    mCamera->setNearClipDistance(5);

 

设置远距离剪切使用类似的 setFarClipDistance方法。在我们的这个教程中,在“Stencil Shadows”效果中,你不应该使用“远距离剪切”。

现在,既然我们覆盖了createCamera方法,我们就要使用最新创建的mCamera对象来构造一个OgreBites::SdkCameraMan对象(Camera控制器):

 

mCameraMan = new OgreBites::SdkCameraMan(mCamera);   // create a default camera controller
 

 

现在createCamera方法看起来是这样:

 

void BasicTutorial2::createCamera(void)
{
    // create the camera
    mCamera = mSceneMgr->createCamera("PlayerCam");
    // set its position, direction  
    mCamera->setPosition(Ogre::Vector3(0,10,500));
    mCamera->lookAt(Ogre::Vector3(0,0,0));
    // set the near clip distance
    mCamera->setNearClipDistance(5);
 
    mCameraMan = new OgreBites::SdkCameraMan(mCamera);   // create a default camera controller
}
 

 

Viewports

Ogre Viewports

当你开始处理多个Camera的时候,Viewport类的概念将会变得对你更加有用。我们提起这个主题是因为:理解 Ogre  是如何决定使用哪个Camera来渲染场景对你是非常重要的。可能在同一时间,Ogre中有多个SceneManger在运行。也可能把场景分割成多个区域,并且在屏幕上分别渲染不同的区域,每个区域都个各自的Camera,虽然可以做到这些事,但是我们会在更高级的教程中提到这些是如何做到的。
要理解Ogre如何创建一个场景,考虑一下Ogre中创建的3个东西:Camera,SceneManager和 RenderWindow。 RenderWindow我们没有涉及,它基本上是一个可以显示任何东西的窗口,SceneManager创建了一个Camera来观察场景。你必须告诉 RenderWindow哪个Camera需要在场景中显示。并且哪一部分需要被渲染,你告诉 RenderWindow要显示的Camera所看到的区域就是你的viewport。 Ogre的典型用法是,你通常只创建一个 Camera,因而你也只有一个viewport对象。
在这个教程里,我们将会复习怎样创建注册一个Camera来创建Viewport,然后我们能够使用这个Viewport对象来指定我们要渲染的场景的背景色。

创建Viewport

我们将会重写BaseApplication中创建Viewport的方法,所以我们找到BasicTutorial2::createViewports 这个成员函数。要创建Viewport我们只是调用了RenderWindow的addViewport 函数并且用Camera 对象作为参数。BaseApplication类中已经创建了RenderWindow类的对象mWindow ,所以添加这行代码:

 

// Create one viewport, entire window
    Ogre::Viewport* vp = mWindow->addViewport(mCamera);

 

现在我们有了View,我们能用它做什么?答案是:不多。我们能用它做的最重要的事情是调用setBackgroundColour函数并用我们选择的任何颜色来设置背景色。

因为在这个教程中我们要处理灯光,所以我们将把背景设置为黑色:

 

vp->setBackgroundColour(Ogre::ColourValue(0,0,0));

  Note that ColourValue expects a red, green, and blue color value for its parameters between the values of 0 and 1. The last, and most important thing we need to do is to set the aspect ratio of our Camera. If you are using something other than the standard full-window viewport, then failing to set this can result in a very strange looking scene. We will go ahead and set it even though we are using the default aspect ratio:

注意,ColourValue接受红,绿,蓝作为参数,并且取值的范围是0.0至1.0。最后,还有一件最重要的事是我们必须为Camera指定长宽比。如果你使用的不是标准的窗口,那么不设置这个值会使结果看起来非常奇怪。即使我们使用的是默认的长宽比,但是我们仍然会指定这个值:

 

// Alter the camera aspect ratio to match the viewport
    mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
 

 

这就是Viewport类的简单用法。

下面是完成的createViewports 函数:

 

void BasicTutorial2::createViewports(void)
{
    // Create one viewport, entire window
    Ogre::Viewport* vp = mWindow->addViewport(mCamera);
    vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
    // Alter the camera aspect ratio to match the viewport
    mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));    
}
 

 

到这里,你应该编译并且运行项目,因为是一个空的场景,所以什么都没有(按ESC键退出),继续后面的内容之前,确保你能运行此项目并且不崩溃。

 

 

Lights and Shadows

 

 Ogre支持的Shadow类型

Ogre目前支持3中类型的Shadows:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值