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