前一篇配置了MOGRE的运行环境,这里记录一些MOGRE基础知识,仅仅是最基础的一些东西。由于本人接触ogre的时间比较短,对于很多知识都是一知半解,所以理解起来不免会有一些错误,本人也希望自己在对ogre知识有了一个较深的认识后能重新温故这篇日记,更改自己的误解或者是对mogre进行补漏。废话不说了,进入正题。

  

(1)在写ogre应用前,应该了解ogre的启动过程,有:

1 生成一个Root对象

2 定义资源:

3 设置RenderSystem

4 生成RenderWindow

5 初始化资源组(Resource Group)

6 建立场景

7 Rander循环

(2)Ogre的三大基础元素大致包括:

场景管理器:场景节点,动态对象。

资源管理器:资源组管理,资源管理

渲染模块:硬件缓冲区管理,渲染系统,渲染窗口

(3)Ogre中的SceneManagers  Entities SceneNodes三个类

SceneManagers管理着所有出现在屏幕上的东西,一个东西出现在在场景中的时候SceneManagers一直跟踪着其位置。你创建一个Camera时SceneManagers也跟踪着它,你创建什么,SceneManagers都跟踪着……

举个小例子:

SceneManager sceneMgr;

SceneNode nodeRoot;

Entity ent = sceneMgr.CreateEntity("Ninja", "ninja.mesh");

nodeRoot = sceneMgr.CreateSceneNode("node0");

sceneMgr.RootSceneNode.AddChild(nodeRoot);  //important

SceneNode node1 = sceneMgr.CreateSceneNode("node1");

nodeRoot.AddChild(node1);

node1.AttachObject(ent);

(4)OGRE坐标问题:

确切来说是camera的位置,它指向的位置,实体位置,三者之间的关系。

Ogre采用的是右手坐标系。

Ogre中有一些定义坐标位置和旋转位置的函数:

调用setPosition(30,20,10),那个结点在就在世界空间的位置(30,20,10)

如果我们调用translate(30,20,10),结点就会在位置(40,40,40)

pitch()函数绕X轴旋转,yaw()函数绕Y轴旋转,roll()函数绕Z轴旋转。我们可以使用Ogre::Degree(degree) 或者Ogre::Radian(radian)其中一个来明确指明我们想要旋转的程度

Ogre 3D提供了一个可以使编译器自动转换角度到弧度的操作的Degree()类

Ogre系统中camera和viewport关系:

OGRE抽象出的两个概念则是模拟观察者(人)的位置和眼睛。

一个Viewport是对一个Camera所拍摄到的场景的反映。所以说一个Viewport只能绑定一个Camera

一个Camera所拍摄到的场景可以通过多个Viewport反映到不同的区域,所以一个Camera则可以绑定多个Viewport.

一个Camera同时只可以拍摄一个场景,所以一个Camera只可以绑定一个场景

一个场景可以由多个观察者去观察,所以它可以绑定多个Camera

所以ogre系统中多视图多窗口展现系统场景是可以实现的,而做出类似的效果的前提是对上述几个概念灵活掌握,更重要的是灵活运用。

从代码上来反映问题. 以下是OGRE的伪代码.
Camera * camera1 = scene->CreateCamera("camera1"); (一个camera1 绑定到了scene)
Camera * camera2 = scene->CreateCamera("camera2"); (一个camera2 绑定到了scene)

scene创建了2个Camera对象,即一个场景绑定了多个Camera.
我们可以通过设置Camera的位置,角度等来确定观察者的位置.如:
camera1->SetPosition(Vector3(0,0,100));
camera1->LookAt(Vector3(0,0,0);

camera2->SetPosition(Vector3(0,0,0));
camera2->LookAt(Vector3(-300,0,-300);

Viewport * vp1 = render_win->addViewport(camera1,0,0,0,1,1);
Viewport * vp11 = render_win->addViewport(camera1,1,0.7,0.7,0.3,0.3);
Viewport * vp2 = render_win->addViewport(camera2,2,0,0,0.3,0.3);

这里我们用 vp1和vp11来同时绑定了camera1,不同的只是它们的大小和位置不同而已.

vp2绑定了camera。3个Viewport在render_win上的显示的位置是由他们的Z值决定的。所以顺序是vp1 vp11 vp2.

经过实践证明,几个窗体确实是由camera和viewport造成的。

(5)合成器框架Compositor

合成器框架脚本**.compositior

工作原理:合成器框架是在场景已被渲染后来改变场景的显示,是一种后处理技术。

1.合成器框架将已经渲染的场景渲染到一个texture上去。

2.然后根据需要改变这个texture的内容。

3.为了渲染texture中的改变后的场景,需要创建一个quad用来cover the monitor。

4. 将texture渲染到quad中去(也即是渲染到屏幕上去)。

调用流程:

1. 代码中加入合成器框架。

2. 合成器脚本中定义被渲染到的纹理和输出目标quad。

3. 被渲染到的纹理在mayerial文件夹下面的*.material文件。

4. *.material中定义了用到的fragment_program_ref。

合成器框架这部分,本人也做了一些尝试,这个过程中会遇这样那样的问题,所以还是一知半解,这里就贴了一些摘抄的东西。以待后面再解。

(6)材料设置

material MyMaterial3

{

technique

{

pass

{

texture_unit

{

texture terr_rock6.jpg

}

}

}

}

每一个material XXX 代表是一个材质单元。其中,每一个technique代表一个材质渲染手法,pass是每个渲染通路模式,  texture_unit则是一个纹理单元。一个材质脚本允许有多个渲染手法技术,一个渲染手法技术中允许有多个渲染通路模式,一个渲染通道允许有多个纹理单元。

tex_address_mode clamp :在纹理单位段中,添加一行代码告诉Ogre 3D 使用clamp 模式:

wrapping 模式重复的结果。在一块纹理的最左边,纹理又以其右边重新开始重复,纹理下方的重复同理。这种纹理被称为无缝纹理

改变纹理模式为clamp。这个模式使用纹理的边缘像素来填充所有大于1的纹理坐标、在实践中,这意味着一个图片的边缘在模型上得到了拉伸

改变了纹理模式——这次是mirroring。当用于渲染一块像石墙那样的大面积区域时,使用mirror模式就显得比较简单而有效了。每次纹理坐标值大于1时,纹理就得到翻转,然后就如使用wrap模式一般了。

border模式并不是如mirro模设计或wrap模式一般创建了纹理的多份拷贝。当纹理坐标大于1的时候,这个模式画任何东西为边框颜色——默认的颜色显然是黑色的,黑色的RGB颜色值为(0,0,0)。

纹理继承:

material MyMaterial3

{

technique

{

pass

{

texture_unit

{

texture terr_rock6.jpg

}

}

}

}

material MyMaterial4:MyMaterial3

{

technique

{

pass

{

texture_unit

{

set_texture_alias texture1 Water02.jpg

//texture Water02.jpg

}

}

}

}

(texture alias)为另一个可使用的纹理

(7)顶点和片段着色器。

定义着色器。Ogre 3D 需要有关着色器的五条信息。 】

‰ The name of the shader

‰ In which language it is written

‰ In which source file it is stored

‰ How the main function of this shader is called

‰ In what profile we want the shader to be compiled

l  着色器的名称。

l  用哪种语言写的。

l  在哪个文件中储存。

l  着色器的main函数是如何调用的。

我们需要编译着色器的哪些文件。

fragment_program MyFragmentShader1 cg

{

source Ogre3DBeginnersGuideShaders.cg

entry_point MyFragmentShader1

profiles ps_1_1  arbfp1

}

vertex_program MyVertexShader1 cg

{

source Ogre3DBeginnersGuideShaders.cg

entry_point MyVertexShader1

profiles vs_1_1 arbvp1

default_params

{

param_named_auto worldViewMatrix worldviewproj_matrix

}

}

material MyMaterial13

{

technique

{

pass

{

vertex_program_ref MyVertexShader1

{

}

fragment_program_ref MyFragmentShader1

{

}

}

}

}

接着定义着色器:

//片段着色器;现在来到顶点着色器。顶点着色器有三个参数 —— 顶点的位置,顶点变换的位置作为传出变量,并且作为我们用于变换矩阵uniform变量

void MyFragmentShader1(out float4 color: COLOR)

{

color = float4(0,0,1,0);

}

//在着色器内部,使用了矩阵和传入的位置来计算传出位置

void MyVertexShader1(float4 position:POSITION, out float4 oPosition:POSITION,uniform float4x4 worldViewMatrix)

{

oPosition = mul(worldViewMatrix, position);

}

(8)帧监听

  基于帧的运动有一些缺点。基于时间的运动更为出众,因为大家需要在所有的电脑上达到同样的运动效果而且在运动速度上有更高的可控性。在第一步,使用Ogre 3D的一个FrameEvent传递给调用的frameStarted() 函数。这个FrameEvent类包含了在短时间内自从上一帧被渲染到现在的时间:  (Ogre::Vector3(10,0,0) * evt.timeSinceLastFrame);  这行代码使用这个公式来计算移动模型每帧移动的大小。使用一个三维向量乘以自上一帧到现在的秒数来计算。在当前的情况下,使用了向量(10,0,0)。这意味着是想要模型每秒沿X轴移动10个单位。比如说,每秒渲染10帧;然后对于每一帧,evt.timeSinceLastFrame将会是0.1f。在每帧中,我们用向量(10,0,0)乘以evt.timeSinceLastFrame,那么结果会是(1,0,0).这一结果将会应用于场景结点移动的每一帧。

  

  

  看mogre快2个礼拜了,对mogre还只是一知半解,接下来再接再厉吧。

MOGRE学习笔记(2) - MOGRE基础知识总结的更多相关文章

  1. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

  2. FreeRTOS学习笔记——FreeRTOS 任务基础知识

    RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建 ...

  3. 《Python基础教程(第二版)》学习笔记 -> 第一章 基础知识

    写笔记的原因:书也看了一遍,视频也看了,但总是感觉效果不好,一段时间忘记了,再看又觉得有心无力,都是PDF的书籍,打开了就没有心情了,上班一天了,回家看这些东西,真的没多大精力了,所以,我觉得还是把p ...

  4. 【 学习笔记 】memcached基础知识

    源地址:http://kb.cnblogs.com/page/42731/ 仔细学习了下,以下是记录的笔记备忘内容. 一.memcached是什么?    memcached是高性能的分布式内存缓存服 ...

  5. linux学习笔记:1.基础知识和命令行基本操作

    初次学习linux系统,想在这里记录自己的学习痕迹,如发现有不足之处,希望能指出,谢谢啦,之后的学习是在虚拟机VMware 10下的Red Hat Enterprise linux 6 的操作. 一. ...

  6. libevent学习笔记 一、基础知识【转】

    转自:https://blog.csdn.net/majianfei1023/article/details/46485705 欢迎转载,转载请注明原文地址:http://blog.csdn.net/ ...

  7. MySQL学习笔记01_数据库基础知识

    01_1 mysql数据库启动与停止 以<管理员权限>启动cmd: 输入net stop mysql停止mysql服务: 输入net start mysql启动mysql服务: 输入mys ...

  8. Spring基础学习笔记-Bean的基础知识

    一. Bean的定义,初始化,使用和销毁 二.ref指定依赖的三种模式 三.Bean的五种自动装配模式(autowire) 四.Bean依赖检查的4种模式:配合atuowire使用,dependenc ...

  9. CSS学习笔记1:基础知识

    CSS规则由两部分组成,选择器和声明     选择器:标签,告诉浏览器哪些标签需要用到这个样式     声明:样式的内容,由一或多对属性:值以:隔开组成,由{}包围,需要多个选择器时以逗号隔开     ...

  10. react学习笔记1一基础知识

    1.React 是一个用于构建用户界面的 JAVASCRIPT 库2.React 特点: a.声明式的设计 b.采用虚拟dom,最大限度的减少dom操作 C.组件化,可以复用 D.单向响应的数据流,减 ...

随机推荐

  1. hdu Proud Merchants

    此题是一个背包的题目,刚开始我并没有作任何的排序工作,所以出来的结果总是错的,仔细想想也确实是不对的,因为q[i]会限制dp[i]的值的变化.虽然我知道要按照某个量进行排序,对原数据进行处理,但是实在 ...

  2. 在thinkphp框架模板中引用session

    我已经将模板引擎配置为smarty,在模板中使用常量是写为 {$smarty.const.ADMIN_IMG} 到使用到session的值时这样写 {$smarty.session.mg_name}

  3. Maven问题总结:could not resolve archetype xxxxxxx from any of the configured repositories

    错误提示 Eclipse中通过Archetype创建Maven项目时报错:Could not resolve archetype xxxxxxx from any of the configured ...

  4. redis缓存怎么存储对象

    2.把对象Object存储到redis中,怎么存?memcache存取对象是序列化和反序列化 使用通用的序列化.反序列化(频繁的会很消耗cpu,使用Google Protocol Buffer,将对象 ...

  5. RT-Thread创建静态、动态线程

    RT-Thread 实时操作系统核心是一个高效的硬实时核心,它具备非常优异的实时性.稳定性.可剪裁性,当进行最小配置时,内核体积可以到 3k ROM 占用. 1k RAM 占用. RT-Thread ...

  6. Bootstrap页面布局10 - BS代码

    网页中标记代码内容使用code和pre标签 要在HTML中显示标签本来的样子需要转化为实体 在此附上百度的实体字符:http://baike.baidu.com/view/4757776.htm#3 ...

  7. http UserAgent

    string uAgent = Request.ServerVariables["HTTP_USER_AGENT"].ToLower();  //获取客户端浏览器的请求 判断 是什 ...

  8. wordpress插入腾讯视频的方法

    wordpress插入腾讯视频的方法 最近网站需要插入腾讯视频,但是腾讯视频目前没有分享代码,只有分享到微信,qq,微博等具体选项.百度这个问题,貌似没有很好地解决办法,好像有两个插件可以使用,安装试 ...

  9. the OS maintains a number of queues

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION To do its job, the OS ...

  10. JAVA 调用matlab 出错总结

    1.Java:Unsupported major.minor version 51.0 (unable to load class 出现该错误是由于class编译器的JDK版本高于运行期的JDK版本. ...