Unity】Unity 几何知识、弧度、三角函数、向量运算、点乘、叉乘

基础几何知识

角的度量方式

角的度量方式分为角度(Degree)和弧度(Radian)两种。角度就是将一个圆形切成360份,每一份就是1度角。弧度是当弧长等于圆的半径时即为1弧度。
角度弧度示意图

角度弧度转换

在这里插入图片描述

三角函数

在直角三角形中(下图为例),如果 a 、 b 、 c 、 x \ a、b、c、x a、b、c、x中的两个变量已知则能计算出另外两个变量的值。
在这里插入图片描述
计算公式
正弦: sin(x)=a/c (对比斜)
余弦: cos(x)=b/c (临比斜)
正切: tan(x)=a/b (对比临)
余切: cot(x)=b/a
正割: sec(x)=c/b
余割: csc(x)=c/a
反正弦: arcsin(a/c)=x
反余弦: arccos(b/c)=x
反正切: arctan(a/b)=x

已知一角和一边,求另外两边,用sin、cos、tan。
已知两边,求角,用arcsin、arccos、arctan。

常用三角函数值
在这里插入图片描述
在这里插入图片描述
使用方法
已知一个角和一条边,用 sin、cos、tan 。
已知两条边求角度,用 ArcSin、ArcCos、ArcTan 。

Unity应用

在代码中调用Mathf.Sin等三角函数方法时传入的参数并不是角度,而是弧度。

比如如果我们想要获取sin30度的值不能这样写:Mathf.Sin(30)。这样是错的。
正确的写法应该是Mathf.Sin(30 * Mathf.Deg2Rad),将角度转为弧度再传参,得到的结果就是0.5了。

下图为官方API的描述。
在这里插入图片描述
要求输入的角度是以弧度为单位的,所以要用这些方法时经常要用到角度和弧度的转换。

向量
向量是一个数字列表,表示各个维度上的有向位移。它是一个有大小有方向的物理量。大小就是方向的模长,方向描述了空间中向量的指向。向量可以用来表示物体的位置和方向。
在这里插入图片描述
在这里插入图片描述

向量加减法

向量的加减就是向量对应分量的加减,类似于物理学中力的正交分解。
在这里插入图片描述

向量相减

向量相减等于各分量相减。
在这里插入图片描述
几何意义:向量a与向量b相减,结果理解为以b的终点为起点,以a的终点为终点的向量。方向由b指向a。
注意:我们可以把向量相减理解为a、b终点的连接,但实际上该向量准确起始位置应该是坐标原点。
在这里插入图片描述
实际应用:计算两点之间的距离和相对方向。

向量相加

向量相加等于各分量相加。
在这里插入图片描述
几何意义:如下图,假设空间中有两个向量a和b,a与a’平行且长度相等,b与b’平行且长度相等。a+b就相当于a,b,a’,b’所围成的平行四边形的对角线。
在这里插入图片描述
也可以这么说,由向量a的起点出发,沿着a的方向走a的长度,然后沿着b的方向走b的长度,达到的点相当于从a的起点沿着a+b的方向走a+b的长度。

实际应用:物体的移动。

向量与标量的乘除

在这里插入图片描述
在这里插入图片描述
实际应用:加速、减速、放大、缩小。

点乘

点乘又称点积或内积。表示为各分量的乘积和。
在这里插入图片描述
注意结果不是一个向量,而是一个标量(Scalar),可以是负数。

几何意义: a ⋅ b = ∣ a ∣ ∣ b ∣ cos ⁡ ( a , b ) 当a、b的模为1时,ab的点乘值为∠ab的cos值,再通过反余弦就可以获得角度。

// 计算点乘值
float dot = Vector3.Dot(a.position.normalized, b.position.normalized);
// 计算夹角
float angle = Mathf.Acos(dot) * Mathf.Rad2Deg;

第一步计算点乘值,第二步计算夹角。

实际应用:计算两向量的夹角。

点乘常用结果:对于标准化后的向量,方向相同,则点乘为1;方向相反,则点乘为-1;互相垂直,则点乘为0。
在这里插入图片描述
总结:点乘可以用于计算向量夹角,但只能用于计算内夹角,也就是小于180°的夹角。若想超过180°,则需要与叉乘结合。点乘的结果为单个数值。

叉乘

叉乘又称 “叉积” 或 “外积” ,与点乘结果不同,叉乘结果是一个向量,一个垂直于两个向量所组成平面的向量。模长为两向量模长乘积再乘夹角的正弦值。
公式:
[x1 , y1 , z1] × [ x2 , y2 , z2] = [ y1 ∗ z1 − z1 ∗ y2 , z1 ∗ x2 − x1 ∗ z2,x1∗y2 − y1 ∗ x2 ]
代码:Vector3 cross = Vector3.Cross(a.position, b.position);
注意:叉乘不需要加normalized,加不加都不会影响结果。

应用:

创建垂直于平面的向量;
判断两条向量的相对位置。

叉乘获得垂直向量

1.当 a 到 b 顺时针,则 a x b 朝上。
在这里插入图片描述
2.当 a 到 b 逆时针,则 a x b 朝下。
在这里插入图片描述
也可以这样理解:当a、b顺时针夹角小于180时, a x b 朝上;当a、b顺时针夹角大于180时, a x b 朝下。

代码判断:叉乘结果 y > 0 ,则朝上,则小于180°;叉乘结果 y < 0 ,则朝下,则大于180°;

左手规则

a、b向量叉乘获得的垂直向量遵循左手规则,以下图为例:
在这里插入图片描述
以上图手势为标准,垂直于拇指a和食指b形成的平面的向量result就是a、b叉乘的结果。

叉乘计算角度

叉乘也可以用来计算角度,但只能计算0° ~ 90°。

// 计算叉乘结果,叉乘不需要加normalized,但加了也不会有影响
Vector3 cross = Vector3.Cross(a.position, b.position);

// 用叉乘结果换算角度
float angle = Mathf.Asin(cross.magnitude) * Mathf.Rad2Deg;

叉乘常用结果:
在这里插入图片描述

计算360°以内的角(点乘结合叉乘)

点乘结合叉乘,可以计算出360°以内的角。
在这里插入图片描述

// 先用点乘计算角度(180°以内)
float dot = Vector3.Dot(a.position.normalized, b.position.normalized);
float angleX = Mathf.Acos(dot) * Mathf.Rad2Deg;
// 再用叉乘后的y值确定方向
Vector3 cross = Vector3.Cross(a.position, b.position);
if (cross.y < 0)
{
	angleX = 360 - angleX;
}

先用点乘计算角度(180°以内),再用叉乘后的 y 值确定方向,得数 angleX 为 a 顺时针到 b 的角度。

原文链接

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 中,点乘(Dot Product)、乘(Cross Product)和投影(Projection)是常用的向量运算。下面我会分别解释它们的含义和用法。 1. 点乘(Dot Product):点乘是两个向量之间的一种运算,结果是一个标量(Scalar)。它可以用来计算两个向量之间的夹角余弦值,还可以判断两个向量是否正交(垂直)或平行。在 Unity 中,可以使用 Vector3.Dot 方法来计算两个三维向量的点乘结果。 示例代码: ```csharp Vector3 a = new Vector3(1, 2, 3); Vector3 b = new Vector3(4, 5, 6); float dotProduct = Vector3.Dot(a, b); ``` 2. 乘(Cross Product):乘是两个向量之间的一种运算,结果是一个新的向量。它的方向垂直于原始两个向量,并符合右手法则。在 Unity 中,可以使用 Vector3.Cross 方法来计算两个三维向量乘结果。 示例代码: ```csharp Vector3 a = new Vector3(1, 2, 3); Vector3 b = new Vector3(4, 5, 6); Vector3 crossProduct = Vector3.Cross(a, b); ``` 3. 投影(Projection):投影是将一个向量沿着另一个向量的方向进行投影的过程。投影后的结果是一个新的向量,与原始向量垂直。在 Unity 中,可以使用 Vector3.Project 方法来计算一个三维向量在另一个三维向量上的投影结果。 示例代码: ```csharp Vector3 a = new Vector3(1, 2, 3); Vector3 b = new Vector3(4, 0, 0); Vector3 projectedVector = Vector3.Project(a, b); ``` 以上是在 Unity 中使用点乘、乘和投影的基本示例。希望对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值