最近项目涉及到一个需求:如何自动确定镜头的参数(在Unity中即为轨道的高度和半径)。这个问题可以形式化为:给定角色身高
角色高度、看向点偏移、俯角与相机参数
我们的第一步目标是:给定角色高度
- 角色高度:角色模型在游戏中的实际高度,因为我们目前关心的角色在屏幕中的占高比,暂不考虑角色宽度;
- 看向点偏移:从角色Root结点的Y轴偏移量,如果等于角色高度则位于角色头顶位置,等于零则位于Root位置;
- 俯角:相机看向角色看向点时与XZ平面的夹角;
- 相机距离:相机到看向点的距离;
- 相机轨道高度:相机从角色Root点开始的Y轴高度;
- 相机轨道半径:相机轨道在当前高度上的半径。
这几个参数的关系可以用下图来表示:

我们不难得出下面的关系:
但这是对
但是由于我们在计算俯角时,以下方向为正方向,当
人物高度、人物占高比、FOV与相机距离
上述公式的一个前提是需要知道
现在我们假定人物占高比固定为

如上图所示,相机投影的上半部分角度为FOV的一半,在这里我们假设FOV为
但是上述公式没有考虑俯角,这就会导致一定的误差。下面我们分

角色半高在相机屏幕空间中的投影为
该公式对两种情况都是适用的。
总结
总的来说,只要给定角色身高
如果你需要改变人物在画面的占高比,或者相机的FOV,只需要按照上面的推导方法修改公式即可。
当然,你也可以继续精细化上述公式,如考虑实际的看向点偏移,但一般来说差别不是很大,在此不再赘述。