2010-12-02 117 views
1

我在y = -50平面上有一个四边形。此刻,我想要做的就是获取鼠标点击四边形的坐标。我设法在一定程度上做到了这一点。问题在于绘制四边形时我应用的转换没有考虑到。我可以添加一些常量并使其工作,但我让用户使用glRotatef()围绕x和y轴旋转场景,因此一旦发生旋转,坐标就会变得混乱。Ray gluingProject()采摘

这里是我现在在做什么:

我打电话gluUnProject()两次,第一次与Z = 0,和曾经与Z = 1

gluUnProject(mouseX, WINDOW_HEIGHT - mouseY, 0, modelView, projection, viewport, &x1, &y1, &z1); 
gluUnProject(mouseX, WINDOW_HEIGHT - mouseY, 1, modelView, projection, viewport, &x2, &y2, &z2); 

标准化光线矢量:

x = x2 - x1; 
y = y2 - y1; 
z = z2 - z1; 
mag = sqrt(x*x + y*y + z*z); 
x /= mag; 
y /= mag; 
z /= mag; 

参数方程:

float t = -(camY)/y; 
planeX = camX + t*x; 
planeY = camY + t*y; 
planeZ = camZ + t*z; 

其中(camX,camY,camZ)是传递给gluLookAt()的相机位置。

我希望planeX,planeY和planeZ是四边形上点击的坐标,在我用来绘制四边形的同一坐标系中。我怎样才能做到这一点?

+0

您何时抓​​取modelView矩阵?在`glRotatef()`之前或之后? – genpfault 2010-12-02 16:52:17

回答

1

你不应该通过你选择的明确的z深度。为了找到世界坐标,您需要传入特定鼠标坐标处的深度缓冲区值。

GLfloat depth; 
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); 

将它传递到您的gluUnProject应该会产生您正在查找的值。另外,正如genpfault在他的评论中所说的那样,确保您在正确的时刻抓取模型视图矩阵数据。否则,你有错误的矩阵。