ogre3D学习基础5 -- 阴影与动画
五、阴影
阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系。
启用阴影:
缺省情况下,阴影是关闭的,开启方式如下:
1、建立场景时就设置阴影技术有效 -- mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
2、创建一个或者多个光源
3、关闭那些不需要投射阴影的物体,可以用物体的aetCastShadows(false)来实现。
4、设置投影的最远距离,通过SceneManager::setShadowFarDistance来限制投影的最远距离。
5、关闭那些不需要接受阴影的材质,透过Material::setReceiveShadows关闭阴影的接收。
选择阴影:
缺省情况下Ogre认为所有的不透明物体都可以投射和接收阴影。关闭方式如下:
1、关闭光源的投影功能,调用Light::setCastShadows(false),这个光源不会使任何物体产生阴影。
2、关闭材的阴影接收,调用Mateial::setReceiveShadows(false),可以使任何使用这种材质的物体不再接收阴影。
3、关闭独立物体的阴影,调用MovableObject::setCastsShadows(false),可以关闭具体物体的阴影功能。
4、关闭整个渲染队列的阴影,RenderQueueGroup::setShadowsEnabled(false)可以关闭整个渲染队列的投影和接收功能。
模板阴影:
模板阴影是一种通过硬件的模板缓存来"标记"屏幕中区域的方法。在系统中通过SceneManager::setShadowTechnique方法来打开模板阴影技术,并传入参数SHADOWTYPE_STENCIL_ADDITIVE或者是SHADOWTYPE_STENCIL_MODULATIVE。
弊端:场景中所有的阴影使用僵硬的边缘,并且无法对使用了shader的物体进行阴影操作。
纹理阴影:
纹理阴影是通过以光源作为”招眼点“把投影体渲染到纹理上来得到,然后再把这个纹理投射到接受阴影的表面上来得到最终的结果。
阴影的基础其实就是一张纹理图,它拥有一个固定的像素数量,当纹理被拉长之后这些像素就变得很明显和突兀,这里有一些方法来改善这个缺点:
1、选择一个”投影基础“
Uniform --- 最简单的投射方法
Uniform Focussed --- 仍然采用了标准的摄像机投影,只不过是摄像机聚焦到主观察摄像机所观察的区域
LiSPSM --- Light Space Perspective Shadow Mapping - 同时基于主观察摄像机聚焦并扭曲阴影的视截体
PlanOptimal --- 对一个独立的接收平面寻找最优的投影保真度
2、过滤
通过多次采样的方法来改善阴影的糅合度以及平滑边缘
3、使用更大一点的纹理
采用更加巨大的纹理来进行阴影处理,但是必须以硬件为基础。
光源选择:
有向光光源---采用更加巨大的纹理来进行阴影处理。
聚光灯光源----向着某一方向扩散光源
点光源 --- 可能会产生抖动,不建议使用点光源对纹理进行渲染。
配置纹理阴影:
1、阴影纹理的最大数量 --- SceneManager::setShadowTextureCount
2、阴影纹理的尺寸 --- SceneManager::setShadowTextureSize
3、阴影纹理的最大距离 --- 决定阴影结束的距离
4、阴影纹理的偏移量(针对有向光光源)
5、阴影淡出设置---阴影在远距离进行了淡出的处理来保证不会让阴影边缘过于生硬。
相对于模板阴影来说,纹理阴影有一个主要的优势——这些数据可以被标准的着色器引用并处理。
调制阴影:
调制阴影的工作方式是暗化已经渲染完场景的颜色。过程为:
1、场景会正常的渲染所有接受阴影的物体,
2、对每一个光源执行调制过程,把场景变暗,
3、渲染那些不接收阴影的物体。
六、动画
1、骨骼动画 ---- 运用骨骼结构来定义网格数据。
骨骼动画是根据网格数据中的骨骼信息来产生动画效果,一般是根据顶点上绑定的骨骼信息轮询确定模式的顶点。骨骼动画一般是通过3d建模工具完成的。骨骼和动画信息被保存在以.skeleton结尾的文件中,可以通过OGRE的exporters导出。
ogre3d支持的骨骼动画:
1 每个网格可以定义一个独立骨骼动画。
2 每个骨骼动画可以支持无限的骨骼。
3 作用于骨骼上的反向动力。
4 每个骨骼集可以定义多个名称的动画。
5 每个骨骼动画可以有多个关键帧。
6 关键帧之间的线性或者是样条插值。
7 一个顶点可以关联多个骨骼,并且可以被赋予权重,用来做融合。
8 通过权值融合,多个动画可以在同一时刻被作用于一个网格数据。
2、顶点动画 ----- 保存顶点的快照来决定网格数据如何改变。
顶点动画直接利用顶点的运动信息来产生动画。每个轨迹对应于一个VertexData的实例。顶点动画的数据存储于.mesh文件中。又分为两种:
变形动画:它根据动画的关键帧时间线插入相应的网格数据。
姿态动画:根据不同的权重和对顶点数据的偏移融合不同的姿态,来产生最后的结果。在面部动画中,姿态动画应用比较广泛。
3、场景节点动画 ----- 根据预先定义的路径来操作场景节点上挂接的实体的运动产生动画效果。
4、数值动画 ---- Ogre提供扩展的类来根据任何值产生动画效果。、
5、动画控制
通常的情况下,Ogre有两种不同的操作动画对象的方法,一种是通过关键帧,另外一种是通过控制器。
Ogre支持下面几种动画轨迹类型(在同一轨迹中的所有关键帧必须使用相同类型)。
数字动画轨迹(NumericAnimationTrack):与数字关键帧(NumericKeyFrame)对应,每个关键帧中都保存了相应的数字数据。这里使用了AnyNumeric数据类型来保存这些数值。在Ogre自身有一种特殊的数据结构被称为Any,它很类似动态语言中的可变类型,可以用来储存各种C++类型的数据。AnyNumeric是Any的子类,负责储存各种数值类型,比如实数和整形。
节点动画轨迹(NodeAnimationTrack):与变换关键帧(TransformKeyFrame)对应,每个关键帧都包含了两个三元向量和一个四元数,分别用来表现节点在当前帧的位置、缩放以及方向。
顶点动画轨迹(VertexAnimationTrack):同时对应于顶点变形关键帧(VertexMorphKeyFrame)和顶点姿态关键帧(VertexPoseKeyFrame),每个关键帧都保存了特定时间的顶点位置数据,在姿态动画(Pose)中还保存了顶点混合权重。
6、动画状态
长度:以秒为单位,获得动画片段的长度。
当前位置:得到或者设置当前播放的位置,换句话说是从动画片段(而不是整个动画)开始到当前位置所流逝的时间(秒)。
动画名称:尽管你可以通过物体本身得到所有的动画列表,这里仍然提供只读属性的动画名称用来在不知道动画名字情况下调用。
循环:设置或者得到在动画片段结束后是否循环播放。
启用:设置或者得到这个动画是否启用。
权重:动画可以被混合。
终于看完了,现在脑袋里晕晕乎乎的,东西太多了,看来只能慢慢消化了。
ogre3D学习基础5 -- 阴影与动画的更多相关文章
- ogre3D学习基础13 -- 键盘控制网格动画mesh
以上一节为蓝本,这里增加一点难度,添加了四个节点,增加键盘控制移动速度,使用bool变量控制是否移动. 第一,要增加键盘控制,那就使用OIS::KeyListener,在监听器里添加一个父类KeyLi ...
- ogre3D学习基础12 --- 让机器人动起来(移动模型动画)
学了那么长时间,才学会跑起来.My Ogre,动起来. 第一,还是要把框架搭起来,这里我们用到双端队列deque,前面已经简单介绍过,头文件如下: #include "ExampleAppl ...
- ogre3D学习基础1 -- 核心对象与脚本技术
一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...
- ogre3D学习基础19 --- 材质的继承,纹理的滚动与旋转
以上一节为基础,废话不多说. 首先新增一个节点,用于比较显示 //新增一个节点 ent = mSceneMgr->createEntity("Quad"); ent-> ...
- ogre3D学习基础9 -- 光源程序实例
这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...
- ogre3D学习基础7---材质详解
物体着色的基础 --- 四种不同光照作用 1.环境反射 近似的模拟了场景中的全局辐射,也就是用来近似模拟所有光在场景中不断散射的结果.材质中有相应的属性来代表这种环境反射颜色. 2.漫反射 这种颜色是 ...
- ogre3D学习基础18 -- 材质的使用与脚本的简单书写
这一节以基础16为基础,练习材质的使用. 第一,看看框架 //material #include "ExampleApplication.h" class TutorialAppl ...
- ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙. 第一,还是框架,我们依然使用ExampleApplication文件,框架如下 #include "Ex ...
- ogre3D学习基础4 -- 网格工具与硬件缓存
三.网格工具(Mesh) 1.导出器(Exporters)--- 用于从模型生成器中得到数据并且导入到OGRE中去. 导出器是指通过3D模型工具的插件写成网格数据和骨骼动画的文件格式可以在OGRE中被 ...
随机推荐
- WPF样式学习:ToolBar的使用
隐藏拖动把手: 设置ToolBar属性 ToolBarTray.IsLocked="True",可以达到隐藏拖动把手的目的 private void ToolBar_Loaded( ...
- 利用临时表实现CTE递归查询
一.CTE递归查询简介 --CTE递归查询终止条件在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(Common Table Expression),只需要编写少量的代码,就能实现递 ...
- [转]iOS开发总结之代码规范
转自:http://www.cocoachina.com/ios/20151014/13678.html 命名规范 总 的来说, iOS命名两大原则是:可读性高和防止命名冲突(通过加前缀来保证). O ...
- 2018.6.16 PHP小实验
PHP实验 实验一 <?php /** * Created by PhpStorm. * User: qichunlin * Date: 2018/5/17 * Time: 下午5:35 */ ...
- MicroService 微服务提供者搭建
本机IP为 192.168.1.102 1. 新建Maven项目 microservice 2. pom.xml <project xmlns="http://maven. ...
- PAT (Basic Level) Practise (中文)- 1003. 我要通过!(20)
http://www.patest.cn/contests/pat-b-practise/1003 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入 ...
- 如何着手学习一个新的PHP框架
如今的PHP框架层出不穷,名气也各不相同.如何快速掌握一种框架?看看本文吧~ 如今的PHP框架层出不穷,名气也各不相同.我不是这方面的专家,甚至不能熟练地使用其中的一种,所以就不作推荐了.这里我要讨论 ...
- 自己写一个Promise
参考Promise 的 官方规范 https://promisesaplus.com/ Promise 其实就是一个状态机 它只有两种状态变化 pending => fulfill ...
- C++ 无限定名称查找
无限定名称查找 (关键字:懒惰,挑捡,using指令的特殊性) 无限定名称查找实际上就是指没有限定(名称空间和名称空间运算符)名存在的一个名字的出现,其中对于using指令,其内部包含的所有的声明是被 ...
- 第27题:Leetcode226: Invert Binary Tree反转二叉树
翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 思路 如果根节点存在,就交换两个子树的根节点,用递归 ...