Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ C++ OpenGL鼠标拾取细线不工作_Visual C++_Opengl_Mfc_Line_Picking - Fatal编程技术网

Visual c++ C++ OpenGL鼠标拾取细线不工作

Visual c++ C++ OpenGL鼠标拾取细线不工作,visual-c++,opengl,mfc,line,picking,Visual C++,Opengl,Mfc,Line,Picking,我是第一次使用拾取技术,我已经按照NEHE教程在opengl中使用拾取技术,我实际上需要检测正方形上的细线。但我不确定为什么它没有正确地检测到它,即使我从背景中删除了正方形,它仍然会随机选择其他选择,而不是我所做的选择。大多数情况下,它从未检测到。。。所以我做了另一个exe测试,我只放了2行,去掉了正方形背景,但仍然没有被选中。有时它会在屏幕的其他部分被选中。。这些线离屏幕有点远,所以我给了缩放自由,可以清楚地看到线是如何存在的,所以我也通过缩放来检查它……但仍然没有用。这很令人困惑 下面是我如

我是第一次使用拾取技术,我已经按照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);

    }
}
我的测试前男友都在这个投递箱上


请使用鼠标右键进行缩放并旋转鼠标左键

这是一种不推荐使用的方法,您可以在internet上找到的大多数教程都是旧的和不推荐使用的,包括来自NeHe的教程,请使用有关OpenGL 3.0+的资源,您会很好;继续编写这段代码并用这种方法继续学习OpenGL是没有意义的。

你能给我提供有关这段代码的链接吗?我想我有opengl 3.0,但是的,我遵循旧的教程,因为我不知道我们现在是否有新的技术。。。如果您能给我提供精确的解决方案、教程或任何api,我将不胜感激。此后,我将对其进行研究。@wolvorinePk在线图书-官方网站,提供有用的pdf和快速链接
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();

}