简单地说 - 我想使用透视投影从近剪裁平面到远剪裁平面绘制光线/线。我相信使用各种OpenGL /图形编程指南中描述的方法,通过鼠标单击生成的正确标准化世界坐标。
我遇到的问题是我的光线似乎是从近剪裁平面外部绘制的。
背景:这是我在Qt中构建的简单模型查看器,需要拾取功能。我需要绘制光线以计算场景中物体的交点。但是,我的基本问题是我似乎可以正确地绘制光线。
我的透视投影定义为:
gluPerspective(_fov, aspect, 0.1, 100.0);
其中_fov是45.0 degress,aspect是窗口宽度/高度的比率。
使用我的拣货代码,我根据鼠标点击生成了我认为正确归一化的世界坐标。这些坐标的一个例子:
-0.385753,-0.019608,-0.100000
但是,当我尝试从该点开始绘制一条光线时,看起来它是从剪裁平面外部绘制的:
也许我期待一些不同的东西,但在上面的例子中,我点击了飞机的机头,生成了上面的世界坐标,而我正在不正确地绘制光线(或者我相信)。我希望看到从鼠标点击位置绘制线到飞机模型。
当我绘制光线时,我首先加载单位矩阵,然后从近剪裁平面坐标到远平面绘制一条线。然后我在光线的末端画一个球体(在这个截图中,它在飞机的后面)。
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
相同。我希望将光线直接绘制到场景中。
最后...... 我想知道如何绘制光线本身。我知道我的代码中可能存在生成坐标的错误,但是如果我只是想从近处剪切平面直接绘制到场景中的任意光线。那就是我想回答。
答案 0 :(得分:3)
使用透视投影时,如果且仅当它通过眼睛位置时,线条看起来像是屏幕上的一个点。
由于您将模型视图矩阵还原为标识,因此眼睛位于原点(根据this question)。将(0,0,0)作为顶点之一传递,希望您能看到该线退化为一个点。 通常,用作顶点的两个三维矢量必须是共线的。
如果你没有恢复模型视图矩阵,那么你可以从( eye )到( eye + dir )画一条线,其中 eye 是传递给gluLookAt的第一个向量, dir 是任何足够大的向量,可以看到正确的方向。