unity摄像机旋转 (干货)B站上的学习记录,你值得拥有!

unity摄像机旋转 (干货)B站上的学习记录,你值得拥有!

虽然百度上有很多相关教程,B站上也有很多大佬发过视频教程。 但是我在云中看到了很多。 有时我想增加更多的功能,我不会改变它们。 碰壁了一个多星期,我明白了。 在这里记录下我的学习记录。

一、基础篇

这里是重点,如果不了解基础知识,就无从下手。

(1) 什么是向量? 一个向量就是:一个有大小(magnitude)和方向的量是一个向量。

通俗地说:坐标系上有两点,即A点和B点,A点到B点的向量表示A点到B点的方向,其大小就是A点到B点的距离.

(2)向量的坐标:由一对数组成,表示为向量沿坐标轴(基本向量)移动的单位距离。

(3)向量的加法:就是对向量进行位移运算。

(4)向量乘法:表示是对原向量的缩放(方向不变,大小改变)

unity 欧拉角旋转_oppo可以旋转摄像头的_unity摄像机旋转

从原点(0, 0)到(1, 2)的向量,乘以2,变成(2, 4),向量的方向不变,大小变成原来的两倍

二、要求

现在有必要明确一下,需要达到什么样的效果?

(1) 当玩家按下“↑”键时,玩家角色会向前移动,窗口的视野应该面向前方。

(2) 视野应始终跟随玩家角色,即摄像机与角色之间的距离是固定的。

(3)当视野被遮挡时,自动调整视野位置到可以看到人物的地方。

(4) 滚动鼠标滚轮时,可以调整相机与角色的距离(向上滚动是放大,向下滚动是缩小)。

(5) 按住鼠标右键向左拖动时,视野向左转; 向右拖动时,视野会向右转; 抬头转身。

3.实现

(1) 由于要求是视野的正面方向与角色的正面方向一致,也就是说摄像机和角色的方向一致unity摄像机旋转,可以调整两者的距离.

① 重新设置角色坐标(0, 0, 0)

② 重置相机坐标(0, 0, 0)

③由于坐标系的z轴代表正面,我想让相机看到角色的背面,所以向后拖一点距离。

这里以距离5为例。 重新设置为5,即相机坐标修改为(0, 0, -5)。

(2) 摄像机始终跟随角色,也就是说摄像机与角色的距离是固定的

以上面的例子为例游戏策划,距离5就是始终保持的相机和角色之间的距离。

因为角色可以移动,所以需要实时计算摄像机的距离位置。 具体方法如下:

① 计算相机和角色之间的偏移量。

相机与角色的偏移量(向量Offset)=相机坐标-角色坐标。

由于向量的定义,可知向量Offset描述的是相机坐标到角色坐标的方向和距离。

② 相机坐标=当前角色坐标+偏移量。

既然相机是跟着角色走的,那么就必须保证相机的方向和角色的方向要始终保持一致,距离也要保持一致。

示例:当角色向上和向右移动时 (1, 0, 2),相机也必须移动 (1, 0, 2)

(3) 简单实现

(1)在场景中,首先调整摄像机和角色的位置和角度。

unity 欧拉角旋转_unity摄像机旋转_oppo可以旋转摄像头的

(2) 实现代码

unity 欧拉角旋转_unity摄像机旋转_oppo可以旋转摄像头的

Vector3.Lerp(起点,终点,t)

函数说明:在起点坐标到终点坐标确定的直线上,这两点之间任意一点的坐标,参数t表示百分比,0表示起点坐标,大于等于1时,表示终点坐标。 如果为0.5,则表示两点之间形成的线段的中心位置的坐标。

所以使用这个参数的目的是为了让相机能够顺畅跟随。 如果不使用该参数,当角色使用位移技能瞬移一定距离时,相机也会瞬移,通常相机会抖动。

好了,一个简单的相机跟随就完成了。

(4) 摄像机围绕玩家旋转,但距离保持不变

在PRG游戏中,一般可以通过鼠标或摇杆操作来改变视角。

分析

当我们改变视角时,相机和角色之间的距离是不变的。 也就是说,当以角色的位置为原点,以角色到相机的距离为半径时,就会形成一个圆。 因此unity摄像机旋转,镜头移动的轨迹一直是以角色所在位置为原点形成的圆圈。

①当向量从某一点开始旋转360度,会形成一个圆,那个点就是圆心,向量终点的坐标就是圆的边。

② 因此,当要让对象A绕对象B旋转时,只需要旋转向量,然后加上(减去)对象B的坐标即可。

完成

(1) 摄像机围绕角色旋转

unity 欧拉角旋转_unity摄像机旋转_oppo可以旋转摄像头的

oppo可以旋转摄像头的_unity 欧拉角旋转_unity摄像机旋转

升高相机位置

跑步看到的效果是摄像机一直围绕着角色旋转。

(2) 鼠标操作调整摄像机角度

unity摄像机旋转_oppo可以旋转摄像头的_unity 欧拉角旋转

(3)处理摄像头穿墙问题

原因:当摄像头和播放器之间有障碍物时,摄像头会被障碍物挡住,导致显示器穿墙或直接被障碍物挡住。

解决方法:出现这种情况时,只需将相机移动到没有障碍物的位置即可。

想法:

从玩家角色的位置开始3D动画,向相机的方向发射一条射线。

当光线碰撞到物体时,判断物体是否是相机,如果不是,则将碰撞点的位置设置为相机的新位置。

PS:当玩家离障碍物很近的时候,还是会出现穿墙的情况。 这个时候只要设置障碍物的碰撞体比显示的模型大即可。

unity 欧拉角旋转_unity摄像机旋转_oppo可以旋转摄像头的

计算相机的新位置

unity 欧拉角旋转_oppo可以旋转摄像头的_unity摄像机旋转

转移

完整代码: