[3D数学基础:图形与游戏开发]读书笔记 第12章(几何图元直线、AABB、球圆、平面、三角形、多边形)


第12章 几何图元

矩形边界框 矩形边界框的限制是:边必须垂直于坐标轴,称为AABB(axially aligned bounding box轴对齐矩形边界框)
OOB oriented bounding box(方向矩形边界框)

AABB表示方法

  • 首先AABB满足一下条件
    x m i n < = x < = x m a x x_{min}<=x<=x_{max} xmin<=x<=xmax
    y m i n < = y < = y m a x y_{min}<=y<=y_{max} ymin<=y<=ymax
    z m i n < = z < = z m a x z_{min}<=z<=z_{max} zmin<=z<=zmax
    p m i n = [ x m i n , y m i n , z m i n ] p_{min}=[x_{min},y_{min},z_{min}] pmin=[xmin,ymin,zmin]
    p m a x = [ x m a x , y m a x , z m a x ] p_{max}=[x_{max},y_{max},z_{max}] pmax=[xmax,ymax,zmax]

  • 中心点c
    c = ( p m i n + p m a x ) / 2 c=(p_{min}+p_{max})/2 c=(pmin+pmax)/2

  • 尺寸向量,包含了矩形的长、宽、高
    s = p m a x − p m a x s=p_{max}-p_{max} s=pmaxpmax

  • 半径向量
    r = p m a x − c = s / 2 r=p_{max}-c=s/2 r=pmaxc=s/2

计算AABB

  • 计算AABB只要计算出 p m i n 和 p m a x p_{min}和p_{max} pminpmax就可以通过上面的公式算出有用的信息
  • p m i n 和 p m a x p_{min}和p_{max} pminpmax如何计算?只需要将 p m i n 和 p m a x p_{min}和p_{max} pminpmax设为无穷大和无穷小,然后通过遍历所有点,通过比较扩展 p m i n 和 p m a x p_{min}和p_{max} pminpmax
代码后面补

AABB和边界球

  • 首先计算边界球比AABB编程上复杂的多
  • 边界球只有一个自由度:半径,而AABB有三个自由度:长、宽、高,并且边界球对于方向并不敏感,比如一个棍子,处于不同方向,此时边界球是相同的,但是AABB却是不同的

AABB变换

  • 当物体移动后,AABB也需要进行变换,AABB有 p m i n 和 p m a x p_{min}和p_{max} pminpmax,我们只需要计算出移动后的 p m i n 和 p m a x p_{min}和p_{max} pminpmax,点变换如下图
  • 所以需要求出x’,y’,z’的最大值和最小值即可,举例比如x’最小值,当 m 11 > 0 m_{11}>0 m11>0时使用 x m i n x_{min} xmin计算最小值,使用 x m a x x_{max} xmax计算最大值,其他同理,具体代码如下
代码后面补

平面

  • 平面的2种记法,其中n为法向量垂直于平面,法向量指向的方向是平面的正方向(我们看向平面正面,法向量将指向我们)
    ax + by + cz = d
    p · n = d

如何计算出n法向量呢?

取平面上3个点(不在同一条线上,且顺时针),叉乘公式是sin在同一条直线的话叉乘结果为0,顺时针是因为左手坐标系顺时针的法向量是正面组成 e 1 e_1 e1 e 2 e_2 e2向量,使用 e 1 e_1 e1叉乘 e 2 e_2 e2可以得到法向量,但是这不是单位向量,所以需要除以模,最后公式为
e 1 × e 2 ∣ e 1 × e 2 ∣ e_1\times e_2 \over |e_1\times e_2| e1×e2e1×e2

计算点集的最佳平面法向量

希望从一组3个以上的点集出平面方程,因为上面说了,可能出现在一条直线上,或者没有顺时针,下面有计算公式可以计算出最佳的的法向量如下

代码后面补

点到平面的距离

三角形

  • 三角形面积
    低乘高除以2,不知道h高,可以使用海伦公式计算
    s = l 1 + l 2 + l 3 2 s = {l_1 + l_2 + l_3 \over 2} s=2l1+l2+l3
    h = s ( s − l 1 ) ( s − l 2 ) ( s − l 3 ) 2 h = { \sqrt[2]{s(s-l_1)(s-l_2)(s-l_3)}} h=2s(sl1)(sl2)(sl3)

  • 还有一种更加简洁的公式
    A = ∣ ∣ e 1 × e 2 ∣ ∣ 2 A = { ||e_1 \times e_2|| \over 2} A=2e1×e2
    A = ( y 1 − y 3 ) ( x 2 − x 3 ) + ( y 2 − y 3 ) ( x 3 − x 1 ) 2 A = { (y_1-y_3)(x_2-x_3)+(y_2-y_3)(x_3-x_1) \over 2} A=2(y1y3)(x2x3)+(y2y3)(x3x1)

重心坐标空间

  • 定义:有一个坐标空间与三角形平面相关联且独立于三角形所在的3D坐标空间
  • 重心坐标 三角形所在平面的任意点都能表示为顶点的加权平均值,这个权就称为重心坐标 ( b 1 , b 2 , b 3 ) (b1, b2, b3) (b1,b2,b3)
  • b 1 + b 2 + b 3 = 1 b1+b2+b3 = 1 b1+b2+b3=1
  • 三角形3个顶点的重心坐标是单位向量
  • 顶点的相对边上所有的点的重心坐标分量为0,v1顶点相对边上所有的重心坐标分量 a 1 = 0 a1 = 0 a1=0
  • 该平面所有点都可以用重心坐标描述,该三角形内坐标在0~1之间,三角形外至少有一个分量为负,重心坐标用和原来三角形大小相同的块铺满整个平面如下图
  • 如何求得重心坐标呢?书中给了公式,如下图,注意P是这个平面内任意点
  • 在3D中计算重心坐标更为复杂,因为p可能不在三角形平面中,这时是重心坐标是没有意义的,具体做法就是抛弃某一个分量,因为重心坐标计算最终就是计算三角形面积,垂直投影的面积是最大的,所以需要找到,最接近最大面积的投影,这里可以通过检查平面法向量,看哪个分量值最大得到需要抛弃的分量
通过抛弃最大面积分量计算3D平面的重心坐标
代码后面补,这个不一定补
  • 上面计算重心坐标很复杂,还有一种简单的方式计算重心坐标,根据上面计算三角形面积公式,可以知道三角形面积可以通过叉乘来计算
    这里有个问题,叉乘的大小对顶点的顺序不敏感,总是正的,无法表示三角形外的重心坐标,因为三角形外的重心坐标总是有一个分量是负的,我们可以通过点乘,如下公式
    c ⋅ n = ∣ ∣ c ∣ ∣ ∣ ∣ n ∣ ∣ c o s θ c·n = ||c||||n|| cos\theta cn=cncosθ 首先让叉乘结果c点乘单位法向量n
    c ⋅ n = ∣ ∣ c ∣ ∣ ∗ 1 ∗ ( ± 1 ) c·n = ||c||*1*(±1) cn=c1(±1) 因为单位法向量和叉乘结果平行但是方向可能相反 相同时cos=1,不同时cos=-1
    此时叉乘大小拥有了正负,具体推导如下图

三角形特殊点

  • 重心 是三角形的最佳平衡点,计算公式如下
    G = v 1 + v 2 + v 3 2 G = {v_1+v_2+v_3\over2} G=2v1+v2+v3
  • 内心 是三角形内切圆的圆心,与三条边 l 1 、 l 2 、 l 3 l_1、l_2、l_3 l1l2l3的距离相同,计算公式如下,p是周长
    C = l 1 v 1 + l 2 v 2 + l 3 v 3 p C = {l_1v_1+l_2v_2+l_3v_3\over p} C=pl1v1+l2v2+l3v3
    内心坐标快速计算公式如下
    C = ( l 1 p , l 2 p , l 3 p ) C = ({l_1\over p},{l_2\over p},{l_3\over p}) C=(pl1,pl2,pl3)
    内心半径计算公式如下
    R = A p R = {A\over p} R=pA
    内心解决了寻找与三条边相切的圆
  • 外心 是三角形外接圆圆心,是各个边垂直平分线的交点,计算思路可以通过重心坐标来计算
    计算推导后面推

多边形

  • 多边形有很多,复杂多边形有洞,可以通过在复杂多边形添加缝来将复杂多边形变为简单多边形
  • 三角形分解和扇形分解 多边形可以分解为三角形,这样所有三角形操作都可以应用于此

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本人资源全部免费,更多资源请查看我的上传资源 ====================================================== 书 名:3D数学基础图形游戏开发 作 者:[美] 邓恩(Dunn F.),[美] 帕贝利(Parberry I.) 著;史银雪,陈洪,王荣静 译 出 版 社: 清华大学出版社 出版时间:2005-07-01 ISBN:9787302109464 纸书页数:380页 定 价:¥ 42.00 内容简介:《3D数学基础图形游戏开发》专业培训机构指定教学参考书,多家游戏开发企业共同推荐,游戏业界,探索游戏开发背后的核心秘密。《3D数学基础图形游戏开发》主要介绍了基本的3D数学概念,这对电脑游戏开发人员和编程人员来说尤为重要。作者详尽地讨论了数学理论,并在必要时提供几何说明,帮助读者形成直观的3D感。书中还提供了将理论应用于实践的C++类,并且在每结尾处提供练习。《3D数学基础图形游戏开发》介绍了基础概念,如向量、坐标空间、矩阵、变换、欧拉角、齐次坐标空间、几何图元、相交性检测和三角网格。 作者简介:Fletcher Dunn,是著名游戏开发公司Terminal Reality的主要开发人员,所参与开发游戏包括《4×4DVO 2)、《夜曲》(Noturne),并且是《吸血莱恩》(BloodRayne)的主要负责人。他所开发游戏遍及家用PC机的Windows、Machintosh、Dreamcast、PSⅡ、Xbox和GameCube几种主流平台。   Ian Parberry,是北德克萨斯大学计算机科学系的教授,在国际上被公认为是教授DirectX游戏开发的专家之一。 编辑推荐:《3D数学基础图形游戏开发》主要研究隐藏在3D几何世界背后的数学问题。涵盖了理论知识和C++实现代码。理论部分解释3D数学几何之间的关系,列出的技巧与公式可以当做参考手册以方便查找。实现部分演示了怎样用代码来实现这些理论概念。读者论论了3D中的方位,包括四元数和对不同表示技术之间的优劣比较。   描述了数学几何的实际应用示例,提供了一些C++类和不同的矩阵类,每个类都完成特定的几何任务。   所有基本变换矩阵的完整来历。      专门用Python讲解计算机视觉编程 目录 第1 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 从2D到3D 2.4 练习 第3 多坐标系 3.1 为什么要使用多坐标系 3.2 一些有用的坐标系 3.3 嵌套式坐标系 3.4 描述坐标系 3.5 坐标系转换 3.6 练习 第4 向量 4.1 向量——数学定义 4.2 向量——几何定义 4.3 向量与点 4.4 练习 第5 向量运算 5.1 线性代数与几何 5.2 符号约定 5.3 零向量 5.4 负向量 5.5 向量大小(长度或模) 5.6 标量与向量的乘法 5.7 标准化向量 5.8 向量的加法和减法 5.9 距离公式 5.10 向量点乘 5.11 向量叉乘 5.12 线性代数公式 5.13 练习 第6 3D向量类 …… 第7 矩阵 第8 矩阵和线性变换 第9 矩阵的更多知识 第10 3D中的方位与角位移 第11 C++实现 第12 几何图元 第13 几何检测 第14 三角网络 第15 图形数学 第16 可见性检测 第17 后记 附录A 简单的数学概念 附录B 参考文献
### 回答1: AABB包围盒是一个长方形盒子,其各个面都与坐标轴平行。它通常用于快速确定物体是否与另一个物体发生碰撞。 包围球是一个具有固定半径的球形对象,它通常用于包围一个物体或一组物体。包围球可以用于求取物体之间的距离或者相交情况。 方向包围盒OBB是一个最适合物体形状的盒子,它可以朝着任意方向旋转。OBB可以用于求取物体之间的碰撞或相交关系。 固定方向凸包FDH是一个凸多边形,它是根据点云构造出来的具有一定厚度的表面。FDH可以用于进行3D渲染或者物体刚体碰撞计算。 希望我的回答能够满足您的需求。如果您还有其他问题,请随时提出。 ### 回答2: AABB包围盒、包围球、方向包围盒OBB和固定方向凸包FDH是计算机图形学和碰撞检测中常用的表示物体边界的方法。 AABB包围盒(Axis-Aligned Bounding Box)是一种简单的包围盒形式,它是通过对象的最小和最大的x、y和z值定义的。AABB包围盒是一个与坐标轴对齐的长方体。在碰撞检测中,通过比较两个AABB包围盒之间的位置关系,可以快速判断是否发生碰撞。 包围球是一个以物体中心为原点,半径为半径的球体。它可以更准确地逼近物体形状,但相对于AABB包围盒来说计算复杂度更高。包围球对于检测是否有物体与其他物体相交很有用。 方向包围盒OBB(Oriented Bounding Box)是一种能够任意朝向的盒子。与AABB包围盒不同,OBB是一个可以在3D空间中旋转的长方体。OBB可以更准确地逼近对象的形状,但相对于AABB包围盒来说计算复杂度更高。OBB广泛应用于碰撞检测和物体包围盒等领域。 固定方向凸包FDH(Fixed Direction Convex Hull)是一个定义了对象的最小凸多边形的包围体。它可以通过一系列的向量定义,并且具有固定的朝向。FDH通常用于包围多个物体或者给定一个3D场景的碰撞检测。 ### 回答3: AABB包围盒(Axis-Aligned Bounding Box)是一种包围物体的立方体框,其边与坐标轴平行。这意味着包围盒的六个面总是与世界坐标系的坐标轴对齐。AABB包围盒通常用于快速确定物体之间是否相交,以及进行碰撞检测。 包围球(Bounding Sphere)是一种包围物体的球体,其半径足够小以便覆盖了整个物体。包围球的中心点位于物体的重心处。包围球常用于确定物体之间的距离,例如在碰撞检测和视锥剔除(Frustum Culling)中使用。 方向包围盒OBB(Oriented Bounding Box)是一种包围物体的立方体框,与物体的方向相关。与AABB不同,OBB的边不必与坐标轴平行,其方向可以被旋转调整以适应物体的朝向。OBB在一些模拟和碰撞检测算法中被广泛使用。 固定方向凸包FDH(Fixed-Orientation Convex Hull)是一种凸多边形,其边界能够完全包围物体。FDH通常在较早期的物理引擎中使用,用于对物体进行碰撞检测和坐标转换。通过简单的几何运算,FDH可以更高效地检测碰撞,并提供物体之间的最小接触区域。然而,FDH也有一些局限性,例如无法准确描述非凸物体的形状。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值