【OpenGL ES】光栅化插值原理和射线拾取原理

1 前言

最近在推导光栅化插值公式和射线拾取公式,发现计算过程中有很多共同点,因此将它们放在一篇文章里介绍。具体共同点如下。

  • 都引入了四面体模型
  • 都以四面体的三条边作为基向量构建坐标系(非直角坐标系)
  • 都需要求解射线向量在基向量上的坐标

2 光栅化插值原理

光栅化要解决的问题:如下图,已知三角形的三个顶点的坐标及其他属性(如颜色、纹理坐标、法线向量、切线向量、副切线向量等),对于三角形内任意一点,若已知其坐标,求该点的颜色、纹理坐标等属性的值。

进一步细化问题:如下图,O 点是坐标原点,已知 A、B、C、Q 4 个点的坐标,假设 Q = x · A + y · B + z · C,求 x 、y、z 的值。

定义向量如下。

向量 d 可以用向量 a、b、c 线性表示如下。

使用矩阵表示如下。

求解向量 m 如下。

说明如下:

  • 向量 m 的几何含义是:若以向量 a、b、c 为坐标轴建立坐标系(非直角坐标系),向量 m 表示向量 d 在该坐标系下的坐标。
  • 由于 Q 点在 ΔABC 的内部,因此 mx + my + mz = 1,并且 mx >= 0、my >= 0、mz >= 0
  • 如果 mx = my = mz = 1 / 3 ,则 Q 点一定是 ΔABC 的重心

为简化计算,可以使用以下数学工具。

  • 对于线性方程组 A·x=b,根据克拉默法则可以求解:xi = |Bi| / |A|,其中 Bi 是将矩阵 A 的第 i 列替换为 b 向量后的矩阵。
  • 假设 3x3 矩阵 A 由 a、b、c 三个列向量组成,则 |A| = a x b · c。

2 射线拾取原理

参考:直线与三角形相交Moller Trumbore算法推导

如下图,已知 A、B、C、P 4 个点的坐标,向量 n 是由 P 点发射的单位方向向量,Q 点是向量 n 与 ΔABC 的交点,求 Q 点坐标。由于 Q = P + d,因此本节只求向量 d 的坐标。

定义向量如下。

向量 n 可以用向量 a、b、c 线性表示如下。

使用矩阵表示如下。

求解向量 m 如下。

如果 mx、my、mz 中有一个为负数,说明交点 Q 一定在 ΔABC 外部;如果 mx + my + mz = 0,说明向量 m 与 ΔABC 平行。

由于向量 d 与向量 a 线性相关,并且 Q 点在 ΔABC上,可以得出以下方程,求解后即可得到向量 d 的坐标。

相关推荐
阑梦清川4 个月前
关于插值和拟合(数学建模实验课)
数学建模·插值·拟合·三次样条插值
回音谷8 个月前
【算法】克里金(Kriging)插值原理及Python应用
python·算法·插值
AomanHao8 个月前
【阅读笔记】基于FPGA的红外图像二阶牛顿插值算法的实现
图像处理·笔记·算法·fpga开发·插值·超分
木水_2 年前
超分任务中的转置卷积、pixelshuffle 和插值上采样
深度学习·插值
杀生丸学AI2 年前
【三维重建】3D Gaussian Splatting:实时的神经场渲染
3d·光栅化·三维重建·快速渲染
梁辰兴2 年前
Java 复习笔记 - 常见算法:查找算法
java·笔记·算法·哈希·插值·斐波那契·查找算法
hyhhyh212 年前
基于MATLAB的径向基函数插值(RBF插值)(一维、二维、三维)
matlab·rbf·径向基函数·插值
啊基米德2 年前
Games101学习笔记 -光栅化
光栅化·深度测试