Möller Trumbore 算法是三角形与射线(光线)之间判定是否相交的快速算法,利用了重心坐标来表示三角形。
首先假设射线的方程:O为发射点,D为方向向量
再假设三角形平面方程:b1,b2,(1-b1-b2)分别是三个点的重心坐标,p分别是三个点
三角形重心坐标方程的推导:
扩展b1,b2的范围可以将方程扩展到三角形所处的平面,所以判定三角形与射线是否相交的方法是,联立方程求解b1,b2,满足:b1>=0,b2>=0,b1+b2<=1则说明射线与三角形相交。
因此我们只需要求解t,b1,b2的值即可。
整理方程如下:
因为O、P都是三维坐标,所以上述其实是三个方程的方程组。为了求解方程组,我们使用克莱姆法则。
克莱姆法则:
如果一个线性方程组可以写做:
如果A是一个可逆矩阵(det(A)≠0),那么方程有解:,其中
其中Ai是被列向量c取代了A的第i列的列向量后得到的矩阵
比如:假设有方程组:
那么我们就可以写成:
∴
所以
所以为了简化原式,我们将一些常量换种方式表示:
因此我们可以将方程组写成如下形式:
注意:S,-D,E1,E2其实都是3×1的列矩阵,这么写只是方便观察,并且方便后续替换列向量
所以:
我们可以直接调库直接算行列式,也可以继续做如下👇操作。
为了快速求这里分子的det,我们可以采取标量三重积(混合积)的定理拆分开:
理论1:标量三重积:
注意:标量三重积最右端是行列式|...|而不是矩阵[...]
理论2:转置后的矩阵的行列式不变:
因此:
令:
最终得到:
同理可得:
整理就得到了games101中所讲的最终结果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)