分享一个简单的第三人称缓动上下镜头控制思路

大佬们自行略过
1.效果:碰到自定义比如地面或者障碍的时候,摄像头不会穿透到障碍物里面挡住视线

GIF 2024-9-24 17-55-15

2.图形思路:
初始状态下 摄像机旋转和人物旋转为000,摄像机处于人物正后方,看向人物

圆心是人物
自定义摄像头处于人物正Z轴后面的距离就是红色圆的半径R

当鼠标上下mouse y移动时,相当于旋转人物Z朝向
利用人物Z朝向的反方向进行射线检测,如果碰到物体,获取到碰撞点坐标,将这个坐标设置为摄像机坐标

此时摄像机只是位置变了但是旋转(也就是摄像机面朝向)没有变(还是看的正前方),所以 人物坐标-当前摄像机坐标,得到一个方向向量,用四元数方法Quaternion.LookRotation(传入这个方向向量)赋值给摄像机旋转rotation,让摄像机看向此刻的人物

总体思路:摄像机没有碰撞点就正常沿着圆周移动,有碰撞点就获取碰撞点,让摄像机跟着碰撞点移动

优化:分别缓动摄像机的position和rotation 自定义缓动速度值speed暴露给面板。

延申:
1.上下旋转移动摄像机都解决了,左右旋转移动摄像机更简单,只需要在人物pos的x轴想象一个圆,按照类似的思路解决。
2.第三人称枪的开火路线应该就是摄像机的面朝向位置,也是人物body和head部位的IK看向的位置,只需要将摄像机面朝向往前寻找一个合适的点,让人物IK看向这个点,就可以做到抬头 低头等动作。

附上下旋转移动代码

1赞

角度限制为89度,90度可能会出现奇怪的问题

因为人物的上下旋转不能动,所以用一个空节点calculateCameraTransform代替这个人物点,每次update赋值同步一下人物位置pos就行

这图差点把我晃晕了 :sweat_smile:

上传限制4mb,所以我要动的快一点不然超了 :upside_down_face:

实际效果还是挺不错的

而且如果要实现开火,不应该用人物当做圆心,要用枪口点当圆心,方便后续开火抖动一系列逻辑,所以人物的默认持枪动作要尽量让枪朝着人物面朝向附近,不然你的子弹射击方向在摄像机看来会有点违和