Unity游戏开发客户端面经——数学(初级)

前言:记录了总6w字的面经知识点,文章中的知识点若想深入了解,可以点击链接学习。由于文本太多,按类型分开。这一篇是 数学 常问问题总结,有帮助的可以收藏。


1. 四元数与欧拉角

1.1 四元数概念

        四元数(以后不特指四元数=单位四元数)是四维空间中一个超球上面的点,满足w²+x²+y²+z²=1;而纯四元数是四维空间在w=0时的一个子空间的点,形式为{0, q},特别注意的是纯四元数与四元数是不同的概念。

        四元数是复数虚部扩展的结果,复数的虚部为1个,而四元数虚部有3个,且两两互相正交,其中实部是cosθ/2,而虚部为一个単位轴乘以sinθ/2。

        四元数自由度并没有四个维度,由于存在w²+x²+y²+z²=1这个约束,它的自由度其实只有3,且每个四元数可以对应一个特征向量,即n。

四元数Quaternion的作用

        表示旋转,因此旋转角度计算时用到四元数。

        详细请看:

【Unity编程】Unity中关于四元数的API详解 - AndrewFan - 博客园本文总结了Unity中关于Quaternion(四元数)的API使用方法以及给出部分示例。https://www.cnblogs.com/driftingclouds/p/6626183.html

1.2 欧拉角概念

        欧拉角是由三个角组成,这三个角分别是Yaw,Pitch,Roll。很难翻译这三个单词,Yaw 表示绕y轴旋转的角度,Pitch表示绕x轴旋转的角度,Roll表示绕z轴旋转的角度。也就是说,任意的旋转角度都可以通过这三次按照先后顺序旋转得到。矩阵很难让人具体形象表示,欧拉角就容易多了。注意可能很多地方三个角的先后次序不一样。

1.3 四元数对于欧拉角的优点

  1. 避免万向节死锁
  2. 两个四元数之间更容易插值
  3. 能进行增量旋转
  4. 给定方位的表达式有两种,互为负。

1.4 欧拉角的万向节死锁

        我们依次绕物体坐标系的X轴、Y轴、Z轴旋转,当Y轴旋转了90度之后,Z就会指向原来的X轴。这样一来,我们事实上只绕了X轴和Y轴两个轴旋转,第三根轴的自由度就丢失了。

        详细请看:欧拉角万向节死锁 - 知乎目录1.欧拉角2.万向节死锁----2.1 什么是Gimbal ----2.2 Pitch、Yaw、Roll----2.3 万向节死锁--------2.3.1 横滚--------2.3.2 俯仰--------2.3.3 偏航--------2.3.4 死锁的产生--------2.3.5 重现万向节死锁问题…https://zhuanlan.zhihu.com/p/344050856

2. 点乘

概念

        点乘,也叫向量的内积、数量积。

        描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影。

计算方式

        向量a·向量b=|a||b|cos

求两个向量的夹角(用单位向量)

Unity游戏开发客户端面经——数学(初级)_第1张图片

 

3. 叉乘

概念

        叉乘,也叫向量的外积、向量积,得到的向量垂直于原来的两个向量。

计算方式

        |向量c|=|向量a×向量b|=|a||b|sin

        A×B = -B×A

        这里点乘叉乘只记录了几何角度,详细请看:

向量的点乘和叉乘区别及几何意义https://baijiahao.baidu.com/s?id=1736495807922098016&wfr=spider&for=pc

        详细请看:Unity 点乘和叉乘的原理和使用_PassionY的博客-CSDN博客_点乘和叉乘运算法则Unity当中经常会用到向量的运算来计算目标的方位,朝向,角度等相关数据,下面咱们来通过实例学习下Unity当中最常用的点乘和叉乘的使用。点乘 (又称"点积","数量积”,"内积")(Dot Product, 用*)定义:a·b=|a|·|b|cos 【注:粗体小写字母表示向量,表示向量a,b的夹角,取值范围为[0,180]】几何意义:是一条边向另一条边的投影乘以另一条边的长度.https://blog.csdn.net/yupu56/article/details/53609028

 

4. 向量归一化

        向量归一化即将向量的方向保持不变,大小归一化到1。

5. 判断一个点在矩形内外

        详细请看:

判断点是否在一个矩形内_faithmy509的博客-CSDN博客_如何判断一个点是否在矩形内可以用叉乘或点乘的方式来判断。代码:class Point: def __init__(self, x, y): self.x = x self.y = ydef GetCross(p1,p2,p): return (p2.x-p1.x)*(p.y-p1.y)-(p.x-p1.x)*(p2.y-p1.y)def GetDot(p...https://blog.csdn.net/faithmy509/article/details/82803646

6. 判断一个点在三角形内外

        1.面积法

Unity游戏开发客户端面经——数学(初级)_第2张图片

         求三角形面积的方法就可以用上面提到的利用叉积就行了,注意记得加 上绝对值,因为叉积可能为负。还有种简单的方法是利用内角和为 180 °

        2.同侧法

        若点P在点A、B、C内,则ABXAP,BCxBP,CAxCP结果都为正(负),则可以认为P在A、B、C内,若任意一个结果不同则P在ABC外。(因为正负看的sin夹角的大小,在两个夹角小于90°的情况下,“右手定则”来判定,即右手向第二个因数弯曲,看大拇指是否改变,同向为正,异向为负。)

7. 判断一个对象B在对象A的前后左右(点乘叉乘应用)

        点乘前后,叉乘左右。

7.1前后判断

Unity游戏开发客户端面经——数学(初级)_第3张图片

 生成两个向量:

  1. 对象A自身为原点,指向面向前方的方向。
  2. 对象A自身为原点,指向对象B的方向。

     两个向量点乘,正为B在A的前方,负为B在A的后方,0为左右两侧。

(点乘正负看向量夹角,小于90°为正,大于90°则为负,等于90°正为水平两侧)

7.2左右判断

        向量A 叉乘 向量B,结果为正,B在A的左侧,结果为负,B在A的右侧。

(注意:Unity当中使用左手,因为Unity使用的是左手坐标系,叉乘方向相反)

假设向量A和B 都在xz平面上

向量A叉乘向量B

y大于0 证明B在A右侧

y小于0 证明B在A左侧

        详细请看:

浅谈游戏中的位置判断——点乘+叉乘_scl_Unity3D的博客-CSDN博客首先我们先看下什么是点乘和叉乘点乘,也叫向量的内积、数量积。顾名思义,求下来的结果是一个数。向量a·向量b=|a||b|cos由于|a|和|b|都是正数,所以结果的正负是由于cos这部分决定的  由上图可以看出当角度在0-π/2之间时cos正值 在π/2-π之间是正值;所以由此我们可以根据这个结果判断物体之间的相对位置当像个向量的点乘结果为正的时https://blog.csdn.net/scl_Unity3D/article/details/78777187?spm=1001.2014.3001.5506

你可能感兴趣的:(Unity客户端开发面经,图形学,unity)