我正在尝试在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)。我猜它是因为我乘以不同的矩阵而不是我应该的。有什么建议吗?
答案 0 :(得分:1)
我已经像这样初始化了gluProject -
那里有你的错误。 OpenGL是一个状态机。没有一次性初始化。您需要在OpenGL状态机处于要取消项目的状态时获取矩阵和视口。如果你拿它们,例如在创建上下文之后,您将获得身份矩阵和视口,这些视口可能与您以后获得的视图不同。
如果您希望在特定位置画一个点,请查看radical7的答案。
答案 1 :(得分: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)处得到一个白点。