2

我正在尝试在 2D 中绘制形状,并且正在尝试使用 gluProject 在 3D 和 2D 坐标之间进行转换。基本上我的目标是在 (200,200) 上画一个点,并且该点将被适当地绘制(假设起始位置是 0,0,0)。

我已经像这样初始化了 gluProject -

GLdouble modelView[16];
GLdouble projection[16];
GLint viewport[4];
glGetDoublev(GL_MODELVIEW_MATRIX,modelView);
glGetDoublev(GL_PROJECTION_MATRIX,projection);
glGetIntegerv(GL_VIEWPORT,viewport);

我在这样的动画方法中调用它

double tx, ty, tz;
gluProject(0.0,0.0,0.0,modelView,projection,viewport,&tx,&ty,&tz);
cout<<"tx,ty,tz: "<<tx<<","<<ty<<","<<tz<<endl;

我得到的值很奇怪(-9e61,-9e61,-9e61)。我猜这是因为我乘以一个不同的矩阵而不是我应该的。有什么建议吗?

4

2 回答 2

1

我已经像这样初始化了 gluProject -

你的错误就在那里。OpenGL是一个状态机。没有一次性初始化。您需要在 OpenGL 状态机处于您想要取消投影到的状态时获取矩阵和视口。例如,如果您在上下文创建之后立即获取它们,您将只获得身份矩阵和一个可能与您后来获得的不同的视口。

如果您只想在特定位置画一个点,请查看激进 7 的答案。

于 2013-01-21T11:27:32.250 回答
0

如图所示,您的代码是正确的。确保您有一个上下文绑定(通过调用您正在使用的窗口工具包中的wglMakeCurrent、或等效项),否则将不会定义glxMakeCurrent值(包括来自 的值)。glGetError

也就是说,我认为您没有尽可能地使用 OpenGL。例如,如果您这样做:

// Set up the projection transformation to match window coordinates
glMatrixMode( GL_PROJECTION );
glOrtho2D( 0, windowWidth, 0, windowHeight );

// No modeling transformation required for this rendering
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glColor3f( 1.0, 1.0, 1.0 );  // set the current color to white
glBegin( GL_POINTS );
glVertex2i( 200, 200 );
glEnd();

您应该在窗口中的像素 (200,200) 处获得一个白点。

于 2013-01-21T00:19:16.857 回答