2010-09-12 78 views
0

我想计算光线与用户在我的应用程序的屏幕上看到的模型之间的交集。我正在关注的OpenGL guide但我在现场很多的模型,我在应用转化为当前的模型视图矩阵(即每个模型我做了如何使用多个模型视图矩阵计算拾取射线?

glPushMatrix推入 - 弹出上下文独立和动态绘制,

glTranslatef

draw the model

glPopMatrix )。

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

也许关于射线采集的一些概念还不是很清楚。任何链接,指南等将非常赞赏^^

回答

1

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

您打算在链接中提出的方法之间使用哪种方法? GL_SELECTION,用特殊颜色渲染,自制的十字路口?

我将修改这个答案相应

编辑:让我们去自制一个然后

首先,你需要生成一个光线。你通常想要在世界空间中表达它(即“我的光线始于与我的相机相同的位置,其目标是(xyz))。有两种方法可以做到这一点,这些方法在openGL Faq一种方法来生成拾取光线......另一种方法......)只需复制'n粘贴代码

如果鼠标位于屏幕中间,则应该让光线指向相同的方向你可以检查你的参数gluLookAt

现在,你想要做的是相交你的射线与你的网格的三角形,但你有一个问题,因为三角形不是相同的表达系统比射线。

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

三角形系统:模型系统;射线系统:世界体系。幸运的是,您有一个从模型到世界的矩阵(模型矩阵,您在glPushMatrix之后设置的矩阵)。所以inverse(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) 

你相交方法看起来是这样的:

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

三角线相交的代码可以在geometrictools.com

这将是相当缓慢的发现,但它会奏效。有几种方法可以提高性能,但最简单的方法是计算每个网格的AABB,并首先将该射线与AABB相交。不与AABB交叉=>不与网格相交

代码也可以在geometrytools上找到。

我会离开几天,这么好运:)

+0

谢谢回答^^我试图做家庭由模型视图矩阵的逆变换它使一个。所以ModelView矩阵意味着什么,我想 – rano 2010-09-13 19:01:21

+0

谢谢你这真的有帮助,并确认我在想什么,很高兴听到我学习了OpenGL的一些东西,尽管我仍然是一个小菜鸟。而且这个链接也非常有用。 – rano 2010-09-15 18:48:11