OGRE初级教程 第一章:OGRE的基本设计理念:场景管理器,场景节点和实体对象

这是一年前的文章了,当时初学OGRE,翻译官网的初级和中级教程,还有Physx的一系列教程,最近准备爆发一下,这些东西都快发霉了

 

OGRE 初级教程

第一章:OGRE的基本设计理念:场景管理器,场景节点和实体对象

准备:

 

开始:

在这里我们使用Ogre Wiki Tutorial Framework框架,来完成本章的内容。在后面的章节中我们将详细介绍Ogre的工作细节,现在我们要开始学习最基础的知识。阅读Setting up an Application根据你的喜欢的IDE和环境来设置你的工程和代码。

 

创建一个新的工程,添加Ogre Wiki Tutorial Framework框架的相关文件到工程,也可以使用Ogre AppWizard来设置你的工程

Ogre Wiki Tutorial Framework包含四个文件,分布式BaseApplication的头文件和源文件,以及TutorialApplication的头文件和源文件,在这里我们只需要修改TutorialApplication类即可。为该类添加一个虚函数,createScene

 

void TutorialApplication::createScene(void)

{

    Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");

 

    Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();

    headNode->attachObject(ogreHead);

 

    // 设置环境光

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

 

    // 创建灯光

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

    l->setPosition(20,80,50);

}

 

编译你的工程,你就可以看到食人魔的头像被渲染出来了!

 

 

可能存在的问题:

 

如果编译过程中出现了问题,请先根据Setting Up An Application来正确的设置你的开发环境,另外查看Ogre.log可以获取到更详细的细节。

 

当环境正确配置好了之后,可能还会出现下面的问题.

 

Message Box错误:

可能存在ANSI编码的字符无法转换到unicode编码的字符,通过把MessageBox函数修改为MessageBoxA即可解决。或者将文本格式从unicode转换到ANSI,但这样就无法支持国际语言了。

 

找不到配置文件或DLL:

你可以把SDK的bin目录或者release目录下的配置文件和者动态链接库都拷贝到你的目录下。或者把工作目录,输出的可执行文件配置到该目录下,直接在该目录下运行,

 

资源或者插件问题:

先确定在可执行文件的目录下有plugins.cfg文件和resources.cfg文件。以及你的工作路径。插件配置文件会告诉ogre有哪些可用的渲染库和插件,资源配置文件会告诉ogre纹理,模型和脚本等资源的路径。如果读取他们发生了错误会被记录在ogre.log日志文件中

 

OGRE是如何工作的:

1.SceneManager

渲染在屏幕上的所有东西都是由SceneManager来管理的。当你将一个物体放到场景中。SceneManager会跟踪记录他们的位置。当你创建一个摄像机来观察这个场景,SceneManager也会记录它们。当你创建平面,公告板,灯光等等SceneManager都会将它们保存起来。SceneManager有多种类型,有适用于渲染地形的,有适用于渲染BSP地图的。

 

2.Entity 

实体是一种能够在屏幕上渲染的对象,你可以实体当做一个3D模型,机器人,鱼,人物,甚至复杂的地形.而像灯光,公告板,粒子,相机这些就不是实体了。有一点要注意的就是,这些可渲染的实体与他们的位置和方向是分离开的。实体不可以单独存在,你必须把它们添加到对于的场景节点中。它们的位置和朝向在场景节点中保存。

3.SceneNode

场景节点保存所有附加于其上的实体的位置和方向信息。当你创建一个实体的时候,不附加到场景节点上的话,是不会被渲染出来的。值得一提的是,场景节点并不是渲染在屏幕上的对象。实体才是可以显示的对象。一个场景节点可以包含多个实体。另外,一些非实体的对象也可以被附加到场景节点中,例如灯光,摄像机等对象。场景节点之间也是可以互相附加的!

 

你的第一个OGRE程序

 

回顾我们之前写的代码,我们只在createScene函数里面操作了Ogre,我们为场景设置了环境光,这样我们就可以看到我们在做什么,通过调用场景管理器的setAmbientLight函数来指定环境光的颜色,颜色值由r,g,b三原色组成,它们的值都在0-1这个范围内

 

我们还用场景管理器创建了一个实体,我们调用场景管理器的createEntity函数,通过传入一个唯一的字符串标识和资源文件名来创建该实体。该资源是已经被加载进来的资源。本例中的资源是SDK中的资源

 

当有了实体之后需要创建一个场景节点让其附着,我们通过场景管理器获取跟场景节点,并用它来创建一个子场景节点。

Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");

最后通过场景节点的attachObject把我们创建的实体传入即可让其渲染在屏幕上。

 

关于坐标轴和向量

这里简单介绍一下Ogre的屏幕坐标系和向量对象,在3D坐标系中,Ogre使用x和z轴作为水平面,y轴作为垂直于水平面上的轴。它使用的是右手坐标系,x向着屏幕的右边,y向着屏幕的上方,z向着你,正如下面这个图。Z轴是穿出屏幕,在屏幕之外的。

 

 

在本例中Ogre的头像在(0, 0, 0)这个位置,我们是正对着它。这与相机的坐标和朝向有关,另外模型的朝向是由创建它们的美工决定并保存的。在这里,向量通常用来保存位置或方向。有二维,三维和四维的向量,三维向量是用得最多的。如果你对它不熟悉,最好还是去复习一下吧。如果你要开始一个复杂游戏的设计,数学向量是非常有用的。

 

添加其他对象

现在你对坐标系有所了解了,回到我们的代码,我们就用一个三维向量指定了食人魔头像的位置。在OGRE中,大多数函数都是由默认值的,createChildSceneNode函数有三个参数,节点名,坐标以及旋转角度。坐标的默认值是在 (0, 0, 0)这个位置,我们可以在另外一个位置创建一个头像来观察

 

Ogre::Entity* ogreHead2 = mSceneMgr->createEntity( "Head2", "ogrehead.mesh" );

 

Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ));

 

headNode2->attachObject( ogreHead2 );

 

深入了解实体

 

OGRE里面有着众多的实体类,这里无法讲解到每一个类。在实体类里面,setVisible方法和isVisible方法是很常用的方法。如果你只是想把对象暂时隐藏,那么不需要释放对象,只需要调用setVisible方法把它隐藏起来即可,你不需要担心它一直占着内存,所有的模型在内存中只存在一份拷贝,即使你在多个对象中指定了这个模型,实体的创建和销毁并不会影响到模型所在的内存。实体在内存中的开销是很低的,所以大可不必为了节省那丁点内存而频繁地对实体进行初始化和销毁。

 

getName会返回实体的名字,getParentSceneNode会返回实体所附着的场景节点

 

深入了解场景节点

 

场景节点类是非常复杂的。场景节点能做很多事情,我们只能介绍它最有用的一些功能

你可以获取和设置场景节点的位置,通过getPosition和setPosition(这是相对于其父节点的位置哦)你可以调用translate方法来移动它的这个相对位置。场景节点不止管理物体的位置。旋转缩放也是它的功能。你可以使用scale函数来对其进行缩放,也可以使用pitch,yaw和roll函数对物体分别根据x,y,z轴进行旋转。 

最后,我要狠狠地吐槽一下这个文本编辑器,在Word里面辛辛苦苦排好的版面,到这上面来什么格式都没有了

posted @   深圳-宝爷  阅读(1890)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示