欢迎光临散文网 会员登陆 & 注册

第三人称摄像机

2023-05-21 15:29 作者:莫末陌寞  | 我要投稿

这里例子的相机类似空战吧,和AGA也不是很像。

摄像机的实现总体大差不差,这里通过这个案例说一些点。

1. 保持角色在相机内,并且有合适的大小。

    这里用到的参数有两个:角色与相机的相对角度、角色与相机的距离。

        这里求得角色与镜头的相对角度。

        需要说一下,由于角色总会在镜头视锥体内,相对于镜头正方向,不会有大角度。

        因此做的只是简单的处理。下文看向绿球(target)部分会有完整的处理。

        求角色与相机距离有两种标准,一种就是3D空间内两点的距离,这里用另一种,角色所在平面与镜头所在平面距离。两个平面都是摄像机的视锥体切面。

        这里用之前发的矩阵的方式计算的,直接把角色位置给镜头转相机空间位置并取z即可。

2. 插值

    直接为变换赋值总是生硬的,使用插值是最常用的柔和化方式。

    这里的插值使用上文计算出的参数,实现让上文目标。

    首先,实现让镜头尝试将角色保持在视锥体内。

    这里需要解释视锥体的尺寸由camera组件的FOV Axis、Field of View和屏幕比例共同决定。

    这里的边界是一个缩小版的视锥体切面,是一个到达矩形的四条边时产生变换的实现。

    如果想要实现触碰到圆形、椭圆型等其他几何图形的边界而发生变换,可以将“角色”的世界位置转为屏幕位置,然后代入相应图形的公式即可。

保持距离

这里要说明的是“角色”对象在镜头跟随时可能会产生“闯动”一样的闪烁。

下文的Lerp是一种先极快后极慢的插值,如果插值运算总是插值几帧、不动几帧,实机中就会表现为这样的闪烁。

将插值开始时的速度设定的很慢,并且使插值基本不会满速,可以很大程度避免这种情况。

最后,要实现镜头的旋转,对于LookAt尽量不去使用,镜头很少应用z轴上的旋转,运算也会变得复杂。

这里实现了一个插值的LookAt。

角度的运算忠实的求两条线段组成的角的夹角,如果不去else if 反向方向的线段,那么就需要有这样的运算。

正确的角度

需要调整的情况


第三人称摄像机的评论 (共 条)

分享到微博请遵守国家法律