文章目录

  • 基础几何知识
    • 角的度量方式
    • 角度弧度转换
    • 三角函数
    • 计算公式
    • 常用三角函数值
    • 使用方法
    • Unity应用
  • 向量
    • 向量加减法
    • 向量相减
    • 向量相加
    • 向量与标量的乘除
    • 点乘
    • 叉乘
      • 叉乘获得垂直向量
      • 左手规则
      • 叉乘计算角度
    • 计算360°以内的角(点乘结合叉乘)
    • Vector3

基础几何知识

角的度量方式

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

如图所示:

角度弧度转换

常用换算:
π=180度\ \pi = 180度 π=180度
1弧度=180度/π\ 1弧度 = 180度 / \pi 1弧度=180度/π
1角度=π/180度\ 1角度 = \pi / 180度 1角度=π/180度

角度转弧度:

  • 转换公式:弧度=角度数∗π/180\ 弧度 = 角度数 * \pi / 180 弧度=角度数∗π/180
  • Unity代码:radian = x * Mathf.Deg2Rad;

弧度转角度:

  • 转换公式:角度=弧度数∗180/π\ 角度 = 弧度数 * 180 / \pi 角度=弧度数∗180/π
  • Unity代码:degree = x * Mathf.Rad2Deg;

三角函数

在直角三角形中(下图为例),如果a、b、c、x\ a、b、c、x a、b、c、x中的两个变量已知则能计算出另外两个变量的值。

计算公式

正弦:sin(x)=a/c\ sin(x) = a / c sin(x)=a/c (对比斜)
余弦:cos(x)=b/c\ cos(x) = b / c cos(x)=b/c (临比斜)
正切:tan(x)=a/b\ tan(x) = a / b tan(x)=a/b (对比临)
余切:cot(x)=b/a\ cot(x) = b / a cot(x)=b/a
正割:sec(x)=c/b\ sec(x) = c / b sec(x)=c/b
余割:csc(x)=c/a\ csc(x) = c / a csc(x)=c/a
反正弦:arcsin(a/c)=x\ arcsin(a / c) = x arcsin(a/c)=x
反余弦:arccos(b/c)=x\ arccos(b / c) = x arccos(b/c)=x
反正切:arctan(a/b)=x\ arctan(a / b) = x arctan(a/b)=x

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

常用三角函数值

使用方法

已知一个角和一条边,用 sin、cos、tan\ sin、cos、tan sin、cos、tan 。
已知两条边求角度,用 ArcSin、ArcCos、ArcTan\ ArcSin、ArcCos、ArcTan ArcSin、ArcCos、ArcTan 。

Unity应用

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

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

下图为官方API的描述。

要求输入的角度是以弧度为单位的,所以要用这些方法时经常要用到角度和弧度的转换。

向量

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

向量的大小:也就是向量的长度(一般称作为 模),向量a的模记为 ∣a⃗∣\ | \vec a | ∣a∣ ,若 a⃗=(x,y,z)\ \vec a = (x, y, z) a=(x,y,z) 则 ∣a⃗∣=x2+y2+z2\ | \vec a | = \sqrt {x^2 + y^2 + z^2} ∣a∣=x2+y2+z2​ 。代码中使用myVector.magnitude来获取向量的大小。

单位向量:即模为1的向量,在Unity中单位向量也就代表了向量的方向。可以记作 a^\widehat{a}a 。一个向量的单位向量,可以通过除以它模得到,即 a^=a⃗∣a⃗∣\widehat{a} = \frac {\vec a} {| \vec a |}a=∣a∣a​ 。代码中使用myVector.normalized来获取向量的单位向量,也就是向量的方向。

零向量:即模为0的向量,零向量的方向是任意的。

相反向量:长度相等方向相反的向量,a⃗\ \vec a a 的相反向量为 −a⃗\ -\vec a −a。

平行(共线)向量:方向相同或相反的非零向量,记作 a⃗//b⃗\ \vec a // \vec b a//b。

向量加减法

向量的加减就是向量对应分量的加减,类似于物理学中力的正交分解。

向量相减

向量相减等于各分量相减。

[x1,y1,z1]−[x2,y2,z2]=[x1−x2,y1−y2,z1−z2]\ [x1,y1,z1] - [x2,y2,z2] = [x1-x2 , y1-y2 , z1-z2] [x1,y1,z1]−[x2,y2,z2]=[x1−x2,y1−y2,z1−z2]

几何意义:向量a与向量b相减,结果理解为以b的终点为起点,以a的终点为终点的向量。方向由b指向a。
注意:我们可以把向量相减理解为a、b终点的连接,但实际上该向量准确起始位置应该是坐标原点。

实际应用:计算两点之间的距离和相对方向。

向量相加

向量相加等于各分量相加。

[x1,y1,z1]+[x2,y2,z2]=[x1+x2,y1+y2,z1+z2]\ [x1,y1,z1] + [x2,y2,z2] = [x1+x2 , y1+y2 , z1+z2] [x1,y1,z1]+[x2,y2,z2]=[x1+x2,y1+y2,z1+z2]

几何意义:如下图,假设空间中有两个向量a和b,a与a’平行且长度相等,b与b’平行且长度相等。a+b就相当于a,b,a’,b’所围成的平行四边形的对角线。

也可以这么说,由向量a的起点出发,沿着a的方向走a的长度,然后沿着b的方向走b的长度,达到的点相当于从a的起点沿着a+b的方向走a+b的长度。

实际应用:物体的移动。

向量与标量的乘除

乘法:该向量的各分量与标量相乘 k[x,y,z]=[xk,yk,zk]\ k[x, y, z] = [xk, yk, zk] k[x,y,z]=[xk,yk,zk] 。
除法:该向量的各分量与标量相除 [x,y,z]/k=[x/k,y/k,z/k]\ [x, y, z]/k = [x/k , y/k , z/k] [x,y,z]/k=[x/k,y/k,z/k] 。
几何意义:缩放向量长度。

实际应用:加速、减速、放大、缩小。

点乘

点乘又称点积内积。表示为各分量的乘积和。

[x1,y1,z1]⋅[x2,y2,z2]=x1x2+y1y2+z1z2\ [x1,y1,z1] \cdot [x2,y2,z2] = x1x2+y1y2+z1z2 [x1,y1,z1]⋅[x2,y2,z2]=x1x2+y1y2+z1z2

注意结果不是一个向量,而是一个标量(Scalar),可以是负数。

几何意义:a⋅b=∣a∣∣b∣cos⁡(a,b)\ a \cdot b = |a||b|\cos(a, b) 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]\ [x1,y1,z1] \times [x2,y2,z2] = [y1*z1 - z1*y2 , z1*x2 - x1*z2 , x1*y2 - y1*x2] [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. 创建垂直于平面的向量;
  2. 判断两条向量的相对位置。

叉乘获得垂直向量

  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 的角度。

Vector3

Unity中通常用Vector3类来表示向量,该类的使用方法可以参考我的另外一篇文章:【Unity】Unity常用类:向量Vector3、四元数Quaternion


更多内容请查看总目录【Unity】Unity学习笔记目录整理

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

  1. 零基础学图形学(2) 几何知识——点,向量,法向量

    内容: 1. 点,向量,法向量 2. 坐标系统 3. 点和向量的数学操作 4. 矩阵 5. 矩阵介绍 6. 点和向量变换 7. 行向量和列向量 8. 矩阵操作 9. 球坐标系和三角函数 10. 创建矩 ...

  2. Unity游戏开发中的向量运算-点乘和叉乘

    Unity游戏开发中的向量运算-点乘和叉乘 1.点乘: 定义: 又称点积.数量积.标量积.既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解. 公式一: 公式二: 点积 ...

  3. Unity游戏开发——向量运算(点乘和叉乘)

    Unity游戏开发--向量运算(点乘和叉乘) 0.前言 在游戏开发中,确定目标得方向,朝向,夹角等相关数据需要用到向量的计算,其中最常用到的就时点乘和叉乘. 因为我们主要研究的是游戏开发中的3D世界向 ...

  4. 两个可能常用到的几何知识(圆与椭圆的方程、求垂直向量)

    两个可能常用到的几何知识 圆和椭圆的参数方程 圆的参数方程 特殊圆的参数方程[圆心(0,0),半径R] 一般圆的参数方程[圆心(m,n),半径R] 椭圆的参数方程 引例 分析:这个说法是错误的,怎么纠 ...

  5. unity游戏开发知识检测

    1.红点系统设计 参考:lua使用前缀树实现红点系统 2.快速排序 参考:快速排序详解 3.点乘,叉乘,投影的数学意义以及几何意义 点乘 数学意义: 向量点乘结果是标量,是两个向量在一个方向的累计结果 ...

  6. Unity Mesh基础知识

    Unity Mesh基础知识 什么是Mesh Mesh的组成部分 利用Mesh创建一个Cube 创建Cube 顶点坐标 渲染 转载链接 什么是Mesh     Mesh是指的模型的网格,3D模型是由多 ...

  7. unity websockt一些知识:

    目录 1.目的 1.1 学习一些:unity websockt一些知识 2.参考 2.1 unity websockt断线重连和心跳检测 3.注意 3.1 需要重连 4.操作 1.目的 1.1 学习一 ...

  8. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  9. Unity ECS小知识1 - PhysicsTrigger Event

    Unity ECS 小知识1 - PhysicsTrigger Event ECS套件学习过程中会遇到各种问题,专门开辟一个专题"ECS小知识"来记录这些点滴.每个小知识文章是没有 ...

  10. Unity向量点乘和叉乘实例应用

    #1.基本概念 两个向量的点乘(Dot),就是我们说的数量级 a·b=|a|·|b|cosθ 结果是一个标量,如果==0,则两个向量夹角等于90度,垂直关系 小于0,则两个向量夹角大于90度 大于0, ...

最新文章

  1. Python使用tsne进行高维数据可视化实战:二维可视化、三维可视化
  2. 与WebXR共同创建者Diego Marcos一起探讨沉浸式Web的未来(上)
  3. 洛谷 P1352 没有上司的舞会(树形 DP)
  4. Java,如果这是一个更好的世界
  5. 前端学习(2459):账户设置
  6. pg_basebackup基础备份多表空间
  7. YII中的CComponent,CEvent与Behavior及CActiveRecordBehavior
  8. tensorflow之cast
  9. 巧用G6FTPServer账号***台湾某图书服务器
  10. 跟着小甲鱼学习C语言
  11. 以消费者为中心,服装行业如何应用人工智能提升客流量?
  12. LZJ的python学习第一天
  13. 刘颂计算机学院,关于表彰2013—2014学年 - 首页 北京工商大学计算机与 .doc
  14. Glide,AndroidX包兼容问题
  15. Java包的创建和使用
  16. centos7 串口配置修改_Linux串口参数设置
  17. Unity3D编辑器扩展--自定义创建圆锥体
  18. 剖析抖音快速涨粉的文案号,了解大佬运营技巧,学以致用
  19. gitlab运行后修改存储位置
  20. solidworls视图与模型及绘图操作快捷方式

热门文章

  1. android程序联网失败,请检查网络是否可用
  2. PHP乘法表菜鸟教程,第二节 菜鸟教程的实例
  3. android-player 本地服务器联调
  4. app上架vivo应用商店流程
  5. 在人工智能领域创业,需要明确可知的5个基本条件
  6. 【星座】智慧之神雅典娜守护哪个星座?
  7. this.setState修改某一对象的某个属性值,其它保留不变
  8. java ship_用Java对象来解答世界悖论难题“忒修斯之船”
  9. Go语言——没有对象的面向对象编程
  10. SSD-Tensorflow项目源码学习:将数据集转化为为TFR文件