黑魂复刻游戏的摄像机抖动问题——Unity随手记

前言
之前制作摄像机时,我们曾经想使用SmoothDamp来实现摄像机延迟移动(摄像机博客的链接),但是造成了摄像机旋转时的抖动问题,今天的博客就是为了解决这个问题。

今天实现的内容:
问题产生的原因
在我们的代码中,摄像机位移使用了SmoothDamp,但是旋转却是直接欧拉角赋值,这导致了摄影机位置还没有调整完,旋转就已经到位了。想象一下这个过程,摄像机的视线中心在旋转时会偏移角色颈椎位置,这就产生了抖动。

        // 摄像机游戏对象的移动和旋转
        cameraGO.transform.eulerAngles = this.transform.eulerAngles;

通过完全固定摄像机每帧的指向解决问题

通过使用LookAt,在每一帧将摄像机指向到cameraHandle的transform,我们就能解决问题,这是最简单的办法。

        // 摄像机游戏对象的移动和旋转
        cameraGO.transform.LookAt(cameraHandle.transform);

可能出现的运用RootMotion动画晃动问题
当我们运用上述解决方案以后,可能会出现运用了RootMotion的动画播放时出现晃动的问题,这个问题可能来自两处。
1.Animator的游戏动画更新速率问题,我们的动画机是可以选择何种更新模式的,normal意味着和Update一起更新,根据情况我们选择Animator Physics。
黑魂复刻游戏的摄像机抖动问题——Unity随手记

2.该动画Root Motion的信号问题,Root Motion可能会有杂波,我们可以用一些手段平滑掉。以下方案将上一帧的信号与当前帧的信号相加再除以2。

		// 更新m_deltaPos为动画机的Root Motion 之所以用累加是因为物理帧和动画帧不一样 在物理帧的最后会将m_deltaPos清零
	    // 加上上一帧的再除以2.0是为了平滑
        m_deltaPos += (m_deltaPos + (Vector3)_deltaPos) / 2.0f;
上一篇:黑魂复刻游戏的玩家控制器(播放攻击动画时的位移)——Unity随手记


下一篇:【图像修复】基于matlab GUI运动模糊消除(逆滤波)【含Matlab源码 847期】