最近学习unity3d基础知识,学到了3D数据,做下笔记,包含一些自己的理解,如有问题希望指出
一、向量
1.向量的定义
向量:有大小有方向的物理量 类名:Vector3
向量大小:向量的长度 计算: api:Vector3.magnitude
单位向量:长度为1的向量 计算:向量/向量的大小 api:Vector3.normalized
Vector3 unity3d 文档描述:用于表示 3D 向量和点。
向量既然有方向和大小,所以向量是一条线,Vector3对象作为向量时,表示向量的起点就是原点。
2.向量的运算
向量相减(结果为向量):向量A - 向量B = 向量BA, 长度为a点到b点的长度,方向为指向a。实线才是真的向量BA
应用:计算两点之间的距离和相对方向
向量相加(结果为向量):向量A + 向量B = 组成平行四边形的对角线
应用:物体的移动。 点a沿着向量B的方向移动向量B长度的距离
向量与标量乘除(结果为向量):k * (x, y, z) = (kx, ky, kz) (x, y, z)/k = (x/k, y/k, z/k)
应用:缩放向量的长度
二、三角函数
1.角度与弧度
2.角度与弧度转换公式
一周的弧度: =
所以:1弧度 = 180度/ 1角度 = /180度
API:弧度 = 角度数 * Mathf.Deg2Rad
角度 = 弧度数 * Mathf.Rad2Deg
3.三角函数
正弦 sinx = a / c API:Mathf.Sin(float radian) 注:参数要的是弧度
余弦 cosx = b/c API:Mathf.Cos(float radian) 注:参数要的是弧度
正切 tanx = a/b API:Mathf.Tan(float radian) 注:参数要的是弧度
应用:根据一边一角,计算另外一边长
4.反三角函数
反正弦 arcsin a/c = x API:Mathf.Asin(float ) 注:参数要的是 a/c
反余弦 arccos b/c = x API:Mathf.Acos(float ) 注:参数要的是
反正切 arctan a/b = x API:Mathf.Atan(float ) 注:参数要的是
应用:根据两个边长,计算角度
三、向量的点乘、叉乘
1.点乘
公式:各分量乘积和 (x1, y1, z1) * (x2, y2, z2) = x1x2 + y1y2 + z1z2
几何意义:向量a*向量b = |向量a| * |向量b| * cos<a, b>
将两个向量的大小相乘,然后乘以向量之间角度的余弦值
点乘结果类型:常量值
API:Vector3.Dot(向量a, 向量b)
注:单位向量的点乘结果等于两向量夹角的余弦值,方向完全相同,点乘结果为1,方向完全相反,结果为-1,互相垂直结果为0
应用:计算两个向量夹角
float dot = Vector3.Dot(a.normalized, b.normalized);
float angle = Mathf.Acos(dot) * Mathf.Rad2Deg;
注:点乘计算出的夹角最大不会超过180,若两个向量夹角为270,则计算出的结果为90,也就是说计算的结果并不是准确的,所以需要结合叉乘可以准确算出夹角
2.叉乘
公式:(x1, y1, z1) * (x2, y2, z2) = (y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1 * x2)
几何意义:结果为两个向量所组成面的垂直向量,模长为两向量模长乘积再乘夹角的正弦值
有:|result| = |a||b| sinx
叉乘结果类型:向量
API:Vector3.Cross(向量a, 向量b)
unity3d 可以使用左手规则确定结果向量的方向
应用:可以向量result 的方向判断 向量a 和 向量b的相对位置,也就是顺逆时针关系
(若b在a顺时针,向量result相对向上,b在a逆时针,向量result相对向下)
点乘和叉乘综合应用:计算两个向量的夹角 [先用点乘计算出夹角,再用叉乘计算出顺逆时针,根据顺逆时针360-夹角]
四、欧拉角与四元数
这两个都是用作物体的旋转
1.欧拉角
虽然使用 Vector3 来表示欧拉角对象,但并不是向量或点,只是表示在x,y,z上的旋转角度
优点:三个数字表达方位,占用空间小。
沿坐标轴旋转的单位为角度,符合人的思考方式
任意的三个数字都是合法的,不存在不合法的欧拉角
缺点:同一方位存在多个欧拉角描述
万向节死锁:万向锁详解_哔哩哔哩_bilibili
2.四元数
用来表示旋转,具体详细了解可以百度百科
API 类名:Quaternion
注:transform.rotation 就是Quaternion类型
注:由于四元数我们不好理解,而欧拉角好理解,所以我们在做旋转时,会使用欧拉角,但是unity3d旋转时使用的是四元数,所以需要将欧拉角和四元数进行转换
API:欧拉角-->四元数 Quaternion.Euler(30, 0, 0) 将x轴旋转30度转为四元数旋转
四元数左乘向量:结果:新的旋转后的向量
Vector3 point = new Vector3(0,0,10);
Vector3 new_point = Quaternion.Euler(30, 0, 0) * point;
new_point 就是 point沿x轴旋转30度后的新位置
四元数乘四元数:结果:新的四元数(两个四元数旋转的合并)
Quaternion r1 = Quaternion.Euler(30, 0, 0);
Quaternion r2 = Quaternion.Euler(30, 0, 0);
Quaternion r3 = r1 * r2; //最终r3是60度的旋转
五、总结[unity3d离线文档加速]
物体在世界中总归就是 移动、缩放、旋转
物体移动:transform.position 赋值就可以实现移动
物体旋转:transform.rotation 赋值就可以实现旋转
游戏使用案例:
npc自动移动到玩家左前方30度的位置(物体移动)
玩家是否在敌人的扇形视野范围内(判断夹角和距离)
敌人攻击玩家,先使自己朝向玩家(旋转)
unity3d官网上的在线文档和下载下来的离线文档都会比较慢。
离线文档下载:离线文档 - Unity 手册
然后再将离线文档处理一下:https://github.com/ilclpj/UnityOfflineDoc