2

有没有办法使用 OpenGL 或 GLUT 将模型视图矩阵中的点投影到关联的纹理矩阵中?如果没有,是否有一个常用的库可以实现这一点?我想根据 3D 空间中的光线投射来修改对象的纹理。

最简单的情况是:

  1. 投射一条与四边形相交的光线,并使用单个纹理进行映射。
  2. 交点被转换为在 x 和 y 轴上钳制在 [0.0,1.0] 之间的纹理空间中的值。
  3. 以生成的纹理点的舍入值为中心的 3x3 像素块设置为 0 的 alpha 值。(或另一个方便的 RGBA 值,以获得所需的效果)。

为了说明这里是一个使用球体的更复杂版本的问题,粉红色的框显示了替换的像素。

我只是在 OpenGL 中指定用于映射的纹理点,我实际上并不知道像素是如何投影到球体上的。基本上我需要该投影的倒数,但我不太清楚如何进行数学运算,尤其是在更复杂的形状上,如球体或任意凸包。我假设您可以以某种方式找到构成形状的平面多边形,光线与之相交,并且从那里四边形或三角形的逆投影将是微不足道的。

一些方程式、文章和/或示例代码会很好。 将光线投射到纹理空间

4

2 回答 2

1

有几种方法可以完成您正在尝试做的事情:

  1. 通过自己进行模型视图和投影变换矩阵乘法(或者如果您使用旧式 OpenGL,请调用),将世界坐标点投影到规范化设备坐标gluProject(NDC) ,并执行透视除法步骤。如果您使用零深度坐标,这将对应于在成像平面上与您的光线相交。您需要进行的唯一其他校正是将 NDC(在xy的 [-1,1] 范围内)映射到纹理空间,方法是将结果坐标除以 2,然后移动 0.5。

  2. 一起跳过光线追踪,将纹理作为帧缓冲区附件绑定到帧缓冲区对象,然后渲染一个大点(或精灵),根据需要修改交叉点附近的颜色。您可以使用相同的模型视图和投影矩阵,并且(可能)只需要更新视口以匹配纹理分辨率。

于 2013-06-23T18:50:48.983 回答
0

所以我找到了一个有点复杂的解决方案,但可以解决问题。

对于复杂的几何图形,您必须确定与哪个四边形或三角形相交,并将其用作平面。四边形必须是平面的(显然)。

在单位矩阵中绘制一个尺寸为 1x1x0 的平面,将纹理映射到与模型几何图形相同的点上。

  1. 变换平面,并将每个变换矩阵的逆存储在堆栈中
  2. 找到平面相交的点
  3. 使用逆矩阵堆栈变换这个点,直到它返回单位矩阵(它应该没有深度(
  4. 通过将点乘以像素数并四舍五入,将此点从 1x1 空间转换为像素空间。或者在此处开始您的 2D 组合逻辑。
于 2013-06-23T21:41:57.997 回答