如何使用多个模型视图矩阵计算拾取光线?

时间:2010-09-12 19:49:50

标签: opengl vector matrix intersection

我想计算一条光线与用户在我的应用程序屏幕上看到的模型之间的交集。我正在关注OpenGL guide,但我在场景中有很多模型,我在push-pop上下文中独立动态绘制,将转换应用到当前模型视图矩阵(即我为每个模型做了一次

glPushMatrix

glTranslatef

draw the model

glPopMatrix )。

我是否还需要计算不同的光线,每个对象一个(如果它与模型的边界球相交,稍后进行测试)?

也许关于光线拾取的一些概念对我来说还不是很清楚。任何链接,指南等都将非常感激^^

1 个答案:

答案 0 :(得分:1)

采摘光线与模型矩阵无关。如果场景中的对象移动(即模型矩阵发生变化),则光线本身不会移动。

您打算在链接中提议的方法之间使用哪种方法? GL_SELECTION,使用特殊颜色渲染,自制交叉点?

我会相应地编辑这个答案

编辑:让我们去自制的那个

首先,您需要生成光线。你通常想在世界空间中表达它(即“我的光线与我的相机在同一个位置开始,它的目录是(xyz))。你有两种方法可以做到这一点,这在openGL常见问题中得到了很好的解释(生成拾取射线的一种方法...另一种方法......)。只需复制'n粘贴代码。

如果鼠标位于屏幕中间,则应将光线指向与相机相同的方向。您可以使用gluLookAt的参数进行检查。

现在,您要做的是将光线与网格三角形相交,但是您遇到了问题,因为三角形不是在与光线相同的系统中表示。

所以你必须在三角形的系统中表达光线。

三角形系统:模型系统;射线系统:世界体系。幸运的是,你有一个从模型到世界的矩阵(模型矩阵,你在glPushMatrix之后设置的矩阵)。因此,逆(ModelMatrix)是从世界到矩阵的矩阵。

ray = Ray(cam_pos, dir);
foreach (mesh)
    ModelMatrix = whatever you want
    InverseModelMatrix = inverse(ModelMatrix)
    rayInModelSpace = Ray(InverseModelMatrix x ray.pos, InverseModelMatrix x ray.dir)
    Intersect(rayInModelSpace, mesh)

您的Intersect方法可能如下所示:

foreach (triangle in mesh )
    if ray.intersect(triangle) return true

三角光交叉码可以在geometrictools.com找到

这将非常缓慢,但它会起作用。有几种方法可以改善性能,但最简单的方法是计算每个网格的AABB,并首先将光线与AABB相交。没有与AABB =>的交集。没有与网格的交集

代码也可以在几何工具上找到。

我会离开几天,祝你好运:)