unity3d 摄像机抖动情况和解决方案汇总

来源:互联网 发布:mac系统升级发生错误 编辑:程序博客网 时间:2024/06/05 04:28

     用unity3d 如果你没有碰到摄像机抖动的问题,那么你是幸运的。我相信如果你的摄像机控制比较复杂,或者人物移动比较复杂,或多或少总会有这样的疑惑:摄像机好像再抖,或许是模型在抖。总之就是各种抖。当你以为发现问题并解决了,一切都很好,突然有一天,它又开始抖了,而且不止一次这样。我就碰到过这种情况,特此做下总结。

    首先你要理解摄像机什么情况下会给你抖动的感觉,简单来说你如果想让摄像机抖动,那么肯定是让摄像机不停变换位置,而且是无规则的。说白了,就是不规则的速度变化会引起抖动。注意这里是相对速度,因为如果绝对速度在变化,但相对速度是一致的,其实你看到的物体是不抖的。这一点在后面的一种情况会用到。接下来就分析下各种情况和原因以级解决方案。

1.摄像机控制很简单,却有大幅度的抖动。

这种情况其实一般不是摄像机控制的问题,而是你摄像机所看物体的策略的问题。首先你要确保摄像机是没帧都更新位置的,你可以放在Update()函数中或者LateUpdate()函数中,切忌不要放在FixedUpdate中去更新位置,因为FixedUpdate不保证没帧都执行,这样就会有断续的现象。然后你要确保摄像机看向的物体的移动是正常的,就是说物体不是在那里抖动的,但摄像机却没有一起抖,这可能和你的逻辑有关。不过这种情况并不常见。大部分时候,相信简单的摄像机控制是最能保证稳定的画面的。


2.摄像机控制简单,大部分时候不抖动,偶尔抖一下,时断时续。

这种情况非常令人困惑,因为理论上应该是不会抖动的,甚至很多时候你要怀疑是不是unity3d自己的问题或者我的帧数不稳定引起的?这里我首先要非常明确一点:Unity3d是一个成熟的商业产品,如果你能够确保正确使用里面的组件和写下正确的代码,那么是不会有这些问题的,包括摄像机抖动和其他一些常见的问题。你首先要看自己的代码和用法是否有问题。

这种情况的原因可能会比较多,我这里只列举我自己碰到的。第一种是因为不必要的平滑算法引起的。你可能会觉得奇怪,平滑算法难道不是为了摄像机不抖而存在的吗?怎么反而会引起摄像机抖动。甚至有的时候你感觉摄像机抖,然后加了平滑算法就不抖了。这里我要解释一下,也是一开始说的,摄像机抖动是基于相对速度的变化不稳定。那么假设你的摄像机本身控制比较简单,其实我们可以基本肯定相对变化速度是一致的。比如你摄像机就是看着一个人,这个去哪摄像机看哪,那么是不是说两人相对速度其实为0。然后你说人抖动怎么办?那么摄像机会一起抖,只不过由于他们相对速度为0,所以你看人是不抖的,但是如果你有场景作为背景,那么你会感觉地面有点抖。这是必须权衡的,因为在场景和人物不同步的情况下,肯定会有一个相对稳定而另一个相对抖动,一般我们和人物一致就好了,毕竟人的视觉肯定是聚焦人物的。那么在这样的基础上,我加了平滑算法,会怎么样呢?平滑无非两种,一种是延迟,一种是根据以前的速度进行加速度计算,然速度变化变慢。不论哪种,在摄像机控制简单的情况下都是画蛇添足。因为首先你已经确保了人和摄像机之间的稳定性。你却加了这种算法,导致了他们不再稳定,而且同时你也无法弥补场景那边被牺牲的抖动,可能反而更抖了。那么照这么说,平滑算法岂不是没用?不是的,后面的情况你会看到平滑算法的引用。只是在摄像机规则很简单的情况下,并不需要额外的平滑算法。

这里还有个小细节,就是你的摄像机一定要先设置好位置,再LookAt,如果你先LookAt,再设置摄像机的位置的话,那么你的摄像机其实LookAt了另一个地方了。这也是引起抖动的原因之一。

3.摄像机控制比较复杂,有时经常抖动,有时候又不抖,神经病一样的。

这种情况就开始复杂起来了。首先我建议你将摄像机改成简单的规则,看是否有抖动。有的话参考1和2里面的先处理。

如果你发现规则简单的时候是不抖动的,但规则复杂的时候抖动,那么你就要好好看看你的规则的代码了。如果你的摄像机移动有速度的概念,一定要将速度和Time.dealtTime联系在一起。也就是这一帧跑了多久时间,这是很重要的,因为每一帧的时间不同,你如果采用相同的位移,其实会引起不同的速度感。

其次,你要明确你的移动算法是基于匀速的,不论是移动还是旋转,都应该是匀速的(也许也可以基于某种速度变化规则,但务必是有规则的运动)。这里特别要注意匀速运动如果到了终点之前,其实是要一个减速的,不然就会过头,过头的话下一帧可能需要回到正确的位置,就会回退了,如此反复,也会抖动。

第三,不建议用ITween这种插件控制摄像机运动,因为它内部的代码其实并没有考虑这些,所以你用ITween导致摄像机抖动是很正常的。当然你图方便然后觉得抖就抖吧那倒是无所谓。

最后,如果还是找不到原因,就排除法,一句句注释掉代码,看到底是哪一句引起了抖动,然后再仔细分析原因。


4. 从正常的逻辑角度来讲摄像机确实会抖动,客观原因。

这种情况也不多,但确实存在。比如你的摄像机的规则是对准多个目标的中心,或者还和力啊,人的转向啊,人的速度变化很突然啊等等有关。如果本身的设计就是导致摄像机抖动的原因,那么这个时候就是平滑算法的用途了,平滑算法本身就是为了让本来变化的不稳定的速度趋于稳定。具体平滑算法有时间再写吧。今天要睡觉了。


0 0
原创粉丝点击