• 8888阅读
  • 0回复

opengl 拾取 (求助) [复制链接]

上一主题 下一主题
离线allen18206
 
只看楼主 倒序阅读 楼主  发表于: 2008-12-09
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
关键词: opengl拾取求助
我想做一个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();
}
快速回复
限100 字节
 
上一个 下一个