1

私はピッキングに関するチュートリアルを読んでいますが、そのカラーピッキングは最も人気があり最も単純な形式です。

例として雪だるまを使っていくつかのチュートリアルを試しましたが、それは私にはうまくいきません。プログラムを実行すると、何も描画されていない黒い画面が表示されます。数回クリックしても、ウィンドウを閉じたとき以外は何も起こりません。「雪だるまをクリックしていません」と表示されます。

何が悪いのかわからないのですが、誰かが私を助けてくれますか?

void GLWidget::paintGL() {
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

    gluLookAt(camPosx ,camPosy ,camPosz,
              camPosx + camViewx,camViewy,camPosz + camViewz,
              camUpx, camUpy, camUpz );

    draw(); //draw the normal scene

    if (mode == SELECT)
        drawPickingMode();
    else
        drawPickingMode();

    if (mode == SELECT) {
        processPick();
        mode = RENDER;
    }
    else
        QGLWidget::swapBuffers();

    // restore current matrix
    glMatrixMode( GL_MODELVIEW );
    glPopMatrix( );

}

void GLWidget::mousePressEvent(QMouseEvent * e)
{
    if(e->button() == Qt::LeftButton)
    {
        qDebug("mouse");
        qDebug("%d %d",QCursor::pos().x(),QCursor::pos().y());
        this->cursorX = QCursor::pos().x(); // set x and y cord from mouse
        this->cursorY = QCursor::pos().y();
        mode = SELECT; // set the mode to select
    }
}

void GLWidget::draw() {

// Draw ground
    glColor3f(0.9f, 0.9f, 0.9f);
    glBegin(GL_QUADS);
        glVertex3f(-100.0f, 0.0f, -100.0f);
        glVertex3f(-100.0f, 0.0f,  100.0f);
        glVertex3f( 100.0f, 0.0f,  100.0f);
        glVertex3f( 100.0f, 0.0f, -100.0f);
    glEnd();

// Draw 4 Snowmen

    glColor3f(1.0f, 1.0f, 1.0f);

    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++) {
            glPushMatrix();
            glTranslatef(i*3.0,0,-j * 3.0);
            glColor3f(1.0f, 1.0f, 1.0f);
            glCallList(snowman_display_list);
            glPopMatrix();
        }

}

void GLWidget::processPick ()
{
    GLint viewport[4];
    GLubyte pixel[3];

    glGetIntegerv(GL_VIEWPORT,viewport);

    glReadPixels(cursorX,viewport[3]-cursorY,1,1,
        GL_RGB,GL_UNSIGNED_BYTE,(void *)pixel);

    printf("%d %d %d\n",pixel[0],pixel[1],pixel[2]);
    if (pixel[0] == 255)
      printf ("You picked the 1st snowman on the 1st row");
    else if (pixel[1] == 255)
      printf ("You picked the 1st snowman on the 2nd row");
    else if (pixel[2] == 255)
      printf ("You picked the 2nd snowman on the 1st row");
    else if (pixel[0] == 250)
      printf ("You picked the 2nd snowman on the 2nd row");
    else
       printf("You didn't click a snowman!");
  printf ("\n");

}

void GLWidget::drawPickingMode() {

// Draw 4 SnowMen


    glDisable(GL_DITHER);
    for(int i = 0; i < 2; i++)
           for(int j = 0; j < 2; j++) {
        glPushMatrix();

// A different color for each snowman

        switch (i*2+j) {
            case 0: glColor3ub(255,0,0);break;
            case 1: glColor3ub(0,255,0);break;
            case 2: glColor3ub(0,0,255);break;
            case 3: glColor3ub(250,0,250);break;
        }

        glTranslatef(i*3.0,0,-j * 3.0);
        glCallList(snowman_display_list);
        glPopMatrix();
       }
    glEnable(GL_DITHER);
}

void GLWidget::initializeGL() {

    loadGLTextures();
    //LoadXml();
    glEnable(GL_TEXTURE_2D);       // Enable Texture Mapping
    glShadeModel(GL_SMOOTH);       // Enable Smooth Shading
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background
    glClearDepth(1.0f);         // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST);       // Enables Depth Testing
    glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do
    glEnable(GL_LIGHT0);        // Quick And Dirty Lighting (Assumes Light0 Is Set Up)
    glEnable(GL_LIGHTING);        // Enable Lighting
    glEnable(GL_COLOR_MATERIAL);      // Enable Material Coloring
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Perspective Calculations
   // buildLists(2);                                      // Creating displaylist #
    glLoadIdentity();

    timer->start(50);
    qDebug("Init");
}

射影行列は次のように設定されます。

void GLWidget::resizeGL(int width, int height) {

    //set viewport
    glViewport(0,0,width,height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //set persepective
    //change the next line order to have a different perspective
    aspect_ratio=(GLdouble)width/(GLdouble)height;
    gluPerspective(45.0f, aspect_ratio, 0.1 , 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
4

2 に答える 2

0

明示的に指定していませんが、おそらくバック バッファーのダブル バッファー ウィンドウにレンダリングしています。したがって、glReadBuffer への呼び出しで glReadPixels への呼び出しを前に追加して、色を読み取るバッファを設定する必要があります。また、画面上のウィンドウは、選択した方法を妨げる可能性のあるピクセル所有権テストやその他の対象になることにも注意してください。

于 2012-05-26T08:51:05.743 に答える
-1

フラッシュは見られません。以前のデータをロードしているため、空白の画面が表示される可能性があります (通常は無意味で空白です)。

于 2012-05-25T14:55:26.527 に答える