`
codeone
  • 浏览: 46259 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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:

 

 

分享到:
评论

相关推荐

    Ogre基础教程pdf电子书

    Ogre基础教程pdf电子书 Ogre基础教程pdf电子书Ogre基础教程pdf电子书 Ogre基础教程pdf电子书 Ogre基础教程pdf电子书 Ogre基础教程pdf电子书 Ogre基础教程pdf电子书 Ogre基础教程pdf电子书

    OGRE基础教程基础教程八

    ### OGRE基础教程之基础教程八:使用多个场景管理器 #### 摘要 本教程将引导读者了解如何在OGRE中实现多个场景管理器的切换与使用。通过本教程的学习,您将掌握如何创建并配置多个场景管理器、摄像头以及视口,并...

    OGRE基础教程基础教程一

    ### OGRE基础教程知识点解析 #### 一、OGRE引擎概览 OGRE(Object-Oriented Graphics Rendering Engine)是一款高性能、跨平台的3D图形渲染引擎,旨在为游戏开发者和图形应用程序提供强大的渲染功能。它支持多种...

    Ogre、Osg三维虚拟可视化技术资料大全

    资源名称:Ogre、Osg三维虚拟可视化技术资料大全资源目录:【】OGRE基础教程2【】OGRE基础教程基础教程一【】OGRE基础教程基础教程七【】OGRE基础教程基础教程三【】OGRE基础教程基础教程九【】OGRE基础教程基础教程...

    OGRE基础教程基础教程五

    ### OGRE基础教程基础教程五:理解简单的缓冲输入 #### 先决条件 在开始学习本教程之前,读者应具备一定的C++编程基础,并且已成功安装与编译了一个OGRE应用程序。对于安装过程中遇到的问题,可以参考官方提供的...

    OGRE基础教程基础教程三

    ### OGRE基础教程:天空、地形与雾化处理详解 #### 标题解析与扩展知识点 标题“OGRE基础教程基础教程三”实际上是指向了OGRE 3D引擎的一系列教程中的第三部分。OGRE(Object-Oriented Graphics Rendering Engine...

    OGRE基础教程基础教程七

    ### OGRE基础教程基础教程七知识点详解 #### 一、先决条件 在开始本教程之前,你需要具备一定的C++编程基础,并且能够成功构建和编译OGRE程序。如果你在配置开发环境方面遇到问题,可以参考...

    OGRE基础教程基础教程二

    ### OGRE基础教程基础教程二 #### 先决条件与简介 在深入本文档之前,读者应具备一定的C++编程基础,并且已经成功地安装和编译了一个OGRE应用程序。对于那些在设置过程中遇到问题的朋友,可以参考相关指南获取详细...

    OGRE基础教程

    ogre技术的入门,学习ogre的必要教材。 OGRE(面向对象的图形渲染引擎)是用C++开发的面向对象且使用灵活的3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层的...

    OGRE基础教程基础教程六

    ### OGRE基础教程第六部分详解 #### 必备知识与工程设置 在深入探讨OGRE基础教程第六部分之前,我们假设读者已经具备了C++编程的基础知识,并且能够成功地建立和编译OGRE程序。如果在设置程序时遇到问题,可以参考...

    OGRE基础教程基础教程八.pdf

    ### 知识点一:Ogre3D基础教程概述 本教程是关于Ogre3D的第八部分,旨在指导用户如何使用Ogre3D实现多重场景管理器。Ogre3D是一个面向对象的渲染引擎,主要面向游戏开发者和其他需要复杂场景管理的3D应用程序。教程...

    OGRE基础教程基础教程四

    ### OGRE基础教程之基础教程四:深入了解帧监听与场景构建 #### 先决条件 在深入本章节之前,读者需要具备一定的C++编程基础知识,并且已经成功安装并配置了一个Ogre应用程序。如果在配置过程中遇到任何问题,可以...

    OGRE基础教程7

    在"OGRE基础教程7"中,我们将深入探讨如何将CEGUI集成到OGRE项目中,以便为3D场景添加UI元素。 首先,我们需要了解OGRE的基本架构。OGRE提供了一个强大的底层框架,包括渲染、资源管理和场景管理等核心功能。它的...

    ogre基础教程

    接下来,“文档教程基础教程二 - MediaWiki for Sae.mht”可能涉及Ogre的资源管理,如模型加载、纹理映射和材质系统。你会了解到如何导入3D模型,给它们分配纹理,以及设置光照和阴影效果,这些都是构建真实感三维...

    OGRE基础教程(中文)(1-9)

    本教程“OGRE基础教程(中文)(1-9)”旨在帮助初学者掌握OGRE的核心概念和技术,从而能够熟练地利用这个强大的工具构建自己的3D应用。 在第一部分的教程中,你会了解OGRE的基本架构和工作原理。OGRE的设计理念是...

    Ogre初级和中级CHM教程和代码

    基础教程二 摄影机,阴影和光照处理 基础教程三 天空,地面和雾化处理 基础教程四 帧监听器和非缓冲输入 基础教程五 缓冲输入 基础教程六 CEGUI和OGRE 基础教程七 CEGUI和OGRE II 基础教程八 多场景管理器的...

    OGRE教程 OGRE 入门教程

    - **教程**:有许多教程可供初学者学习,涵盖了从基础到高级的各种主题。 - **示例项目**:通过实际的项目案例学习OGRE的应用实践。 #### 四、OGRE的应用场景 OGRE广泛应用于游戏开发、虚拟现实、增强现实等领域。...

    ogre3d基础教程pdf

    从标题“Ogre3D基础教程PDF”来看,这份资料的焦点是围绕着一个名为Ogre3D的软件进行的教学内容。Ogre3D是一个面向场景图形的开源、面向对象的3D引擎,它允许开发者创建游戏和视觉仿真等应用程序。Ogre3D的设计理念...

    ogre中文教程 ogre中文教程

    无论你是编程新手还是有一定基础的开发者,都可以通过这份教程了解Ogre 3D的基础知识和高级特性。 首先,教程将介绍Ogre 3D的基本概念,包括如何安装和配置环境,以及如何创建第一个简单的3D项目。这涉及到设置项目...

Global site tag (gtag.js) - Google Analytics