图形学

发布时间 2023-10-28 10:26:32作者: a__leaf

求交运算

大多数求交无外基本就是写出射线方程和被交物体的方程,然后联立求解,根据一直条件是否符合
射线方程

\[ Ray = O+ D*t \tag{t>0, t<+} \]

球方程

\[ \left(T- Origin \right)= R^2 \]

平面方程

\[\left(P-Pos_0 \right)* \vec{n} = 0 \]

1. 射线与球的求交
求交就好了,最后对t分情况讨论 t的大小然后取值

2.射线与三角形的求交

传统求交方法即联立,求得下式

然后对于t求出的交点坐标是否在三角形内还需进一步判定,可用重心坐标求解

还有一种更高效的方法求交

Möller-Trumbore 算法的核心思想是一步到位的计算出光线是否与三角形相交,主要利用到的知识点是三角形的重心坐标。它是由Tomas Moller 和Ben Trumbore 于1997 年在一篇题名为“Fast, Minimum Storage Ray/Triangle Intersection”的论文中介绍

由三角形内一点都可以由一下方程表示

\[P = \left(1 - \alpha- \beta \right)A + \alpha B+ \beta C \]

所以射线与三角形求交可写成如下

\[O+ D*t = \left(1 - \alpha- \beta \right)A + \alpha B+ \beta C \]

化简

\[\vec{AO} = \alpha\vec{AB} + \beta\vec{AC} - tD \]

写成矩阵形式

\[\begin{pmatrix} \vec{AB}& \vec{AC}& -\vec{D} \end{pmatrix} \begin{pmatrix} \alpha\\ \beta\\ t \end{pmatrix} = \vec{AO} \]

求解\(\alpha、\beta、t\)问题就转换为了求解该方程组问题了,只需要使用克拉默法则即可求出\(\alpha、\beta、t\)三个值

克拉默法则
若线性方程的系数矩阵可逆(非奇异),即系数行列式 D≠0,则线性方程有唯一解,其解为
\(x_i = \frac{D_i}{D}\)

最后对比\(\alpha、\beta、t\)是否在\(\left(0,1\right)\)内即可 (具体原因可学习重心坐标)