0

私はピッキング手法を初めて使用し、NEHE チュートリアルに従って opengl でピッキング手法を使用しました。実際には、正方形の細い線を検出する必要があります。しかし、なぜそれが正しく検出されないのかわかりません。背景から正方形を削除しても、作成したものではなく他の選択がランダムに選択されます。ほとんどの場合、検出されません...そのため、別のテストexeを作成し、2行だけ配置して正方形の背景を削除しましたが、それでも選択されません..画面の他の部分で選択されることがあります..これらの線は画面から少し離れているので、線がどのように存在するかをはっきりと見るためにズームの自由を与えたので、ズームでもチェックしました...しかし、まだ役に立ちません。非常に紛らわしいです。

以下は私のコードで、どのように行を作成していますか

私の初期化コード

void COpenGLControl::oglInitialize(void)
{
    // Initial Setup:
    //
    static PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        32, // bit depth
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        16, // z-buffer depth
        0, 0, 0, 0, 0, 0, 0,
    };


    // Get device context only once.
    hdc = GetDC()->m_hDC;

    // Pixel format.
    m_nPixelFormat = ChoosePixelFormat(hdc, &pfd);
    SetPixelFormat(hdc, m_nPixelFormat, &pfd);

    // Create the OpenGL Rendering Context.
    hrc = wglCreateContext(hdc);
    wglMakeCurrent(hdc, hrc);

    // Basic Setup:
    //
    // Set color to use when clearing the background.
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClearDepth(1.0f);

    // Turn on backface culling
    glFrontFace(GL_CCW);
    glCullFace(GL_BACK);

    // Turn on depth testing

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    GLenum a = glGetError();
    CCTrace::Trace(L"COpenGLControl::oglInitialize return",a);

    OnDraw(NULL);
}

これは、マウスクリックで呼び出している選択方法です

void CRightOGL::Selection(int mouse_x,int mouse_y)                                          // This Is Where Selection Is Done
{

    GLuint    buffer[512]={0};
    GLint   hits; // The Number Of Objects That We Selected

    // The Size Of The Viewport. [0] Is <x>, [1] Is <y>, [2] Is <length>, [3] Is <width>
    GLint   viewport[4];

    // This Sets The Array <viewport> To The Size And Location Of The Screen Relative To The Window
    glGetIntegerv(GL_VIEWPORT, viewport);
    glSelectBuffer(512, buffer);                                // Tell OpenGL To Use Our Array For Selection


    (void) glRenderMode(GL_SELECT);

    glInitNames();                                              
    glPushName(0);                                              

    glMatrixMode(GL_PROJECTION);                                
    glPushMatrix();                                             
    glLoadIdentity();                                           


    gluPickMatrix((GLdouble) mouse_x, (GLdouble) (viewport[3]-mouse_y), 30.0f, 30.0f, viewport);


    gluPerspective(35.0f, (GLfloat) (viewport[2]-viewport[0])/(GLfloat) (viewport[3]-viewport[1]), 0.01f, 2000.0f);
    glMatrixMode(GL_MODELVIEW);                             


    DrawTargetLines();                                          

    //DrawJawImage();   
    glMatrixMode(GL_PROJECTION);                                // Select The Projection Matrix
    glPopMatrix();                                              // Pop The Projection Matrix
    glMatrixMode(GL_MODELVIEW);                                 // Select The Modelview Matrix
    hits=glRenderMode(GL_RENDER);                               // Switch To Render Mode, Find Out How Many
                                                                // Objects Were Drawn Where The Mouse Was
    GLenum s = glGetError();
    if(s!=0) CCTrace::Trace(L"CRightOGL::oglDrawScene",s);

    if (hits > 0)                                               // If There Were More Than 0 Hits
    {
        int choose = buffer[3];                                 // Make Our Selection The First Object
        int depth = buffer[1];                                  // Store How Far Away It Is 
        //SetTeethSlice(choose);


        for (int loop = 1; loop < hits; loop++)                 // Loop Through All The Detected Hits
        {
            // If This Object Is Closer To Us Than The One We Have Selected
            if (buffer[loop*4+1] < GLuint(depth))
            {
                choose = buffer[loop*4+3];                      // Select The Closer Object
                depth = buffer[loop*4+1];                       // Store How Far Away It Is
            }       
        }
        ((CTeethBiometricApp*)::AfxGetApp())->setDialogSlider(choose);

    }
}

これは、52 種類の線を描画する線引き機能です。

void CRightOGL::DrawTargetLines()
{

    glDisable(GL_TEXTURE_2D);
        //original line when you need to adjust the line use this block
        //  glVertex3d(-0.5,-0.23f,1.0f);                  
        //  glVertex3d( -0.1,-0.35f,1.0f);
        //-------------------------------------------------------------------

    float y1 = 0.25f, y2 = 0.37f;
    for(float loop=1;loop<51;loop++)
    {
        y1+=0.004f;
        y2+=0.004f;

        glLoadName(loop);                                       // Assign Object A Name (ID)
        glPushMatrix();                                         // Push The Modelview Matrix
        glLineWidth(3.0f);
        glBegin(GL_LINES);                      // Start Drawing Our Player Using Lines
        if(this->m_CurrentSlice==loop)
            glColor3f(1.0f,1.0f,0.0f);
        else
            glColor3f(1.0f,0.0f,0.0f);

        glVertex3d(-0.5,y1,1.0f);                  // Top Left Of Player
        glVertex3d( -0.1,y2,1.0f);                  // Bottom Right Of Player
                                                // Pop The Modelview Matrix
        glEnd(); 
        glPopMatrix();
    }
}

これは私の描画機能です

void CRightOGL::oglDrawScene(void)
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glShadeModel(GL_SMOOTH);    

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glLoadIdentity();
    //glTranslatef(0.0f, 0.0f, -m_fZoom);//this is for zoom using left mouse click but no placing
    glTranslatef(m_fPosX, m_fPosY,-m_fZoom); // this is for placing + zooming using middle scroll button mouse click

    glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f);//these two for mouse movement
    glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f);
    glRotated(90,0.0f, 0.0f, -1.0f);

    GLenum s = glGetError();

    DrawJawImage(); 
    DrawTargetLines();
    SwapBuffers(hdc);

    glFlush();

}

私のテストexeはこのドロップボックスにあります

http://dl.dropbox.com/u/104183650/Release.zip

マウスの右ボタンを使用してズームし、マウスの左ボタンを回転させてください

4

1 に答える 1

1

これは非推奨のアプローチです。インターネットで見つけることができるチュートリアルのほとんどは古く、非推奨であり、NeHe のものを含め、OpenGL 3.0+ に関するリソースを使用すれば問題ありません。このコードに取り組み続け、このアプローチで OpenGL を学び続けても意味がありません。

于 2012-09-13T19:35:04.947 に答える