我想做一个opengl拾取的东西 但是却一直拾取不到正确的对象 下面是代码
希望高人指点下 哪儿有问题
paintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0f, 0.0f, -200.0f); //改变坐标原点
glTranslatef(OffsetX, OffsetY, OffsetZ);//这3参数在鼠标右键事件中修改 未贴出来
glRotatef(xrot, 1.0f, 0.0f, 0.0f);//旋转
glRotatef(yrot, 0.0f, 1.0f, 0.0f);//旋转
//glScalef(ScaleParam, ScaleParam, ScaleParam);//比列(缩放)鼠标中建事件修改
glColor3f(1.0f, 1.0f, 1.0f);
drawSquare(10);//画正方形
glPopMatrix();
glFlush();
}
resizeGL(int width, int height)
{
if (height == 0)
height = 1;
glViewport(0, 0, width, height);
fAspect = (GLfloat)width / (GLfloat)height;
glMatrixMode(GL_PROJECTION); //指定需要被修改的是投影矩阵,为场景增加透视
glLoadIdentity(); // 把当前的可修改矩阵设置为 4*4 的单位矩阵,为场景设置透视图
gluPerspective(45.0,fAspect,0.1,400.0);
glMatrixMode(GL_MODELVIEW); //指定需要被修改的是模型矩阵
glLoadIdentity();
glFlush();
}
mousePressEvent ( QMouseEvent * event )
{
lastPos = event->pos();
int x = lastPos.x();
int y = lastPos.y();
if (event->buttons() != Qt::LeftButton ) //上面3行是关于旋转的
return;
GLint viewport[4],hits;
GLuint selectBuf[512];
glGetIntegerv(GL_VIEWPORT,viewport);
float gModelMatrix[16];
glSelectBuffer((GLint)512,selectBuf);
(void)glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPickMatrix((GLdouble)x,(viewport[3]-(GLdouble)y),1.0,1.0,viewport);
gluPerspective(45.0,(GLdouble)(viewport[2]/viewport[3]), 0.1,400.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -200.0f); //改变坐标原点 个人感觉是这几句的问题不
glTranslatef(OffsetX, OffsetY, OffsetZ); // 知道如何改 希望指点哈
glRotatef(xrot, 1.0f, 0.0f, 0.0f);//旋转
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
glScalef(ScaleParam, ScaleParam, ScaleParam);//比列(缩放)
drawSquare(10.0,GL_SELECT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPopMatrix ();
glFlush();
hits = glRenderMode(GL_RENDER);
if(hits != 0)
{
GLuint *ptr = (GLuint *) selectBuf;
ptr += 3;
QString str;
str.setNum(*ptr);
QMessageBox::information(0,"",str);
}
}
drawSquare(GLfloat sidecar,GLenum mode)
{
if(mode == GL_SELECT)
glLoadName(1);
glBegin(GL_QUADS);
glColor3f(0.0f,1.0f,0.0f); // 颜色改为蓝色
glVertex3f( sidecar/2, sidecar/2,-sidecar/2); // 四边形的右上顶点 (顶面)
glVertex3f(-sidecar/2, sidecar/2,-sidecar/2); // 四边形的左上顶点 (顶面)
glVertex3f(-sidecar/2, sidecar/2, sidecar/2); // 四边形的左下顶点 (顶面)
glVertex3f( sidecar/2, sidecar/2, sidecar/2); // 四边形的右下顶点 (顶面)
glEnd();
if(mode == GL_SELECT)
glLoadName(2);
glBegin(GL_QUADS);
glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色
glVertex3f(sidecar/2,-sidecar/2, sidecar/2); // 四边形的右上顶点(底面)
glVertex3f(-sidecar/2,-sidecar/2, sidecar/2); // 四边形的左上顶点(底面)
glVertex3f(-sidecar/2,-sidecar/2,-sidecar/2); // 四边形的左下顶点(底面)
glVertex3f( sidecar/2,-sidecar/2,-sidecar/2); // 四边形的右下顶点(底面)
glEnd();
if(mode == GL_SELECT)
glLoadName(3);
glBegin(GL_QUADS);
glColor3f(1.0f,0.0f,0.0f); // 颜色改成红色
glVertex3f( sidecar/2, sidecar/2, sidecar/2); // 四边形的右上顶点(前面)
glVertex3f(-sidecar/2, sidecar/2, sidecar/2); // 四边形的左上顶点(前面)
glVertex3f(-sidecar/2,-sidecar/2, sidecar/2); // 四边形的左下顶点(前面)
glVertex3f( sidecar/2,-sidecar/2, sidecar/2); // 四边形的右下顶点(前面)
glEnd();
if(mode == GL_SELECT)
glLoadName(4);
glBegin(GL_QUADS);
glColor3f(1.0f,1.0f,0.0f); // 颜色改成黄色
glVertex3f( sidecar/2,-sidecar/2,-sidecar/2); // 四边形的右上顶点(后面)
glVertex3f(-sidecar/2,-sidecar/2,-sidecar/2); // 四边形的左上顶点(后面)
glVertex3f(-sidecar/2, sidecar/2,-sidecar/2); // 四边形的左下顶点(后面)
glVertex3f( sidecar/2, sidecar/2,-sidecar/2); // 四边形的右下顶点(后面)
glEnd();
if(mode == GL_SELECT)
glLoadName(5);
glBegin(GL_QUADS);
glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色
glVertex3f(-sidecar/2, sidecar/2, sidecar/2); // 四边形的右上顶点(左面)
glVertex3f(-sidecar/2, sidecar/2,-sidecar/2); // 四边形的左上顶点(左面)
glVertex3f(-sidecar/2,-sidecar/2,-sidecar/2); // 四边形的左下顶点(左面)
glVertex3f(-sidecar/2,-sidecar/2, sidecar/2); // 四边形的右下顶点(左面)
glEnd();
if(mode == GL_SELECT)
glLoadName(6);
glBegin(GL_QUADS);
glColor3f(1.0f,0.0f,1.0f); // 颜色改成紫罗兰色
glVertex3f( sidecar/2, sidecar/2,-sidecar/2); // 四边形的右上顶点(右面)
glVertex3f( sidecar/2, sidecar/2, sidecar/2); // 四边形的左上顶点(右面)
glVertex3f( sidecar/2,-sidecar/2, sidecar/2); // 四边形的左下顶点(右面)
glVertex3f( sidecar/2,-sidecar/2,-sidecar/2); // 四边形的右下顶点(右面)
glEnd();
}