如何使用透视投影从近剪裁平面绘制光线/线?

时间:2015-07-20 15:16:10

标签: c++ opengl 3d

简单地说 - 我想使用透视投影从近剪裁平面到远剪裁平面绘制光线/线。我相信使用各种OpenGL /图形编程指南中描述的方法,通过鼠标单击生成的正确标准化世界坐标。

我遇到的问题是我的光线似乎是从近剪裁平面外部绘制的。

背景:这是我在Qt中构建的简单模型查看器,需要拾取功能。我需要绘制光线以计算场景中物体的交点。但是,我的基本问题是我似乎可以正确地绘制光线。

我的透视投影定义为:

gluPerspective(_fov, aspect, 0.1, 100.0);

其中_fov是45.0 degress,aspect是窗口宽度/高度的比率。

使用我的拣货代码,我根据鼠标点击生成了我认为正确归一化的世界坐标。这些坐标的一个例子:

-0.385753,-0.019608,-0.100000

但是,当我尝试从该点开始绘制一条光线时,看起来它是从剪裁平面外部绘制的:

enter image description here

也许我期待一些不同的东西,但在上面的例子中,我点击了飞机的机头,生成了上面的世界坐标,而我正在不正确地绘制光线(或者我相信)。我希望看到从鼠标点击位置绘制线到飞机模型。

当我绘制光线时,我首先加载单位矩阵,然后从近剪裁平面坐标到远平面绘制一条线。然后我在光线的末端画一个球体(在这个截图中,它在飞机的后面)。

            glPushMatrix();
            glLoadIdentity();

            glColor3f(0,0,1);
            glBegin(GL_LINES);
            glVertex3f(_near_ray.x(), _near_ray.y(), _near_ray.z());
            glVertex3f(_far_ray.x(), _far_ray.y(), _far_ray.z());
            glEnd();

            glTranslatef(_far_ray.x(), _far_ray.y(), _far_ray.z());

            glColor3f(1,0,0);
            glutWireSphere(1, 10, 10);

            glPopMatrix();

关于我做错了什么提示?除{Z}字段外,_far_ray坐标与_near_ray相同。我希望将光线直接绘制到场景中。

最后...... 我想知道如何绘制光线本身。我知道我的代码中可能存在生成坐标的错误,但是如果我只是想从近处剪切平面直接绘制到场景中的任意光线。那就是我想回答。

1 个答案:

答案 0 :(得分:3)

使用透视投影时,如果且仅当它通过眼睛位置时,线条看起来像是屏幕上的一个点。

由于您将模型视图矩阵还原为标识,因此眼睛位于原点(根据this question)。将(0,0,0)作为顶点之一传递,希望您能看到该线退化为一个点。 通常,用作顶点的两个三维矢量必须是共线的。

如果你没有恢复模型视图矩阵,那么你可以从( eye )到( eye + dir )画一条线,其中 eye 是传递给gluLookAt的第一个向量, dir 是任何足够大的向量,可以看到正确的方向。