gpt4 book ai didi

c++ - 在 Opengl 2.x [C++] 中获取 ModelView 和投影矩阵

转载 作者:行者123 更新时间:2023-11-28 02:24:55 24 4
gpt4 key购买 nike

我知道 StackOverflow 充满了类似的问题( Like this onethat 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

矩阵是使用 gluPerspectivegluLookAt 生成的。视口(viewport)显然是正确的,但矩阵是错误的,不仅因为它们的值对我来说似乎不太正常,而且因为值在矩阵元素之间的分布(请参阅 [1,2] 元素投影矩阵应该为零,但它不是,而 [3,3] 元素为零,但它不应该)。

这些奇怪的值表明调用 glGet() 函数时出现了一些问题,但我无法弄清楚。我已经检查过我没有在 glBegin()glEnd() 之间调用 glGet()。实际上,我在正确绘制一些点之后和使用相同的 ModelView 和投影矩阵正确绘制一些球体之前调用了 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;
}

这次希望你能帮帮我!预先感谢您的回答:)

最佳答案

问题是 gluProject 需要一个类型为 double 的数组,而您将它传递给 float。当它进行迭代时,它将使用 double 的大小进行迭代,这是 float 大小的两倍!因此,它会跳过一些元素并为其他元素提供垃圾。用 double 替换那些 float 数组并使用 glGetDoublev 获取您想要的值。

此外,您的 gluPerspective 代码中有一个小错误——16/9 将整数截断为 1 ,然后将其传递给函数。这不是您的投影问题的原因,但最好记住整数截断会搞砸您的浮点计算。

最后,我要说在当今时代学习 OldenGL(我称之为)弊大于利。现代 OpenGL 有很多很棒的在线教程,例如:

Open.GL

LearnOpenGL

任何提及 OpenGL 2 及更高版本的内容都是您想要的。

关于c++ - 在 Opengl 2.x [C++] 中获取 ModelView 和投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com