3D数学基础_图形与游戏开发
https://blog.csdn.net/popy007/article/list/2?t=1& //向量计算相关文章
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的长度】。
那么我们要判断v1和v2有没有交点,就让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. 嵌套坐标系
子物体,父物体
矩阵:
一:矩阵的介绍
方阵 :行数和列数相同的矩阵叫做方阵。
方阵的对角线元素:方阵中行号 和 列号相同的元素。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. 用垂直向量到原点的距离定义直线。如果点 p 是 n 方向上的投影等于距离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数学基础_图形与游戏开发的更多相关文章
- 《3D数学基础:图形与游戏开发》勘误
最近读这本书,读到四元素的乘法时,自己推导了一下公式,然后懵了,多方查阅,确定是书籍中的笔误(我读的是中文翻译版): 具体在Page147: 上图所示,在第二处明显与第一处的公式不一样. 在维基百科上 ...
- [3D数学基础:图形与游戏开发]专栏前言
期待的书终于到了,接下来我会把自己的学习笔记以及心得整理出来,形成专栏,每一章都进行记录和学习总结,今天是2016年12月30日,再过一天就是元旦了,就要迎来美好的2017年了!!!加油~ 上面的书就 ...
- Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识
基础知识 canvas 元素可以说是HTML5元素中最强大的一个,他真正的能力是通过canvas的context对象表现出来的.该环境对象可以从canvas元素身上获得. <body> & ...
- [Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
- 3D数学基础:四元数与欧拉角之间的转换
在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...
- 3D数学基础 KeyNote 1
[计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...
- C++游戏开发需要阅读的书籍
如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦): 1.Gamebryo 2.2游戏引擎(盛大.腾 ...
- 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化
Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...
- Unity3D ——强大的跨平台3D游戏开发工具(一)
众所周知,Unity3D是一个能够实现轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎.在现有的版本中,其强大的游戏制作功能已 经达到让人瞠目结舌的地步.尤其是它在3.0版本里面制作的那款 ...
随机推荐
- 如何向Makefile传递参数?
答: 直接在make命令的后面加上参数,如: make HOST_CFLAGS=-I. 注意事项: HOST_CFLAGS变量将会替换相应Makefile中的HOST_CFLAGS,也就是Makefi ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_10-前端显示当前用户-jwt查询接口
定义接口 在api的项目里面定义.AuthControllerApi里面定义接口 jwtResult,里面就有一个jwt的字段. 实现接口 需要这三步 定义私有方法从cookie中读取访问令牌 参数需 ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_06-用户认证-认证服务查询数据库-Bcrypt介绍
演示MD5加密的方式 数据库内的数据密码虽然都是6个1但是 每次加密出来的字符串是不一样的 加盐 测试BCrpty 循环10次加密 密码的校验 比人工的加盐要方便的多 这是创建的一个Spring的Be ...
- java最简单复制文件方法,不依赖任何框架
java最简单复制文件方法 把java2.txt内容复制到java.txt中 import java.io.File; import java.io.IOException; import jav ...
- ABAP编辑器输入中文变成问号
在ABAP编辑器里输入汉字,点击空格后显示问号? 中英文环境下编辑都出现乱码 实用程序->设置 ->基于文本的编辑器 如果用老式编辑器,可以输入中文 试试打个补丁 GUI740 补丁17 ...
- js获取当前页面的url地址
//微信分享的时候要通过这样动态获取url传参,因为微信会对url自动加参数,所以要动态获取,不能写死url var page_url = location.href.split('#')[0];
- jenkins:构建机器为windows,部署机器为linux
备份老的jar包 d=`date +"%Y%m%d-%H%M%S"` cd /home/eccore/app/uat -SNAPSHOT.jar steward-api--SNAP ...
- 表格组件---bootstrapTable
bootstrapTable中文官方网站http://bootstrap-table.wenzhixin.net.cn1.文件引用 //1.引用Jquery <script src=" ...
- CentOS 7 vi详解
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- (CVE-2017-8464)LNK文件远程代码执行
漏洞详细 北京时间2017年6月13日凌晨,微软官方发布6月安全补丁程序,“震网三代” LNK文件远程代码执行漏洞(CVE-2017-8464)和Windows搜索远程命令执行漏洞(CVE-2017- ...