https://blog.csdn.net/popy007/article/list/2?t=1&  //向量计算相关文章

https://www.baidu.com/link?url=48CwL-j6E_WG3nUxbBFVL9ejTlj8g-KfykMcBecP27EyuZ5YhLVktT5lT3MJ1ZTR48BdbODaCBKS2GMHSsI55T4YKwRz1_r-5MDQTWjDIaa&wd=&eqid=a068703d00428e9b000000065d0591f8     //3D图形学答案

https://wenku.baidu.com/view/abd34df7ec3a87c24128c455.html   //3D图形学本书的课件

一.向量

向量没有位置概念,只有方向和模[大小]概念。任何一个在直角坐标轴上的分量为(x,y)的向量都相等。比如上图中的每个向量都表示为(-2,1)。
向量加法分量表示:a+b=(xa,ya)+(xb,yb)=(xa+xb,ya+yb)
向量减法分量表示:a-b=(xa,ya)-(xb,yb)=(xa-xb,ya-yb)

a(x,y)的单位向量为a/|a|,即(x,y)/sqrt(x^2 + y^2)。

//向量先单位化向量,再进行计算,因为向量还有方向性,不然会破坏方向性
 //Debug.DrawLine(new Vector3(1, 0.5f, 0), new Vector3(1, 2, 0) * 2, Color.black, 5);
 //Debug.DrawLine(new Vector3(1, 0.5f, 0), new Vector3(1, 2, 0), Color.yellow, 5);

应用:导弹追踪Demo

    public Transform player;
public Transform missile;
private Vector3 missileDir; //导弹的速度向量
public float missileRate=0.02f;
private void Update()
{
missileDir = player.position - missile.position;
missileDir = missileDir.normalized; Vector3 normalVec = Vector3.Cross(missileDir,missile.up);
float vecAngle = Vector2.Angle(missileDir,missile.up);
if (normalVec.z > 0)//顺时针
{
missile.transform.Rotate(Vector3.forward, -vecAngle);//顺时针转
}
else if (normalVec.z < 0)
{
missile.transform.Rotate(Vector3.forward, vecAngle );//逆时针转
} missileDir *= missileRate;
missile.position += missileDir;
}

向量的应用

1.求与一个向量正交的另一个向量:

任给一个非零向量(x,y),则它相对坐标轴逆时针转90度的正交向量为(-y,x),顺时针转90度的正交向量为(y,-x)。法线向量。

2. 计算一个向量b与另一向量a共线的两个相反的投影向量:

1、任给一个非零向量(x,y),则它相对坐标轴逆时针转90度的垂直向量为(-y,x),顺时针转90度垂直向量为(y,-x)。

图2中,障碍物的向量是两个点相减得到的。

3.使用向量进行障碍检测的原理  [两条线段是否相交]

一个解线性方程组的有力工具 --- 克兰姆(Cramer)法则

线性方程组的定义:

如果线性方程组:

A11*X1 + A12*X2 + ... + A1n*Xn = b1
A21*X1 + A22*X2 + ... + A2n*Xn = b2
...................................
An1*X1 + An2*X2 + ... + Ann*Xn = bn 它的系数矩阵 A =
__               __
| A11 A12 ... A1n |
| A21 A22 ... A2n |
| ............... |
| An1 An2 ... Ann |
--               -- 的行列式 |A| != 0 线性方程组有解,且解是唯一的,并且解可以表示为: X1 = d1/d , X2 = d2/d , ... , Xn = dn/d (这就是/A/=d为什么不能为零的原因,不能做除数) 这里d就是行列式/A/的值,dn(n=1,2,3...)是用线性方程组的常数项b1,b2,.,bn替换系数矩阵中的第n列的值得到的矩阵的行列式的值,即: 常数项b1,b2,.bn替换矩阵中的第1列
     | b1 A12 ... A1n |
d1 = | b2 A22 ... A2n |
     | .............. |
     | bn An2 ... Ann |
常数项b1,b2,.bn替换矩阵中的第2列      | A11 b1 ... A1n |
d2 = | A21 b2 ... A2n |
     | .............. |
     | An1 bn ... Ann | ...
常数项b1,b2,.bn替换矩阵中的第n列
     | A11 A12 ... b1 |
dn = | A21 A22 ... b2 |
     | .............. |
     | An1 An2 ... bn |
---------------------

举着例子:

系数行列式:

https://max.book118.com/html/2017/0328/97598295.shtm

常数项:

例如2-D线性方程组:

(1) 4.0*X1 + 2.0*X2 = 5.0
(2) 3.0*X1 + 3.0*X2 = 6.0 根据上面的Cramer法则: d是系数行列数:   | 4.0 2.0 |
d = | 3.0 3.0 | = 4.0*3.0 - 2.0*3.0 = 6.0 (2阶行列式的解法,'/'对角线相乘减去'/'对角线相乘)
常数项替换第1项,得到矩阵行列式的值:      | 5.0 2.0 |
d1 = | 6.0 3.0 | = 5.0*3.0 - 2.0*6.0 = 3.0
常数项替换第2项,得到矩阵行列式的值:      | 4.0 5.0 |
d2 = | 3.0 6.0 | = 4.0*6.0 - 5.0*3.0 = 9.0 则 X1 = d1/d = 3.0/6.0 = 0.5
X2 = d2/d = 9.0/6.0 = 1.5  
---------------------

3.深入研究

2-D障碍碰撞检测的实质就是判断两条线段是否有交点,注意不是直线,是线段。现在从向量的角度,写出两条线段的方程。

现在有v1和v2两条线段,则根据向量加法:

v1e = v1b + s*v1
v2e = v2b + t*v2

v1b和v2b分别是两线段的一端。s,t是两个参数,它们的范围是[0.0,1.0],当s,t=0.0时,v1e=v1b,v2e=v2b;当s,t=1.0时,v1e和v2e分别是两线段的另一端。s,t取遍[0.0,1.0]则v1e和v2e取遍两线段的每一点【就是线段v1和v2的长度】。
那么我们要判断v1v2有没有交点,就让v1e=v2e,看解出的s,t是不是在范围内就可以了:

s,t取遍[0.0,1.0]则v1e和v2e取遍两线段的每一点【就是线段v1和v2的长度】,假设相交则==》此时v1e 和v2e重合共线【v1e =v2e】

v1e = v2e
=> v1b + s*v1 = v2b + t*v2
移位后=> s*v1 - t*v2 = v2b - v1b
写成分量形式:

s*x_v1 - t*x_v2 = x_v2b - x_v1b
s*y_v1 - t*y_v2 = y_v2b - y_v1b

现在是两个方程式,两个未知数,则根据Cramer法则:v1(4,1)   v2(2,3)

| x_v1 -x_v2 |   | 4.0 -2.0 |
d = | y_v1 -y_v2 | = | 1.0 -3.0 | = -10.0

| x_v2b-x_v1b -x_v2 |   | 5.0 -2.0 |
d1 = | y_v2b-y_v1b -y_v2 | = | 2.0 -3.0 | = -11.0

s = d1/d = -11.0/-10.0 = 1.1 > 1.0
现在s已经计算出来,没有在[0.0,1.0]内,所以两线段没有交点,从图上看很直观。t没有必要再计算了。所以是物体与障碍没有发生碰撞。如果计算出的s,t都在[0.0,1.0]内,则把它们带入原方程组,计算出v1e或者v2e,它的分量就是碰撞点的分量。

坐标系:

<1. 惯性坐标系:

惯性坐标系的原点和物体坐标系的原点重合,但是轴和世界坐标系的轴平行。

从物体坐标系转到惯性坐标系只需要旋转,但是从惯性坐标系到世界坐标系需要平移。

<2. 嵌套坐标系

子物体,父物体

矩阵:

https://www.baidu.com/link?url=48CwL-j6E_WG3nUxbBFVL9ejTlj8g-KfykMcBecP27EyuZ5YhLVktT5lT3MJ1ZTR48BdbODaCBKS2GMHSsI55T4YKwRz1_r-5MDQTWjDIaa&wd=&eqid=a068703d00428e9b000000065d0591f8  //答案

一:矩阵的介绍

方阵 :行数和列数相同的矩阵叫做方阵。

方阵的对角线元素:方阵中行号 和 列号相同的元素。m11    m22    m33  ,其他元素均为非对角线元素。

对角矩阵 :除正对角线外,其他元素(非对角线元素)都为0,就是对角矩阵。

单位矩阵:满足对角矩阵的前提下,对角线元素为1,其他元素为0

正交矩阵: 转置矩阵和原矩阵的乘积如果等于单位,则A称为正交矩阵。

转置矩阵:行列互换

Mij的转置矩阵表示   ​,即沿着对角线元素翻折,对角线元素不变,其他元素沿对角线交换。转置矩阵行列交换

注意:对于向量来说,把行向量变成列向量,列向量变成行向量。

转置矩阵的引理:

二:矩阵的计算

矩阵和矩阵的乘法  :

1.和标量相乘,则和矩阵的每一项分别相乘。

2.矩阵和矩阵相乘:r*n矩阵A乘以 n*c矩阵B,结果是r*c矩阵,记作矩阵C. A和B矩阵的n必须一致才能相乘。

记忆方法1:

矩阵C的任意元素Cij等于A的i行向量和B的j列向量的相乘的结果再相加。

记忆方法2:让A的行和B的列在C中对齐,相乘。

矩阵乘法不满足交换律​。

满足结合律(包括和向量的相乘),​      

矩阵乘积求转置,相当于分别求转置,再交换顺序相乘.​ 或者 

矩阵是怎么变换向量的: 

行向量左乘,列向量右乘

一般使用行向量: 书写方便     Direct中使用的是行向量

p,g,r是x,y,z三个轴的单位向量【基向量】。则线性变换后  v=xp+yq+zr;

向量矩阵变换后:把矩阵解释为基向量集合,则M矩阵将a转换到b

7.2.2 矩阵的形式

思考怎么构建一个矩阵来做特定的3D转换??

上图看出矩阵的每一行,都可以理解为转换后的基向量,即矩阵的行向量就是变换后的基向量【对理解矩阵的构建很有帮助】。有反向构建矩阵的可能,给出期望的变换【旋转,缩放...】我们所做的是计算基向量的变换,并且把这个变换填入矩阵。

​==》​==》​看出AB结果中的行向量确实是对A的基向量进行B变换的结果。

如图把基向量转换为q p处,则通过矩阵

M | 2  1|

|-1  2|

可见不仅旋转了坐标系,而且还拉伸了它。

知道期望的变换,来构建旋转矩阵的思想:

把基向量的x分量,即【1,0】*M=【2,1】==》M是2*1的矩阵,且旋转到P[2,1]  ==》

​矩阵代表的2D变换是: 提取基向量【0,1】【1,0】  顺时针旋转90度。

矩阵和线性变换

8.1 变换物体与变换坐标系

效果是等价的,但是变换物体,需要变换的物体的物体的顶点数比较多。

8.2.1    旋转

 2D中的旋转

旋转矩阵 :【三角函数】   ​,旋转矩阵是正交的,可以通过正交矩阵的定义,验证后是正交矩阵。

矩阵的每一行,都可以理解为转换后的基向量,即矩阵的行向量就是变换后的基向量。

3D中的旋转

由于不考虑平移,这些直线和平面必须过原点

(1)  判定旋转方向【左手】: 一定是大拇指 指向 旋转轴【如果绕x轴旋转,则x就是旋转轴】的正方向,四指弯曲就是旋转方向,这种手势下,四指弯曲的方向就是旋转的正方向。这个很重要,因为要根据这个判断旋转矩阵元素是否为负。

下图是数学上的叉乘右手的,但是Unity使用的是左手坐标系。

(2) 绕哪个轴旋转,就从这个轴的箭头处向下看,把3D坐标化简成2D坐标。

(3) 再利用左手坐标系【unity中就是左手坐标系】,大拇指,食指,中指代表 x,y,z轴,判断出旋转矩阵中哪个数是负的。

【下图中: 如果绕x轴,则x的值不变,y轴的向量旋转后x不变,y和z都在坐标轴的正方向,则都为正。z轴的向量旋转后,x不变、y旋转到y的负方向、z在z的正方向】

下图绕x轴旋转-22度:下图中画的就是旋转方向 。

8.2.3  3D中绕任意轴的旋转——矩阵的推导。

8.3  沿坐标轴的3D缩放矩阵

沿任意方向缩放推到:比较复杂

8.4 正交投影

向某一个轴投影

由于不考虑平移,这些直线和平面必须过原点

8.4.2 向任意直线投影

8.5 镜像

8.6 切变

8.7 变换的组合

​   可以结合矩阵来简化运算。

8.8  变换分类

<1. 线性变换:

<2. 仿射变换:

仿射变换是指线性变换后接着平移,线性变化是仿射变换的子集。

<3. 可逆变换

除了映射变换外,其他的线性变换都是可逆的。即乘以变换矩阵的逆矩阵。如果矩阵是奇异的,则变换不可逆。可逆矩阵的行列式不为0.若行列式等于0,则是奇异矩阵,奇异矩阵没有逆。

<4. 等角变换

变换前后两个向量夹角的大小和两个向量的方向都不发生改变。

<5. 正交变换

基本思想是轴保持互相垂直,而且不进行缩放变换。

<6. 刚体变换

只改变物体的位置和方向,不包括形状,长度,角度,面积。【镜像并不认为是刚体变换】

小结:变换关系对应表

求方阵的行列式:

具体步骤:主对角线相乘的和减去次对角线相乘的和,就等于行列式

方阵M的行列式记作 | M | ,非方阵矩阵的行列式是未定义的。

<1. 求2*2方阵的行列式   记忆规则

把主对角线的元素相乘,再把反对角线的元素相乘,再相减。

<2. 求3-3方阵的行列式  的记忆规则

把3*3矩阵的行向量解释成向量:

<3.  求余子式:

<4. 求代数余子式

注意: 余子式是一个矩阵,而代数余子式是一个标量。

例如:选了第一行,每个元素乘以对于的代数余子式【即除去该元素对于的行列元素剩下的元素】。

m11对应的代数余子式为正,M12对应的代数余子式为负.....。项号相加为正则代数余子式为正,否则为负数。

<4.1. 使用代数余子式计算 n*n矩阵的行列式: 行列式在矩阵求逆和是否可逆时用到

==》

求代数余子式==》使用求余子式公式化简==》展开提取公因式【中文版的化简结果有误,给出英文版】==》结果

<5. 行列式的一些性质:

矩阵积的行列式等于行列式的积。

<6. 行列式的几何意义:

2D中行列式表示以基向量为两边的平行四边形的有符号面积。基向量是不同面上过原点的向量。

3D:

方阵的逆

矩阵求逆:

矩阵求逆 步骤: 求代数余子式矩阵,再求代数余子式矩阵的转置矩阵,逆矩阵 =  标准伴随矩阵 / 行列式  

<1. 并非所有矩阵都有逆。eg:若矩阵M中的某一行或者某一列的元素都是0,乘以任意矩阵V,则结果都是一个零矩阵。

可逆矩阵(非奇异矩阵)   ==  行列式不等于0

不可逆矩阵(奇异矩阵)   ==  行列式等于0       行列式是否等于0判断可逆

标准伴随矩阵:

具体步骤: 求代数余子式矩阵,再求代数余子式矩阵的转置矩阵

M的标准伴随矩阵就是  M的代数余子式矩阵的转置矩阵。

例如:

矩阵M 

1. ==》

2. ==》M的标准伴随矩阵就是代数余子式矩阵的转置

3.==》矩阵的逆矩阵   标准伴随矩阵 / 行列式

逆矩阵的几何意义:

撤销变换回到原变化。

9.3 正交矩阵

如果方阵M是正交的,当且仅当M乘以它的转置M(t)矩阵等于单位矩阵【也可用于是否是正交矩阵的判断,矩阵中所有元素足够接近正交矩阵的允许的范围内就行】。

矩阵乘以它的逆矩阵等于单位矩阵,也可以用于判断矩阵是否是正交矩阵。 

==》则正交矩阵的 转置矩阵=它的逆矩阵。所以在知道矩阵是正交的,则避免计算逆矩阵【例如旋转和镜像】。

正交矩阵的性质:

假设:

==》

==》

==》M乘转置后

因为:点积   ab=|a||b|cos@

只有一个向量是单位向量时,则它与它自身的乘积是1.==》r1  r2  r3是单位向量 【三个行向量】

只有两个向量互相垂直时,它们的点积为0。

==》

一个矩阵时正交的,则每一行和列都是单位向量,且矩阵的所有行互相垂直

注意点:如果一组向量互相垂直,则这组向量被认为是正交基。如果向量都是是单位向量,

则就是标准正交基。正交矩阵就是标准正交基。

矩阵正交化:

由于坏数据或者浮点数运算的累计错误称为矩阵爬行。这个时候需要进行矩阵正交化,得到一个正交矩阵,尽量和原矩阵相同。

施密特正交化

9.4x4齐次矩阵

4x4齐次空间

齐次坐标投影到2D中w=1的平面上,(x/w,y/w).

4x4平移矩阵

因为3x3矩阵表示的是线性变换,不包含平移。所以扩展成4x4矩阵。

在4D中用矩阵乘法表示平移:

w=1   4D点表示把4D点投影到这个w平面上  实际的3D点被认为是在4D中的w=1的“平面”上。

w=0   4D点表示“无限远点”,描述一个向量而不是一个位置。

行向量和矩阵乘法时左乘。

例如: 4D中一个无穷远点,乘以一个由便准3x3变换矩阵扩展成的4x4矩阵(不包含平移)

==》结果任然是一个无穷远点==》w分量能开关4x4矩阵的平移部分。

为何不取掉最后一列,直接用4x3矩阵,原因如下:

例子:  对4x4 矩阵M求逆矩阵:

​      ==》分解为变化矩阵和平移矩阵    

==》

==》逆矩阵的几何意义是撤销原来的变化,则对于平移矩阵T就是相反变换。再求出R的逆矩阵

9.4.3  一般的仿射变换

现在有了4x4矩阵,可以构造包含平移在内的一般仿射变换矩阵了,例如:

大概步骤:

先把变换的”中心点“平移到原点,在利用之前的技术进行线性变换,再将中心点平移到原来的位置。

例如:

平移只改变了最后一行。

9.4.4 透视投影

w值有意义的4D坐标

3D中的透视投影任然是投影到2D平面上,但是,投影线不再平行。相交于一点,这个点就是投影中心。

因为投影中心在投影到平面的前边,所以看到的图像时反转的。

9.4.5 小孔成像

点P向z=-d平面投影

==》   

==》  ​   ==》 

由于投影平面在投影点的后边,所以是负的。计算比较复杂,

计算机计算中可以不用管投影面,即把投影面移到投影点的前边,去掉烦人的负号。下图:

​     ==》   ​    ==》w=z/d

==》4D形式为

计算投影到投影面的点的3D坐标

步骤:构建投影矩阵,转换点到投影点,除以同源坐标,得到投影面上的投影点。

例如:

因为 如果把单个点p(x,y,z) 向x=5的平面投影,即w=x/5   则4D形式为  【x  y   z  x/5】

根据上边构建的投影矩阵,计算点(107,-243,89)【有限远,w=1】在x=5平面上的投影点的3D坐标?

先计算投影后的点 ==》

除以同源坐标得到3维物理坐标==》  

10章 3D中的方位与角位移

方位是相对于已知方位(通常称为单位方位或者源方位)的旋转来描述的。旋转的量是角位移。

10.3 欧拉角

10.4.1 四元数

一个四元数包含一个标量分量和一个向量分量   

Quaternion类

12章 几何图元

射线:

p0=p(0);      //p0指定了射线的位置信息

p(1)=p0+td   //  dt: 增量向量,指定了射线的长度和方向  d是单位向量

t:  0~L   //变换范围,即射线的长度

直线:

ax+by=d

d: 是原点到直线的有符号距离,如果直线和n在原点的同一侧,则为正

图元的隐式表示法:

f(x,y,z) = ​函数,我们能够隐式表示一个图元。如果点在这个图元【中心再原点的图元】上,则这个函数为真,否则为false.

一个变量的函数是单变量的 是一条曲线。

直线的表示:p是直线上的任意一点。如果只给一个点的坐标,表示成向量,则表示过原点的向量。

<1.  用垂直向量到原点的距离定义直线。如果点 是 方向上的投影等于距离d。d是过原点垂直于直线的线段。

<2. 用斜率来表示

<3.  <4.

球和圆

隐式表示: ||p-c||=r  //  c球心  p球上一点  r 半径

||​向量的长度

轴对齐矩形边界框:

AABB: 轴对齐矩形边界框【把物体框起来的框】  OBB方向矩形边界框

应用:

使用矩形判断相交,需要判断。则矩形框A和矩形框B,中心点到边的距离和中的点在顶点的距离,分别另一个矩形框的这两个参数比较

边界球:

用于相交性测试,车的边界球和AABB.如下:

12.5 平面

平面方程可以用公式表示  :

平面的隐式向量记法:

对公式2进行证明:

​,向量n是法向量,设p,q都在平面上,满足方程

p*n=d   ==》 

==》  n*p=d   n*q=d

==》n*p  = n*q

==》n*(p-q)=0  

==》n垂直于(p-q)向量,则n垂直于平面上任意向量。

知道三个点的坐标,求平面方程:

《1.  n(p-q)=0  ==》法向量

《2.  n*p=d   ==》  d

《3. ax+by+cz=d  ==》 平面方程

判断点在平面的前边还是后边?

很简单,把这个点代入 平面的方程,f(x,y,z)=0;
如果f(x,y,z)>0,则在前面
如果f(x,y,z)<0,则在后面
如果f(x,y,z)>=0,则在平面上

判断点到面的距离?或者平面上的最近点

《1.  找出从该点出发的平面的任意一条线段对应的向量。

《2. 求出该平面的法向量

《3. 斜线段对应的向量和这个面的法向量做点乘,就是斜线断的在该面的投影,即距离。

12.5 点到片面的距离

==》因为p*n=d 是平面方程,n*n=1

12.6 三角形和三角形网格

三角形:左手坐标系中,经常从“正面”看时,经常以顺时针方向列出的。v1  v2  v3 

<1.海伦公式: S = 三边长度之和 / 2  =(L1+L2+L 3)/2

<2. 知道每条边的坐标:

对三角形三变得每一边,分别计算每条边和下x轴组成的梯形的有符号面积,有符号面积是边的端点是从左到右,面积为正,边是从右到左,则右到左为负数。

==》不管三角形在x的哪一边,都满足:

==》2D中顶点坐标计算三角形有符号面积:

<3. 平行四边形法:

两边向量e1,e2叉乘的大小【角度可以点乘得到】就是这两边组成的平行四边形的面积==》三角形面积等于平行四边形面积的一半=》

计算重心坐标:

<5. 简单多边形使用扇形分解算法计算。

如果知道每个点的坐标或者边的向量,则可以求出面积,结合海伦公式。

12.7 多边形

简单多边形和复杂多边形

有洞的复杂多边形可以通过接缝分割成简单多边形。

凸多边形:

性质:

<1.任意两个顶点的连线包含在多边形中。

<2. 一个沿着凸多边形移动时,在每个顶点的转向都是相同的。

<3. n个顶点的凸多边形,都可以分解成(n-2)个三角形,即内角和为(n-2)*180度,也可以反证该多边形位凸多边形.

<4. 对于一个封闭的凸多边形,全部补角之和为360度。

判断点在三角形内:

方法一: 内角和法或者面积法

【任意多边形都可或者分割后的面积相等】:三条线段与三角形各边的夹角,如果所有夹角之和为180度,那么点P在三角形内,否则不在。

方法二: 同向法【对于凸多边形来说】

假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现点P始终位于边AB,BC和CA的右侧。 算出AP分别在三条边的同侧。

使用叉乘计算方位:

判断图中有几个三角形:

需要解决三角形个数问题时,按照点线规则构建相应的二维数组即可:

找出下图中有多少个三角形:

https://blog.csdn.net/qql2011/article/details/52938807

<1. 给每个顶点标序号,给每条线标序号。【对于n条线相交的,则先深度搜索点和线的关系】

再构建一个二维数组,以每个点为一维,元素是经过该点的线序号;

遍历所有三点的所有组合,判断能否组成三角形,判断条件为:三点两两共线且三点不共线。

三点两两共线且三点不共线      【如果知道坐标的话, 可以使用向量点乘】

Arrays.binarySearch(a,key);   a - 要搜索的数组   key - 要搜索的值    如果包含在数组中,返回搜索键的索引;否则返回 ( - 1)

A{ 1, 2, 3, 4 },    B{ 1, 5 },      B中每个元素是否在A中。可以看出1 1共线。

凹多边形:

至少有一个凹点的多边形。

13 章 几何检测

13.3  平面上的最近点:

平面外一点p,和平面内任意一条直线的连线的直线,求该直线的在平面上的投影【点乘】,即最近线段和最近点。

13.4 圆和球上的最近点

13.6 相交线检测【比如碰撞检测】

静态测试

动态测试

例如:两条直线的隐式方程,交点的坐标是(x,y)

==》看同时满足两条线性方程的点的个数

13.8 在3D中两条射线相交性检测

假设射线是无限延伸的

共面时的相交

不共面时的相交

如果两条射线平行或者重合,则分母点乘为0. 否则  可以判断r1(t1)   r2(t2)是相聚最近的点,再通过距离可以判断射线是否相交。

==》

但是如果射线的长度有限,则还应该做边界检测。

总结:可以用于 给出两条射线求最近点,和判断射线是否相交。

13.9  射线和平面的相交性检测

13.11 三个平面的相交性检测

任意平面平行,则交点就不存在,分母为0

13.12 射线和圆/球的相交线检测   p271//避开障碍物时,需要判断射线与球的相交性问题

判断射线L和此球是否相交:

t的变化长度是0~L,判断t是否有解。

圆心c,半径r,d是单位向量,t从0变化到L【t为交点】,L为射线长度,所要求的是交点t的值。

0t的长度:  ​  t=a-f0

向量e: ​,将e投影到d上,这个向量的长度为a,计算公式 a=e*d.

根据小三角形中:

大三角形:

==》代入​==》

==》因为f=a-t

==》如果根号下值​为负,则射线和圆不相交

==》如果​,则射线的起点在圆内。

此外不同的测试则有不同的行为。

<1 . 假设是相交的:

<2 . 建立方程组求解:

假设P是直线上和球的交点=>

P=A+tB;  //直线上任何一点的表示方法

|P-C|平方=R平方

==》解二次方程组,求解即可

解二次方程组即可。

13.13  两个圆或者球的相交性检测

静态的:

静态的直接用两个圆的半径之和来判断

动态的:

假设一个球是静止的,组合向量,d=d2-d1,计算t的解的个数:【此处t是距离,也可以计算出时间】

使用二次方程判断根 的公式:

较小的值是两个球接触时的t,较大的值时两个球脱离时的t值

13.15 球和平面的相交性检测

方法: 计算球心到平面的距离d,d<r,则相交。

14章 三角网格

14.1.1 索引三角形网格

程序结构:

优化:大多数图形卡不能支持提交索引三角形网,一般是三个顶点同时提交,这样共享顶点会多次提交,三角形用到一次就提交一次。内存和图像硬件的交互数据传输是瓶颈。所以许多Api支持三角形网格式以减少传输量, 基本思想是排序点和面,使得已有的三角形不需要传输。

最高到最底优化方案:顶点缓存,三角带 三角扇

14.1.4  顶点缓存:

API和硬件之间的一种传输策略。

14.1.5  优化三角带

三角带可用(n+2)个顶点存储n个面。

减少三角带数目:

因为分别渲染两个长为n的三角带所需的时间大于渲染一个长为2n的三角带。因此使用退化三角形【面积为0】连接多个三角带。

从而需要将整个网格置于一个连续的三角带中。

退化三角形【面积为0,无需渲染,不会影响效率】

上图包含了四个退化三角形,顶点7-8边是包含了两个退化三角形。发送给GPU时7-8边不发送。符合连续顶点表示一个三角形的约定。

发送: 

14.1.6  三角扇

三角带和三角扇都是用(n+2)个顶点存储n个面。 灵活度低,视情况来用。

14.2 额外信息

三角网可在三角形或着顶点级保存额外信息

14.2.1 纹理映射

通常在顶点保存纹理坐标

14.2.2  表面法向量

14.4.2 焊接顶点

删除其余的一个,剩一个。去除多余顶点。节省内存

14.4.3 面拆分

14.4.4 

15 章 图形数学

3D数学基础_图形与游戏开发的更多相关文章

  1. 《3D数学基础:图形与游戏开发》勘误

    最近读这本书,读到四元素的乘法时,自己推导了一下公式,然后懵了,多方查阅,确定是书籍中的笔误(我读的是中文翻译版): 具体在Page147: 上图所示,在第二处明显与第一处的公式不一样. 在维基百科上 ...

  2. [3D数学基础:图形与游戏开发]专栏前言

    期待的书终于到了,接下来我会把自己的学习笔记以及心得整理出来,形成专栏,每一章都进行记录和学习总结,今天是2016年12月30日,再过一天就是元旦了,就要迎来美好的2017年了!!!加油~ 上面的书就 ...

  3. Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识

    基础知识 canvas 元素可以说是HTML5元素中最强大的一个,他真正的能力是通过canvas的context对象表现出来的.该环境对象可以从canvas元素身上获得. <body> & ...

  4. [Unity游戏开发]向量在游戏开发中的应用(二)

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...

  5. 3D数学基础:四元数与欧拉角之间的转换

    在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...

  6. 3D数学基础 KeyNote 1

    [计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...

  7. C++游戏开发需要阅读的书籍

    如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦):  1.Gamebryo 2.2游戏引擎(盛大.腾 ...

  8. 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化

    Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...

  9. Unity3D ——强大的跨平台3D游戏开发工具(一)

    众所周知,Unity3D是一个能够实现轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎.在现有的版本中,其强大的游戏制作功能已 经达到让人瞠目结舌的地步.尤其是它在3.0版本里面制作的那款 ...

随机推荐

  1. 如何向Makefile传递参数?

    答: 直接在make命令的后面加上参数,如: make HOST_CFLAGS=-I. 注意事项: HOST_CFLAGS变量将会替换相应Makefile中的HOST_CFLAGS,也就是Makefi ...

  2. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_10-前端显示当前用户-jwt查询接口

    定义接口 在api的项目里面定义.AuthControllerApi里面定义接口 jwtResult,里面就有一个jwt的字段. 实现接口 需要这三步 定义私有方法从cookie中读取访问令牌 参数需 ...

  3. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_06-用户认证-认证服务查询数据库-Bcrypt介绍

    演示MD5加密的方式 数据库内的数据密码虽然都是6个1但是 每次加密出来的字符串是不一样的 加盐 测试BCrpty 循环10次加密 密码的校验 比人工的加盐要方便的多 这是创建的一个Spring的Be ...

  4. java最简单复制文件方法,不依赖任何框架

    java最简单复制文件方法   把java2.txt内容复制到java.txt中 import java.io.File; import java.io.IOException; import jav ...

  5. ABAP编辑器输入中文变成问号

    在ABAP编辑器里输入汉字,点击空格后显示问号? 中英文环境下编辑都出现乱码 实用程序->设置 ->基于文本的编辑器 如果用老式编辑器,可以输入中文  试试打个补丁 GUI740 补丁17 ...

  6. js获取当前页面的url地址

    //微信分享的时候要通过这样动态获取url传参,因为微信会对url自动加参数,所以要动态获取,不能写死url var page_url = location.href.split('#')[0];

  7. jenkins:构建机器为windows,部署机器为linux

    备份老的jar包 d=`date +"%Y%m%d-%H%M%S"` cd /home/eccore/app/uat -SNAPSHOT.jar steward-api--SNAP ...

  8. 表格组件---bootstrapTable

    bootstrapTable中文官方网站http://bootstrap-table.wenzhixin.net.cn1.文件引用 //1.引用Jquery <script src=" ...

  9. CentOS 7 vi详解

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  10. (CVE-2017-8464)LNK文件远程代码执行

    漏洞详细 北京时间2017年6月13日凌晨,微软官方发布6月安全补丁程序,“震网三代” LNK文件远程代码执行漏洞(CVE-2017-8464)和Windows搜索远程命令执行漏洞(CVE-2017- ...