ogre3D学习基础16 -- 手动创建实体(ManualObject)
这一节练习一下手动创建实体,用到了对象(ManualObject)
第一,依然是模板
#include "ExampleApplication.h"
class Example1 : public ExampleApplication
{
public:
void createScene()
{
}
protected:
private:
}; #include <windows.h>
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
{
Example1 app;
app.go();
return ;
}
第二,我们在createScene()添加自己手动创建的实体
首先,创建一个平面,加载材质,详细如注释
Ogre::Plane plane(Ogre::Vector3::UNIT_Y,-);//创建一个在原点下方10单位,并且以y轴为法线的平面
Ogre::MeshManager::getSingleton().createPlane("plane",//平面名称
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,//这个平面属于哪个资源组
plane,//平面的名称,上面创建的
,,//平面大小
,,//分段数,平面组成的精细度,
true,//为true时,它指的是向量是以垂直于平面创建
,//2D纹理坐标集的数量
,,//纹理在u方向和v方向应该重复的次数
Vector3::UNIT_Z);//当前平面的向上方向 Ogre::Entity *ent = mSceneMgr->createEntity("GrassPlane","plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
ent->setMaterialName("Examples/GrassFloor");
然后,手动创建对象,我计划在面板上显示一个数字9,其中begin()是手动创建对象的开始
Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass");
manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建
其中的RenderOperation::OT_TRIANGLE_LIST有必要解释一下,这是一个枚举常量,源代码如下:
enum OperationType {
/// A list of points, 1 vertex per point
OT_POINT_LIST = ,//点列表
/// A list of lines, 2 vertices per line
OT_LINE_LIST = ,//线列表
/// A strip of connected lines, 1 vertex per line plus 1 start vertex
OT_LINE_STRIP = ,//一系列连接着的线
/// A list of triangles, 3 vertices per triangle
OT_TRIANGLE_LIST = ,//一系列的三角形列表
/// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that
OT_TRIANGLE_STRIP = ,//一系列连着的三角形
/// A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
OT_TRIANGLE_FAN = //连接成扇形的三角形序列
};
先来看一段代码:
//创建一个三角形
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
//创建另一个三角形
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
这段代码实现的效果是
代码解释:
我们使用的是OT_TRIANGLE_LIST,这是一系列的三角形,每个三角形有三个顶点组成,position()(三元组)给出位置创建两个个三角形组成一个长方形,textureCoord()给出一会要放的纹理的坐标(uv坐标),其中纹理坐标的组成方式为每一个平面坐标如图所示
每一个三角形包括三个点,分别对应三个纹理坐标(如图2)。
最后我们结束绘制,使用end()函数,创建一个场景节点把刚创建的对象绑定到场景节点上。
1 manualObj->end();//创建结束
Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(,-,));
grassNode->attachObject(manualObj);
现在看下总的代码:
void createScene()
{
Ogre::Plane plane(Ogre::Vector3::UNIT_Y,-);//创建一个在原点下方10单位,并且以y轴为法线的平面
Ogre::MeshManager::getSingleton().createPlane("plane",//平面名称
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,//这个平面属于哪个资源组
plane,//平面的名称,上面创建的
,,//平面大小
,,//分段数,平面组成的精细度,
true,//为true时,它指的是向量是以垂直于平面创建
,//2D纹理坐标集的数量
,,//纹理在u方向和v方向应该重复的次数
Vector3::UNIT_Z);//当前平面的向上方向 Ogre::Entity *ent = mSceneMgr->createEntity("GrassPlane","plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
ent->setMaterialName("Examples/GrassFloor"); //手动创建我们的新ManualObject
Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass");
manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建 //创建一个三角形
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex. manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
//第二面
manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); //第三个面
manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,-);
manualObj->textureCoord(,); manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,-);
manualObj->textureCoord(,);
//第四个面
manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,-);
manualObj->textureCoord(,);//纹理坐标,二元组,uv manualObj->position(,,-);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv //*****************************************************************************************///
//第五面
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); //第六个面
manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->position(,,);//定点坐标,三元组,xyz
manualObj->textureCoord(,);//Add a texture coordinate to the current vertex.
manualObj->position(,,);
manualObj->textureCoord(,);//纹理坐标,二元组,uv
manualObj->position(,,);
manualObj->textureCoord(,); manualObj->end();//创建结束
Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(,-,));
grassNode->attachObject(manualObj); }
关键代码
在以上代码中,一共绘制了六个面,刚好组成数字9,如图
现在总结一下手动绘制对象的步骤:
1、需要先用场景管理器去创建一个人造物体的指针
Ogre::ManualObject *manualObj = mSceneMgr->createManualObject("grass");
2、然后使用人造物体的begin/end对进行绘制
manualObj->begin("Examples/GrassBlades",RenderOperation::OT_TRIANGLE_LIST);//开始创建
.......................
manualObj->end();//创建结束
3、将对象绑定到节点上
Ogre::SceneNode*grassNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("GrassNode",Ogre::Vector3(0,-10,0));
grassNode->attachObject(manualObj);
哈哈,发挥你的想象力,绘制你自己的物体吧。
ogre3D学习基础16 -- 手动创建实体(ManualObject)的更多相关文章
- ogre3D学习基础18 -- 材质的使用与脚本的简单书写
这一节以基础16为基础,练习材质的使用. 第一,看看框架 //material #include "ExampleApplication.h" class TutorialAppl ...
- ogre3D学习基础9 -- 光源程序实例
这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...
- ogre3D学习基础6---场景管理器的使用
场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...
- ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙. 第一,还是框架,我们依然使用ExampleApplication文件,框架如下 #include "Ex ...
- ogre3D学习基础17 --- 如何手动创建ogre程序
建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...
- ogre3D学习基础15 -- 创建BSP Scene Manager
BSP(binary-space partitioning) Scene Manager(二叉空间分割)场景管理器比较适合用于室内场景. 第一,添加框架代码如下 #include "Exam ...
- ogre3D学习基础1 -- 核心对象与脚本技术
一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...
- ogre3D学习基础5 -- 阴影与动画
五.阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系. 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1.建立场 ...
- ogre3D学习基础13 -- 键盘控制网格动画mesh
以上一节为蓝本,这里增加一点难度,添加了四个节点,增加键盘控制移动速度,使用bool变量控制是否移动. 第一,要增加键盘控制,那就使用OIS::KeyListener,在监听器里添加一个父类KeyLi ...
随机推荐
- Java中对jsonArray的排序,使用的是Gson
使用Gson对json解析字符串,转化为json对象. 先上代码: 下面是main方法里面的代码 package testJava; import java.util.ArrayList; impor ...
- shell实现网站备份
#!/bin/bash ##back web directory scripts #需要备份的目录写入与脚本同级目录test.txt文件中 DIR="/data/server/www&quo ...
- (转载)office 2003 gaozhi.msi 缺失提示问题修复
某些GHOST版win7,自带office 2003,每次启动word,它都会提示"稿纸没安装"云云,找不到那个文件.可是我搜遍了硬盘,确实没有那个文件.每次都要点取消,这个提示才 ...
- JavaScript_对象
1. 直接创建实例: //简单对象 var person1 = new Object(); person1.name = "Mike"; person1.age = 29; pe ...
- 查看SAP CRM和C4C的UI technical信息
CRM 比如我们想看Quantity这个字段到底是绑在哪个模型上,选中该字段按F2: 就能知道是绑在Context node BTADMINI的QUANTITY字段上. C4C 同理,使用debugM ...
- JavaScript: apply , call 方法
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...
- 如果CDN服务器出了问题,怎么做不影响自己的网站
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3.jquery.min.js"></ ...
- POJ-1149 PIGS---最大流+建图
题目链接: https://vjudge.net/problem/POJ-1149 题目大意: M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买这些有钥匙的猪圈里的猪,而且要买一定数量的猪,每 ...
- softmax 函数
总结为: 将一组数变换为 总和为1,各个数为0~1之间的软性归一化结果. ========================================================= 关于 ...
- Bootstrap 历练实例-轮播(carousel)插件方法
方法 下面是一些轮播(Carousel)插件中有用的方法: 方法 描述 实例 .carousel(options) 初始化轮播为可选的 options 对象,并开始循环项目. $('#identifi ...