我要发帖 回复

正式会员

6

主题

23

积分

0

专家分

:

私信
发表时间 : 2009-1-1 22:30:02 | 浏览 : 1379    评论 : 1
下面是一个拾取的程序 我想只有在点击到那个矩形的时候才改变颜色 可是不知道是什么地方出了问题 不论我点什么地方都会使其改变 希望大家帮我看看 最好告诉我原因
谢谢大家了

#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>

GLfloat temp = 0.0f;


void init(void)
{
        //int i, j;
        //for (i = 0; i < 3; i++)
        //        for (j = 0; j < 3; j ++)
        //                board[j] = 0;
        glClearColor (0.0, 0.0, 0.0, 0.0);
}

void drawSquares(GLenum mode)
{
        if (mode == GL_SELECT)
            glLoadName(0);
             glColor3f (0.5f,0.5f,temp);
             glRectf (1.5f, 1.5f, 2.0f, 2.0f);
  
        if (mode == GL_SELECT)
                  glPopName();
}

#define BUFSIZE 512


void pickSquares(int button, int state, int x, int y)
{
        GLuint selectBuf[BUFSIZE];
        GLint hits;
        GLint viewport[4];

        if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN)
                return;

        glGetIntegerv (GL_VIEWPORT, viewport);

        glSelectBuffer (BUFSIZE, selectBuf);
        (void) glRenderMode (GL_SELECT);

        glInitNames();
        glPushName(0);

        glMatrixMode (GL_PROJECTION);
        glPushMatrix ();
        glLoadIdentity ();
        /*  create 5x5 pixel picking region near cursor location        */
        gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y),
                1.0, 1.0, viewport);
        gluOrtho2D (0.0, 3.0, 0.0, 3.0);
        drawSquares (GL_SELECT);

        glMatrixMode (GL_PROJECTION);
        glPopMatrix ();
        glFlush ();

        hits = glRenderMode (GL_RENDER);
        if (temp <= 1.0f)
        {
           temp += 0.1;
        }
        else
        {
                temp = 0.0f;
        }
       
        //processHits (hits, selectBuf);
        glutPostRedisplay();
}



void display(void)
{
        glClear(GL_COLOR_BUFFER_BIT);
        drawSquares (GL_RENDER);
        glFlush();
}

void reshape(int w, int h)
{
        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D (0.0, 3.0, 0.0, 3.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
        switch (key) {
          case 27:
                  exit(0);
                  break;
        }
}



int main(int argc, char** argv)
{
        glutInit(&argc, argv);
        glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
        glutInitWindowSize (640, 480);
        glutInitWindowPosition (100, 100);
        glutCreateWindow (argv[0]);
        init ();
        glutReshapeFunc (reshape);
        glutDisplayFunc(display);
        glutMouseFunc (pickSquares);
        glutKeyboardFunc (keyboard);
        glutMainLoop();
        return 0;
}

最近VR访客

tan_dunming 评论于2009-1-2 20:30:46
在函数void pickSquares(int button, int state, int x, int y)
语句hits = glRenderMode (GL_RENDER);
后面添加如下两句:
if(hits == 0)
        return;

此外
void drawSquares(GLenum mode)
{
        if (mode == GL_SELECT)
            glLoadName(1);//这里的参数“1”即相当于拾取的图元的ID,在拾取判断究竟选择了哪个图元时用
             glColor3f (0.5f,0.5f,temp);
             glRectf (1.5f, 1.5f, 2.0f, 2.0f);
/***如下两句似乎可以注释掉***/
//         if (mode == GL_SELECT)
//                  glPopName();
}
追求卓越

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-21 05:48 PM

返回顶部