第三人称摄像机
这里例子的相机类似空战吧,和AGA也不是很像。
摄像机的实现总体大差不差,这里通过这个案例说一些点。

1. 保持角色在相机内,并且有合适的大小。
这里用到的参数有两个:角色与相机的相对角度、角色与相机的距离。
这里求得角色与镜头的相对角度。
需要说一下,由于角色总会在镜头视锥体内,相对于镜头正方向,不会有大角度。
因此做的只是简单的处理。下文看向绿球(target)部分会有完整的处理。
求角色与相机距离有两种标准,一种就是3D空间内两点的距离,这里用另一种,角色所在平面与镜头所在平面距离。两个平面都是摄像机的视锥体切面。
这里用之前发的矩阵的方式计算的,直接把角色位置给镜头转相机空间位置并取z即可。
2. 插值
直接为变换赋值总是生硬的,使用插值是最常用的柔和化方式。
这里的插值使用上文计算出的参数,实现让上文目标。
首先,实现让镜头尝试将角色保持在视锥体内。
这里需要解释视锥体的尺寸由camera组件的FOV Axis、Field of View和屏幕比例共同决定。
这里的边界是一个缩小版的视锥体切面,是一个到达矩形的四条边时产生变换的实现。
如果想要实现触碰到圆形、椭圆型等其他几何图形的边界而发生变换,可以将“角色”的世界位置转为屏幕位置,然后代入相应图形的公式即可。
保持距离
这里要说明的是“角色”对象在镜头跟随时可能会产生“闯动”一样的闪烁。
下文的Lerp是一种先极快后极慢的插值,如果插值运算总是插值几帧、不动几帧,实机中就会表现为这样的闪烁。
将插值开始时的速度设定的很慢,并且使插值基本不会满速,可以很大程度避免这种情况。
最后,要实现镜头的旋转,对于LookAt尽量不去使用,镜头很少应用z轴上的旋转,运算也会变得复杂。
这里实现了一个插值的LookAt。
角度的运算忠实的求两条线段组成的角的夹角,如果不去else if 反向方向的线段,那么就需要有这样的运算。
正确的角度

需要调整的情况

