• 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中执行。

     

  • 相关阅读:
    【日常业务开发】接口性能优化
    2022 最新的 Java 八股文合集来了,彻底解决各大大厂面试难题
    leetcode17. 电话号码的字母组合
    更改Windows上的远程桌面的侦听端口
    忆联再次与 OpenCloudOS 完成产品兼容性互认证
    如何应对继承的双面性
    飞书 Android 升级 JDK 11 引发的 CI 构建性能问题
    ES6中的新增属性——解构赋值
    Redis内存淘汰机制
    3.生成验证码 + 开发登录、退出功能 + 显示登录信息
  • 原文地址:https://blog.csdn.net/qq_42705793/article/details/127638578