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

     

  • 相关阅读:
    结构体和联合体
    Android - Service
    Go的Struct结构体和(Json Form tag)
    腾讯联手警方重拳出击 《绝地求生》外挂首案告破
    Oracle 数据如何迁移到MySQL 图文详细教程
    RabbitMq-RabbitMq简介与七种工作模式
    webpack实践:解决组件库的静态资源在项目上加载不了的问题!
    【C语言进阶】简易通讯录的实现
    经济数据预测 | Python实现ELM极限学习机股票价格时间序列预测
    nn.LayerNorm解释
  • 原文地址:https://blog.csdn.net/qq_42705793/article/details/127638578