Unity-镜头移动的相关逻辑

首先看需求:

其实API等的都学过,一眼望下来感觉都会,写的时候就感觉很阻塞。还是熟练度的问题。 

最难的就是第一个,用角度控制斜率,我还专门画图写公式。最后发现是自己想复杂了。不多说了,直接看思路。

 在完成第一个问题前,先看第三个问题。摄像机要看向人物头顶上的一个方位。

那么我们需要去得到这个方位。

由于Vector3不能单独的改变x,y,z。因此我们在原本位置+Vector3.up*高度来得到,观测点位置。

 

 运行后可以看到nowPos点在(0,2,0)。

现在观测的点找到了,那么我们要完成第一个问题,角度控制斜率。

 从图中可以看到,摄像机到nowPos的夹角为\beta,那么我们现在需要思考的就是,如何通过\beta

 来得到摄像机camera的position。

 提示:(一)四元数乘以向量,几何意义为向量绕某一轴旋转\beta度。

              (二)点 + 向量 ,几何意义为点以当前坐标系移动。

 看上图,我们是否可以将 -forward这个向量旋转\beta度,来得到camera-target之间的向量。

然后让nowPos进行位移,就找到了camera的position.

要注意一点,我们使用四元数时:

 第二个参数为旋转的轴。此处的轴为target的x轴。

 

 在这个问题中是绕x轴转的。

一个四元数乘以一个向量,得到的结果为该绕某轴旋转。

 得到移动后的向量,但是注意,此时得到的是一个单位向量。如果我们想要摄像机与nowPos的距离可变的话,我们需要设置一个float变量dis来控制它。

 下一步 就是移动nowPos得到摄像机的位置了。

 进行测试:

 完美,第一个问题顺利解决。

第二个问题,通过滚轮控制摄像机距离(有最大和最小限制)

关于这个变量,我们在上方就定义过了。dis变量,我们需要将它和鼠标滚轮联系起来。使用Input.GetAxis(“xx”)函数。该函数返回-1~1的值。

GetAxis内填的是Unity自定义的控制键的string。

如果不记得变量名,在Project Setting设置里可以找到。

 限制最大最小值,mathf中有一个夹紧函数:

 有三个参数,参数一<参数二时,返回参数二。参数一大于参数三时,返回参数三。其余返回参数一。叫夹紧函数!

 试一试: 

完美,再完成第三个问题,摄像机看向nowPos。关于解决这个问题,大部分时候会想到用LookAt函数。

 但是LookAt,也不过是对四元数的一种封装,我们采用可控量更强的四元数写法。

 第三点完成。第四点,用Vector3来实现摄像机跟随。老生常谈拉。

第五点 和第四点同理。

 还有就是 摄像机有关的操作最好都在LateUpdate中执行。

猜你喜欢

转载自blog.csdn.net/qq_42705793/article/details/127638578
今日推荐