Ogre学习笔记1(你的第一个场景)
来源:互联网 发布:olafur arnalds 知乎 编辑:程序博客网 时间:2024/06/04 19:34
Ogre学习笔记1(你的第一个场景)
这是第一个教程我们将学习Ogre构建场景所用到的基本元素,主要重点是场景管理器、场景节点、和实体
场景管理器
场景管理器可以管理屏幕上出现的一切,管理他们的位置还有属性,其中包括你添加到场景中的摄像机和灯光。当然ogre中场景管理器有很多种,作为什么都不知道的我,最好的方法还是从实践中慢慢学习,而不是一上来就先了解堆积如山的理论知识。
ogre这里介绍了场景管理器的种类。 —— [ 场景管理器]
场景节点
场景节点携带了Entity的信息,它不是一个可以直接显示的对象,它包含了需要显示的物体的位置和方向的抽象信息,只有当它与一个Entity绑定时场景才会渲染它,并且你所设定的位置方向信息将在渲染中呈现出来。sceneNode可以添加子节点,添加子节点的效果就是将父节点作为中心然后再移动和旋转变换。记住:sceneNode的变换都是针对于他们的父节点。
实体
Entity,是由mesh文件来描述并由场景管理器创建的,它不同于灯光,摄像机不能被直接添加到场景管理器中,而是首先要被添加到sceneNode中然后再被添加到场景管理器中。
设置场景
- 开灯
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
Ogre::Colour是一个颜色类型 由红绿蓝组成范围在0-1之间。
- 创建实体
Ogre::Entity* ogreEntity = mSceneMgr->createEntity("ogrehead.mesh");
在这里你填写的模型文件是你资源管理器加载好的模型文件才行。
我们已经有了一个实体但是想把实体显示在屏幕中我们还需要创建一个场景节点。每个场景管理器都有一个根节点跟节点有一个createChildSceneNode的方法来给我们返回一个新的场景节点。
- 创建场景节点
Ogre::SceneNode* ogreNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
我们要把Entity添加到场景节点中
ogreNode->attachObject(ogreEntity);
- 创建光源
通过场景管理器创建光源
并且设定光源的位置
Ogre::Light* light = mSceneMgr->createLight("MainLight");light->setPosition(20, 80, 50);
- 坐标系统
Ogre是右手系但是却跟其他坐标系有些不同。
y |__x / Z
Ogre中使用Vector来表示位置和方向,有Vector2,3,4如果有很不错的线性代数的功底可以给你带来很多方便。
三维基本知识。 —— [三维知识]
- 添加另一个实体
为了使我们能看到更多的实体我们需要首先移动摄像机的位置
mCamera->SetPosition(0,47,222);
我们来创建另外一个实体并且给他一个新的位置
Ogre::Entity* ogreEntity2 = mSceneMgr->createEntity("ogrehead.mesh");Ogre::SceneNode* ogreNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( Ogre::Vector3(84, 48, 0));ogreNode2->attachObject(ogreEntity2);
我们第一次在创建节点的时候传入了一个位置的信息,记住这个位置是相对父节点的位置。父节点的相对位置是
更多关于sceneNode
sceneNode是非常复杂的,现在我们将只使用一些最常用的方法
你可以通过setPosition()方法来设定场景节点的位置,这是针对于父节点的移动
也可以使用translate函数来针对当前位置改变。sceneNode不光能改变位置还能控制旋转和大小,setScale可以设置缩放,yaw,pitch,roll可以控制旋转,resetRotation可是恢复初始位置,也可以使用rotate函数来实现旋转,但是要传入一个四元数,四元数的知识后面会有介绍。
我们已经使用了attachObject()函数来添加一个实体,还有一些方法也是比较常用的,numAttachedObjects返回链接到您的子节点的数目,你可以通过getAttachedObejct函数来获取实体,你也可以通过detachobject用于出去特定的子节点,并且detachallObejcts可以去除所有。
还有个里子sceneNode1也可以attach sceneNode2,但是sceneNode2的位置就是相对于sceneNode1来变化的了。
我们可以通过场景管理器的getSceneNode和getEntity函数传递一个名字来获取他们的指针,这样你就不用保存全部的指针了,你只需要保存你经常使用的指针。改变实体的缩放
我们可以通过sceneNode的setScale函数来设置缩放。
Ogre::Entity* ogreEntity3 = mSceneMgr->createEntity("ogrehead.mesh");Ogre::SceneNode* ogreNode3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();ogreNode3->setPosition(0, 104, 0);ogreNode3->setScale(2, 1.2, 1); ogreNode3->attachObject(ogreEntity3);
- 实体的旋转
绕着Y轴旋转的函数是Yaw()
绕着X轴旋转的函数是Pitch()
绕着Z轴旋转的函数是Roll()
Ogre::Entity* ogreEntity4 = mSceneMgr->createEntity("ogrehead.mesh");Ogre::SceneNode* ogreNode4 = mSceneMgr->getRootSceneNode()->createChildSceneNode();ogreNode4->setPosition(-84, 48, 0);ogreNode4->roll(Ogre::Degree(-90));ogreNode4->attachObject(ogreEntity4);
添加实体的函数可以放到最后,先操作节点。
- 总结
本教程中对Ogre中的实体,场景的节点,和场景管理器做了简单的介绍,这些对后面的学习都是基础
实体节点有一个Ogre的网格模型,sceneNode是我们来改变实体位置,比例旋转属性的。最后sceneManager用来错做有所的对象,我们创建Entity和sceneNode都是通过它来创建的,并且复杂的场景也是由它来组织的。
- 问题
运行官方运行的例子的时候遇到*.cg文件错误的问题是因为没有将资源包含。
运行官方的例子我们要简单修改一下resources_d.cfg配置文件如下:
FileSystem=H:/Professional_Software/Ogre/Samples/Media/materials/programs/CgFileSystem=H:/Professional_Software/Ogre/Samples/Media/materials/programs/GLSLFileSystem=H:/Professional_Software/Ogre/Samples/Media/materials/programs/GLSL150FileSystem=H:/Professional_Software/Ogre/Samples/Media/materials/programs/GLSL400FileSystem=H:/Professional_Software/Ogre/Samples/Media/materials/programs/GLSLESFileSystem=H:/Professional_Software/Ogre/Samples/Media/materials/programs/HLSL
添加这些进去,这样才能确保顺利的运行官方的例子程序。
- Ogre学习笔记1(你的第一个场景)
- OGRE学习系列三:基础教程1 你的第一个场景
- Ogre学习笔记(二)创建第一个OGRE程序
- 创建你的第一个ThreeJs场景
- Ogre学习教程:Ogre第一个程序
- OGRE 1.9 的第一个程序(OGRE HelloWorld程序)
- 丰富你的第一个Three.js场景
- HTML学习笔记--(1)我的第一个HTML5
- OGRE: Ogre第一个程序
- 用Ogre写的第一个程序
- 自己学习OGRE的笔记(1-5)
- Ogre 第一个原程序
- 跟Google学习Android开发-起始篇-构建你的第一个应用程序(1)
- 第一个学习笔记
- 第一个学习笔记
- prism4学习笔记二:应用框架完成你的第一个prisam程序
- .prism4学习笔记二:应用框架完成你的第一个prisam程序
- Xcode学习笔记---如何使用Xcode中的storyboard构建你的第一个IOS应用
- Cursor 数据库查询游标的应用
- TabLayout与ViewPager和Fragment、FragmentPagerAdapter的合用
- 使Android studio使用sdk下的docs的api文档:设置方法
- 自定义一个自己的ContentProvider程序
- 读取系统通讯录信息的时候出错:.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow
- Ogre学习笔记1(你的第一个场景)
- matlab-code folding功能 将某些行的代码折叠起来方便查看
- MyEclipse使用依赖项目在发布项目时报ClassNotFound
- 购买计划
- 104.Reverse Words in a String
- HashMap的实现原理
- 收集的48个Shell脚本小技巧
- iOS中 本地通知/本地通知详解 韩俊强的博客
- Java泛型实例