根据角色体型和俯角自动确定FreeLook镜头参数

最近项目涉及到一个需求:如何自动确定镜头的参数(在Unity中即为轨道的高度和半径)。这个问题可以形式化为:给定角色身高、看向点偏移、俯角和人物在画面中的占高比,自动计算出相机到看向点的距离、相机中轨的半径和相机中轨的高度。本文推导出该计算公式,实现镜头参数自动化处理。

角色高度、看向点偏移、俯角与相机参数

我们的第一步目标是:给定角色高度、看向点偏移和俯角,能够自动计算出相机距离、相机轨道的半径和高度。在此之前,首先需要明确几个概念:

  • 角色高度:角色模型在游戏中的实际高度,因为我们目前关心的角色在屏幕中的占高比,暂不考虑角色宽度;
  • 看向点偏移:从角色Root结点的Y轴偏移量,如果等于角色高度则位于角色头顶位置,等于零则位于Root位置;
  • 俯角:相机看向角色看向点时与XZ平面的夹角;
  • 相机距离:相机到看向点的距离;
  • 相机轨道高度:相机从角色Root点开始的Y轴高度;
  • 相机轨道半径:相机轨道在当前高度上的半径。

这几个参数的关系可以用下图来表示:

几个参数之间的关系。X:角色高度,Y:看向点偏移,A:俯角,D:相机距离,H:相机高度,R:相机半径。

我们不难得出下面的关系:

但这是对的情况,当时,我们有:

但是由于我们在计算俯角时,以下方向为正方向,当时,俯角实际上是负值,所以也不需要加负号。于是,最终的公式仍然是统一的。

人物高度、人物占高比、FOV与相机距离

上述公式的一个前提是需要知道可自定,),而我们实际上关注的是人物在整个画面中的占高比,而相机屏幕与FOV有关,所以为了计算,实际上就是要考虑通过FOV和人物高度、人物占高比计算出相机距离。

现在我们假定人物占高比固定为,可以根据需求自行推导。

通过FOV和人物高度计算出相机距离。我们固定了1/3的人物占高比。

如上图所示,相机投影的上半部分角度为FOV的一半,在这里我们假设FOV为,那么一半就是。设相机距离为,当角色高度的一半,即占屏幕上半的时,我们不难得到下述公式:

但是上述公式没有考虑俯角,这就会导致一定的误差。下面我们分两种情况讨论,如下图所示:

修正后的相机距离用俯角、FOV和人物高度计算得出。我们固定了1/3的人物占高比。

角色半高在相机屏幕空间中的投影为。所以我们能够得到下述修正公式:

该公式对两种情况都是适用的。

总结

总的来说,只要给定角色身高、看向点偏移(一般来说设置为或者)和俯角,在固定人物在画面中占高比和FOV为的前提下,就可以根据下述公式计算相机到看向点距离、相机中轨半径和相机中轨高度

如果你需要改变人物在画面的占高比,或者相机的FOV,只需要按照上面的推导方法修改公式即可。

当然,你也可以继续精细化上述公式,如考虑实际的看向点偏移,但一般来说差别不是很大,在此不再赘述。