我知道StackOverflow充满了类似的问题(Like this one或that one)但是给出的解决方案对我来说似乎不起作用。
我的目标是使用gluProject
从3D空间获取某些点的屏幕坐标。在此之前,我希望通过以下方式获得矩阵:
GLint view[4]={0};
GLdouble proj[16]={0};
GLdouble model[16]={0};
glGetDoublev(GL_PROJECTION_MATRIX,proj);
glGetDoublev(GL_MODELVIEW_MATRIX,model);
glGetIntegerv(GL_VIEWPORT,view);
知道这三个允许计算点的屏幕坐标。但是,当我调用这些函数时,我会得到奇怪的结果:
VIEWPORT
0 0 1366 768
PROJECTION
-536 870 912 1 073 460 858 0 0
0 0 -536 870 912 1 073 460 858
0 0 0 0
0 0 0 0
MODELVIEW
1 073 741 824 1 073 741 824 -1 073 741 824 1 071 119 123
0 0 1 073 741 824 1 072 511 075
-1 073 741 824 1 072 523 682 0 -1 077 637 615
-2 147 483 648 -1 069 923 613 0 -1 071 413 844
使用gluPerspective
和gluLookAt
生成矩阵。
视口显然是正确的,但矩阵是错误的,不仅因为它们的值对我来说似乎不太正常,而且因为值的分布跨矩阵的元素(参见[1,2]元素投影矩阵应为零,但不是,虽然[3,3]元素为零,但它不应该。)
这些奇怪的值指出了glGet()
函数调用中的一些问题,但我无法弄明白。我已经检查过,我没有在glGet()
和glBegin()
之间拨打glEnd()
。实际上,我在正确绘制一些点之后,正好在使用相同的ModelView和Projection矩阵正确绘制一些球体之前调用glGet()
。
我的代码中有一个更大的片段(调用序列是main->CheckForPlanetPosition->Planet::GetScreenLocation
):
typedef struct position {
int x,y,z;
};
int main()
{
glEnable(GL_DEPTH_TEST);
glViewport(0,0,1366,768);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,16.0f/9.0f,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(Camera.x,Camera.y,Camera.z,Camera.cx,Camera.cy,Camera.cz,0,1,0);
//calls to glEnable
//some drawing
glBegin(GL_LINES);
for(float i=1;i<15;i++)
{
glColor4f(0,120.0f/255.0f,210.0f/255.0f,1.0f);
glVertex3f(0,0.5f,i*100.0f/15.0f);
glVertex3f(100,0.5f,i*100.0f/15.0f);
glVertex3f(i*100.0f/15.0f,0.5f,0);
glVertex3f(i*100.0f/15.0f,0,100);
}
glEnd();
CheckForPlanetsLocation();
//other stuff...
return 0;
}
bool CheckForPlanetsLocation()
{
position pos;
pos=SomePlanet.GetScreenLocation();
//check that the mouse is over the returned region...
}
position Planet::GetScreenLocation()
{
GLint view[4]={0};
GLdouble proj[16]={0};
GLdouble model[16]={0};
GLdouble x,y,z;
glGetDoublev(GL_PROJECTION_MATRIX,proj);
glGetDoublev(GL_MODELVIEW_MATRIX,model);
glGetIntegerv(GL_VIEWPORT,view);
gluProject(pos.x,pos.y,pos.z,model,proj,view,&x,&y,&z);
position res;
res.x=(int)x;
res.y=(int)y;
res.z=(int)z;
return res;
}
希望你这次可以帮助我!在此先感谢您的回答:)
答案 0 :(得分:2)
问题在于test = records.select{ |x| x[0] == search_for }
value = test[0][1]
期望一个gluProject
类型的数组,而你传递double
。当它进行迭代时,它将使用float
的大小进行迭代,这是浮点数的两倍!因此,它会跳过一些元素并为其他人提供垃圾。使用double交换掉那些浮点数组,并使用double
来获取所需的值。
此外,您的glGetDoublev
代码中有一个小错误 - 在传递到函数之前,16/9将整数截断为1 。这不是你的投影问题的原因,但是记住整数截断是一个会搞砸浮点计算的事情。
最后,我会成为那个人并且说在这个时代学习OldenGL(我称之为)弊大于利。现代OpenGL有很多很棒的在线教程,例如:
任何提到OpenGL 2及以上版本的东西都是你想要的。