3D数学 学习笔记(4) 几何图元
3D数学 学习笔记(4) 几何图元
参考书籍:
《3D数学基础:图形与游戏开发》
射线
p(t) = p0 + td
两种形式:
1. d为增量向量,t范围在[0, 1],即0为起点,1为终点。
2. d为单位向量,t范围在[0, l],l为射线的长度。
直线
斜截式
- y = mx + b
2D直线隐式定义
- ax + by = d
向量法标记的2D直线隐式定义
- p·n = d
n为垂直线上单位向量,p为线上任意点(x, y)
用线段的垂直平分线定义
- || p·q || = || p·r ||
转换到隐格式:
球和圆
隐式公式(p为球表面的任意点,c是圆心,r是半径)
|| p - c || = r
- 圆周长:C = 2πr = πD
- 圆面积:A = πr2
- 球表面积:S = 4 πr2
- 球体积:V = 4/3 πr3
矩形边界框
在Unity中,代表Bounds类,BoxCollider,和MeshRenderer都包含这个类的对象。
- AABB(axially aligned bounding box):轴对齐矩形边界框。
- OBB(oriented bounding box):方向矩形边界框。
AABB转换
小框:通过变换后物体重新计算AABB。大框:通过原来的AABB八个点旋转后重新赋值。
下面是通过AABB转换到新的AABB。
计算时新的xyz的最大或最小值时,可以直接通过判断矩阵的值正负来计算。如下代码段:
if (m.m11 > 0.0 f ) {
min. x += m.m11 ∗ box .min. x ; max. x += m.m11 ∗ box .max. x ;
} else {
min. x += m.m11 ∗ box .max. x ; max. x += m.m11 ∗ box .min. x ;
}
平面
- ax + by + cz =d
- p·n = d (n = [a,b,c],平面的法向量,单位向量。p为平面内任意一点。)
可以用三个不共线的点求出平面方程:先求法向量n,再通过任意一点与法向量点乘后可得出d。
多于三个的平面计算
如果只考虑三个计算可能会因为共线问题,精度问题或者是凹多边形而计算错误。所以需要考虑所有点。
点到平面距离
a = q·n - d (q为计算的点,a为0时代表在平面上,小于0为在背面。)
三角形
正弦和余弦公式:
三角形面积
海伦公式:(s为周长的一半)
顶点坐标直接求面积:
因为是平行四边形面积的一半,所以可以直接由两个向量叉乘求模除于2得到计算结果:
重心坐标空间
三角形所在平面的任意点都能表示为顶点的加权平均值。这个权就是称作重心坐标。重心坐标的和为1:b1 + b2 + b3 = 1。
因为中心坐标和为1,所以可以通过两个值计算直接计算出第三个值。解方程组合(省略)后可得到结论:中心坐标每个值都可理解为对应子三角形与总三角形的比值。(注意:这里是计算2D空间下的中心坐标)
要计算3D空间下的中心坐标,可以把三角形投影到2D平面,因为投影面积和原面积成比例,而要抛弃的坐标选:法向量值绝对值最大的坐标,即尽可能让三角形投影较大的展示出来。
在计算三角形面积时,因为叉乘大小对顶点顺序不敏感,总是正的,对于在在三角形外的点就不适用了(会有负值的重心坐标)。可以用点乘来判断方向。
因为分子分母都有法向量n,所以不必正则化n。
重心(质心)
三角形的最佳平衡点,三条中线的交点。重心坐标三个值都一样,为1/3。
内心
三角形内切圆的圆心,也是角平分线交点。p为周长。
内切圆的半径可以由三角形面积除以周长得到:
外心
三角形外切圆的圆心,也是各边垂直平分线的交点。
计算重心坐标,外心,外接圆半径:
多边形
分简单多边形和复杂多边形。简单多边形没有洞,复杂的有。复杂多边形转换成简单多边形可以在洞直接做连接线,把多边形弄成只有一条边。
凸多边形和凹多边形
判断方法:
1. 计算每个顶点较小的角(内角或外角)和,凸多边形得到(n-2)180°,凹多边形则小于这个值。用点乘来判断较小的角(反三角函数,取得小于180°的角)。
2. 判断所有点转向应该一致(法向量方向一致),用叉乘可以得到法向量,再点乘多边形的法向量就可以判断该点是否凹点(点乘小于0)。