3D数学基础学习笔记(Unity3d)

最近学习unity3d基础知识,学到了3D数据,做下笔记,包含一些自己的理解,如有问题希望指出

一、向量

1.向量的定义

向量:有大小有方向的物理量 类名:Vector3

向量大小:向量的长度 计算:\sqrt[2]{x^{2}+y^{2}+z^{2}} 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.角度与弧度转换公式

一周的弧度:2\pi r / r = 2\pi

所以:1弧度 = 180度/\pi   1角度 = \pi/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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值