有没有办法使用OpenGL或GLUT将模型视图矩阵中的点投影到相关的纹理矩阵中?如果没有,是否有一个常用的库来实现这一目标?我想根据3D空间中的光线投射来修改对象的纹理。
最简单的情况是:
这里要说明的是使用球体的问题的更复杂版本,粉红色框显示替换的像素。
我只是在OpenGL中指定用于映射的纹理点,我实际上并不知道如何将像素投影到球体上。基本上我需要与该投影相反,但我不太清楚如何进行数学运算,特别是对于更复杂的形状,如球体或任意凸壳。我假设你可以以某种方式找到构成光线相交的形状的平面多边形,从那里四边形或三角形的反投影将是微不足道的。
一些方程式,文章和/或示例代码会很好。
答案 0 :(得分:1)
有几种方法可以完成你想要做的事情:
通过自己进行模型 - 视图和投影变换矩阵乘法(或者如果您使用的是旧式OpenGL,将世界坐标点投影到规范化设备坐标(NDCs)中,调用gluProject
),并执行透视分割步骤。如果使用深度坐标为零,则这将对应于在成像平面处与光线相交。您需要进行的唯一其他校正从NDC(在 x 和 y 中的[-1,1]范围内)映射到纹理空间中结果坐标为2,然后移动.5。
一起跳过光线跟踪,将纹理作为帧缓冲附件绑定到帧缓冲对象,然后渲染一个大点(或精灵),根据需要修改交集附近的颜色。您可以使用相同的模型视图和投影矩阵,并且(可能)只需要更新视口以匹配纹理分辨率。
答案 1 :(得分:0)
所以我找到了一个有点复杂的解决方案,但是做到了。
对于复杂几何体,您必须确定哪个四边形或三角形相交,并将其用作平面。四边形必须是平面的(显然)。
在尺寸为1x1x0的单位矩阵中绘制一个平面,将纹理映射到与模型几何体相同的点上。