MOGRE学习笔记(2) - MOGRE基础知识总结
前一篇配置了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基础知识总结的更多相关文章
- ios开发学习笔记001-C语言基础知识
先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...
- FreeRTOS学习笔记——FreeRTOS 任务基础知识
RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建 ...
- 《Python基础教程(第二版)》学习笔记 -> 第一章 基础知识
写笔记的原因:书也看了一遍,视频也看了,但总是感觉效果不好,一段时间忘记了,再看又觉得有心无力,都是PDF的书籍,打开了就没有心情了,上班一天了,回家看这些东西,真的没多大精力了,所以,我觉得还是把p ...
- 【 学习笔记 】memcached基础知识
源地址:http://kb.cnblogs.com/page/42731/ 仔细学习了下,以下是记录的笔记备忘内容. 一.memcached是什么? memcached是高性能的分布式内存缓存服 ...
- linux学习笔记:1.基础知识和命令行基本操作
初次学习linux系统,想在这里记录自己的学习痕迹,如发现有不足之处,希望能指出,谢谢啦,之后的学习是在虚拟机VMware 10下的Red Hat Enterprise linux 6 的操作. 一. ...
- libevent学习笔记 一、基础知识【转】
转自:https://blog.csdn.net/majianfei1023/article/details/46485705 欢迎转载,转载请注明原文地址:http://blog.csdn.net/ ...
- MySQL学习笔记01_数据库基础知识
01_1 mysql数据库启动与停止 以<管理员权限>启动cmd: 输入net stop mysql停止mysql服务: 输入net start mysql启动mysql服务: 输入mys ...
- Spring基础学习笔记-Bean的基础知识
一. Bean的定义,初始化,使用和销毁 二.ref指定依赖的三种模式 三.Bean的五种自动装配模式(autowire) 四.Bean依赖检查的4种模式:配合atuowire使用,dependenc ...
- CSS学习笔记1:基础知识
CSS规则由两部分组成,选择器和声明 选择器:标签,告诉浏览器哪些标签需要用到这个样式 声明:样式的内容,由一或多对属性:值以:隔开组成,由{}包围,需要多个选择器时以逗号隔开 ...
- react学习笔记1一基础知识
1.React 是一个用于构建用户界面的 JAVASCRIPT 库2.React 特点: a.声明式的设计 b.采用虚拟dom,最大限度的减少dom操作 C.组件化,可以复用 D.单向响应的数据流,减 ...
随机推荐
- hdu Waiting ten thousand years for Love
被这道题坑到了,如果单纯的模拟题目所给的步骤,就会出现同一个位置要走两次的情况...所以对于bfs来说会很头痛. 第一个代码是wa掉的代码,经过调试才知道这个wa的有点惨,因为前面的操作有可能会阻止后 ...
- js性能优化的小知识
避免全局查找 function search() { //当我要使用当前页面地址和主机域名 alert(window.location.href + window.location.host); } ...
- 【转】在.Net中关于AOP的实现
原文地址:http://www.uml.org.cn/net/201004213.asp 一.AOP实现初步 AOP将软件系统分为两个部分:核心关注点和横切关注点.核心关注点更多的是Domain Lo ...
- Apache Storm 衍生项目之2 -- Trident-ML
欢迎转载,转载请注明出处,徽沪一郎,谢谢. 楔子 或许谈起storm是大数据实时计算框架已经让你不明觉厉,如果说storm还可以跟机器学习算法(ml)有机的结合在一起,是不是更加觉着高大尚呢.trid ...
- GitHub 初探
前言:有时候在公司上班时自己写了一些代码,打算下班回家后继续写,或者在家修改好的代码第二天要拷到公司继续完善,代码就经常要在这两者之间来回同步,通常情况下我用网盘或者U盘,但是实在是很麻烦,不断的备份 ...
- nginx 配置文件分析以及配置负载均衡器
修改Nginx核心配置文件nginx.conf # cat /usr/local/nginx/conf/nginx.conf user www www; worker_processes ; # 工作 ...
- AsyncTask的基本使用
// String --> doInBackground(Params... params)的参数 // File --> publishProgress(Progress... valu ...
- 1、C到C++安全性增强
1.C语言 #include <stdio.h> int main(void) { const int a = 10; //在C语言里这里不赋值可以编译的过去,但是这里不初始化以后就没办法 ...
- centos FTP服务器的架设和配置
yum install vsftpd 2.启动/重启/关闭vsftpd服务器 [root@localhost ftp]# /sbin/service vsftpd restart Shutting d ...
- 答CsdnBlogger问-关于安卓入行和开发问题
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 问1:请问大牛对功能和框架的认识有哪些?(提问者:执笔记忆的空白) 比如对于一个小公司来说,什么样的 ...