Unity3D中摄像机常用技巧Dolly&nbs…
2015-06-29 12:13
274 查看
最近学习Unity3D文档的过程中,看到了几种关于摄像机的技巧。其中Dolly Zoom和Oblique
Frustum属于摄像机的特效,而Occlusion Culling属于摄像机的优化。这里稍微总结一下。
1)Dolly
Zoom,即滑动变焦,是一种常用的摄影技巧。这种技巧可以突出场景中的目标对象,目标对象来摄像机移动的过程中基本保持不变,而目标对象周围的景物则产生一种剧烈变化的扭曲效果。具体可以参考这里。
在unity中,Dolly Zoom效果也非常容易实现,可以参考unity的官方文档这里。主要分为两个步骤:
第一步:初始化过程中,通过当前摄像机的FOV角度和摄像机到目标对象的距离Distance,计算并保存目标对象的视锥体截面高度FrustumHeight。
第二部:在移动摄像机的过程中,通过当前摄像机到目标对象的距离newDistance和保存的FrustumHeight动态调整FOV角度。
2)Oblique
Frustum,偏移的视锥面。一般来说,摄像机的中心射线穿过视锥面的中心,视锥面围绕交点中心对称。然而通过调整视锥面对于该交点的偏移,包括水平偏移和垂直偏移,可以在视图上制造一种偏移效果。详细介绍看这里。
应该注意的是,Oblique
Frustum的效果以及直接调整摄像机的旋转角度的效果的细微差别。前者的视锥体的中心射线是保持不变的,而后者是变化的。通过观察下图中两个立方体的细微差别可以清楚发现。
3)Occlusion Culling,遮挡裁剪。unity自带了Frustum
culling,在视锥体外的对象是不参与渲染过程的,这可以避免每一次渲染都要渲染整个场景,大大减少了渲染的时间。然而,很多情况下,视锥体内的对象会发生相互遮挡的现象。例如,角色处于室内,墙壁则遮挡了室外的所有对象。考虑到这种现象,unity
pro提供了Occlusion
Culling功能。但是这种功能不是默认使用的,需要人为调用。详细参考这里。主要分为3个步骤:
第一步:设置相关参数。其中Small
occluer影响遮挡准确度和记录文件的大小。越小,则越准确,同时记录文件越大。
第二步:设置Occlusion
Area。OA的作用有2个,第一是如果超过OA的范围,则OC失效。第二是OA限制了动态物体的活动区域,超过OA范围的动态物体不参与OC。在没有设置OA的情况下,OA默认为整个场景。
第三步:进行预计算和调试。可以发现,使用了Occlusion
culling之后,场景中的部分对象已经不参与渲染了。
总结:
1)对于Occlusion culling,场景中的大部分静态物体应该标记为occluder static和occludee
static。前者表面该物体可以遮挡其他物体,后者表面该物体可以被其他物体遮挡。但是也有特例,例如玻璃门应该是不可以遮挡其他物体但是可以被其他物体遮挡。
2)应该检查Occlusion area,确保需要参与OC的动态物体都在OA范围之内。
Frustum属于摄像机的特效,而Occlusion Culling属于摄像机的优化。这里稍微总结一下。
1)Dolly
Zoom,即滑动变焦,是一种常用的摄影技巧。这种技巧可以突出场景中的目标对象,目标对象来摄像机移动的过程中基本保持不变,而目标对象周围的景物则产生一种剧烈变化的扭曲效果。具体可以参考这里。
在unity中,Dolly Zoom效果也非常容易实现,可以参考unity的官方文档这里。主要分为两个步骤:
第一步:初始化过程中,通过当前摄像机的FOV角度和摄像机到目标对象的距离Distance,计算并保存目标对象的视锥体截面高度FrustumHeight。
第二部:在移动摄像机的过程中,通过当前摄像机到目标对象的距离newDistance和保存的FrustumHeight动态调整FOV角度。
2)Oblique
Frustum,偏移的视锥面。一般来说,摄像机的中心射线穿过视锥面的中心,视锥面围绕交点中心对称。然而通过调整视锥面对于该交点的偏移,包括水平偏移和垂直偏移,可以在视图上制造一种偏移效果。详细介绍看这里。
应该注意的是,Oblique
Frustum的效果以及直接调整摄像机的旋转角度的效果的细微差别。前者的视锥体的中心射线是保持不变的,而后者是变化的。通过观察下图中两个立方体的细微差别可以清楚发现。
3)Occlusion Culling,遮挡裁剪。unity自带了Frustum
culling,在视锥体外的对象是不参与渲染过程的,这可以避免每一次渲染都要渲染整个场景,大大减少了渲染的时间。然而,很多情况下,视锥体内的对象会发生相互遮挡的现象。例如,角色处于室内,墙壁则遮挡了室外的所有对象。考虑到这种现象,unity
pro提供了Occlusion
Culling功能。但是这种功能不是默认使用的,需要人为调用。详细参考这里。主要分为3个步骤:
第一步:设置相关参数。其中Small
occluer影响遮挡准确度和记录文件的大小。越小,则越准确,同时记录文件越大。
第二步:设置Occlusion
Area。OA的作用有2个,第一是如果超过OA的范围,则OC失效。第二是OA限制了动态物体的活动区域,超过OA范围的动态物体不参与OC。在没有设置OA的情况下,OA默认为整个场景。
第三步:进行预计算和调试。可以发现,使用了Occlusion
culling之后,场景中的部分对象已经不参与渲染了。
总结:
1)对于Occlusion culling,场景中的大部分静态物体应该标记为occluder static和occludee
static。前者表面该物体可以遮挡其他物体,后者表面该物体可以被其他物体遮挡。但是也有特例,例如玻璃门应该是不可以遮挡其他物体但是可以被其他物体遮挡。
2)应该检查Occlusion area,确保需要参与OC的动态物体都在OA范围之内。
相关文章推荐
- Unity3D中的Grobal Illuminit…
- unity3D中阴影渲染的shadow a…
- UnityC# MD5验证
- Unity3D学习笔记第一课
- unity, List namespace
- unity5, UGUI刺穿问题解法
- unity架构原则(摸索、增补中)
- (译)Cg Programming/Unity(Cg编程/Unity)
- Unity3D之AssetBundle学习:Android上运行笔记
- [Unity-24] Unity的四种加载场景的方法
- unity手游《摩卡世界online》全套源码(服务端+客户端+数据库)
- unity资源管理
- Unity炸弹爆炸伤害(群攻伤害)
- 学习笔记:Unity战斗卡牌游戏(一)-----NGUI基础组件使用及代码修改获取
- 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)
- unity, remove a scene from build settings
- Unity 脚本学习总结
- Unity3d之A*算法在游戏中的应用(一)
- unity, read text file
- Unity 脚本优化