OpenGL选择
请教关于OpenGL选择的问题
用OpenGL绘制了一系列三维对象,想要选择其中的某个物体,但就是没有反应,
麻烦牛哥们帮忙看看,谢谢!
代码如下:
void OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_szGriphics3D.DealLBtnDown(point);
COleControl::OnLButtonDown(nFlags, point);
}
void Graphics3D::DealLBtnDown(CPoint pt){
GLuint selectBuf[BUFSIZE];
GLint viewport[4];
//HDC hDC = ::GetDC(this->m_hWnd);
//wglMakeCurrent(hDC,hRC);//这里的hRC使用了本类的公有变量,所以注释掉了这一句
glGetIntegerv (GL_VIEWPORT, viewport);
glSelectBuffer (BUFSIZE, selectBuf);
glRenderMode(GL_SELECT); // Enter the SELECT render mode
glInitNames();
glPushName(0);
glPushMatrix ();
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
//gluPickMatrix((GLdouble)pt.x, (GLdouble)(/*viewport[3]-*/pt.y), 5, 5, viewport);
if(m_xRect>=m_yRect)
{
glOrtho(-20.0,20.0,-20.0*(GLfloat)m_yRect/(GLfloat)m_xRect, 20.0*(GLfloat)m_yRect/(GLfloat)m_xRect,-50.0,50.0);
}
else
{
glOrtho(-20.0*(GLfloat)m_xRect/(GLfloat)m_yRect,20.0*(GLfloat)m_xRect/(GLfloat)m_yRect,-20.0,20.0,-50.0,50.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity ();
Draw(GL_SELECT, m_rectClient);//显示三维图形
glPopMatrix ();
glFlush ();
glRenderMode (GL_RENDER);
}
void Graphics3D::Draw(GLenum mode, CRect clientRect)
{
m_rectClient = clientRect;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓冲和深度缓冲
glLoadIdentity(); //用单位矩阵替换当前矩阵
glTranslatef(m_fMoveX,m_fMoveY,m_fMoveZ);
//glTranslatef(0.0,0.0,0.0);
//旋转角度
glRotatef(m_xRotation, 1.0, 0.0, 0.0);
glRotatef(m_yRotation, 0.0, 1.0, 0.0);
glScalef(m_fZoomX, m_fZoomY,m_fZoomZ);
glLineWidth(0.1);
CFont font, *oldFont;
font.CreateFont(12,0,0,0,500,0,0,0,0,0,0,0,0,_T("宋体"));
oldFont = m_pDC->SelectObject(&font);
//DrawTrochoidConduit();
DrawTrochoidLine(mode);
DrawCornerCoorSys(); //绘制左下角小坐标系
this->DrawCoordinateSystem();
m_pDC->SelectObject(oldFont);
font.DeleteObject();
//强制绘图完成
glFinish();
//glPopMatrix();
//交换缓冲区数据
SwapBuffers(wglGetCurrentDC());
HDC hdc=wglGetCurrentDC();
::SetBkMode( hdc, TRANSPARENT );
::SetTextColor( hdc, RGB(245,248,9) );
CString sState(_T("TK110井"));
CSize strSize = m_pDC->GetTextExtent(sState);
::TextOut(hdc,(clientRect.Width() - strSize.cx) / 2, 30 ,sState,sState.GetLength());
}
void Graphics3D::DrawTrochoidLine(GLenum mode)
{
for ( int i = 0; i < m_wellArray.GetCount(); i++)
{
((CTrochoidLine * )m_wellArray[i])->SetPos(-m_fCuboidLen / 2.0, (m_fCuboidHei / 2.0) , -m_fCuboidWid / 2.0);
((CTrochoidLine * )m_wellArray[i])->Set_bShowFixedPointsLine(m_bShowFixedPointsLine);
((CTrochoidLine * )m_wellArray[i])->Draw(mode);
}
}
void CTrochoidLine::Draw(GLenum mode)
{
//if (m_bFirstShow)
{
int nReturn = m_szCoorConvert.CoorConvert(m_trochoidDataVec, m_FixedPointsVec, m_cjqxArray, m_HoleArray, m_nFactorX, m_nFactorY, m_nFactorZ);
if (nReturn == 0)
{
return;
}
ExchangeData();
//m_bFirstShow = FALSE;
}
AddHoleToTrochoid();
DrawTrochoid();
DrawFixedPoints(mode);
DrawCjqx();
}
void CTrochoidLine::DrawFixedPoints(GLenum mode)
{
glPushMatrix();
glTranslatef(m_fPosX, m_fPosY, m_fPosZ);
SetMaterial(RGB(255,255,255), RGB(255,150,0), RGB(255,255,255), RGB(255,255,255));
for ( int j = 0; j < m_FixedPointsArray.GetCount(); j++)
{
((CFixedPoints *)m_FixedPointsArray[j])->Set_bShowLine(m_bShowFixedPointsLine);
if (mode == GL_SELECT)
{
glLoadName(j);
//glPushName(j);
//这里设置了如果是选择模式,就让所绘制得的模型改变一下颜色
SetMaterial(RGB(255,255,255), RGB(123,104,238), RGB(255,255,255), RGB(255,255,255));
}
((CFixedPoints *)m_FixedPointsArray[j])->Draw();
if (mode == GL_SELECT)
{
//glPopName();
}
}
SetMaterial(RGB(255,255,255), RGB(255,255,255), RGB(255,255,255), RGB(255,255,255));
glPopMatrix();
}
void CFixedPoints::Draw()
{
//绘制靶点坐标
glPushMatrix();
//glDisable(GL_LIGHTING);
glColor3f(0.0f,0.0f,1.0f);
//绘制虚线
if (m_bShowLine)
{
glEnable(GL_LINE_STIPPLE); //启动虚线模式(使用glDisable(GL_LINE_STIPPLE)可以关闭之)
glLineStipple (1, 0x0F0F);
glBegin(GL_LINES);
glVertex3f(m_fX,0,m_fY);
glVertex3f(m_fX,-1 * m_fZ,m_fY);
glEnd();
glDisable(GL_LINE_STIPPLE);
}
//绘制地面圆环中的短横线
glBegin(GL_LINES);
glVertex3f(m_fX + 0.3,0,m_fY);
glVertex3f(m_fX + 0.5,0,m_fY);
glVertex3f(m_fX - 0.3,0,m_fY);
glVertex3f(m_fX - 0.5,0,m_fY);
glVertex3f(m_fX,0,m_fY + 0.3);
glVertex3f(m_fX,0,m_fY + 0.5);
glVertex3f(m_fX,0,m_fY - 0.3);
glVertex3f(m_fX,0,m_fY - 0.5);
glEnd();
//绘制靶点对应地面的圆
glTranslatef(m_fX,0,m_fY);
glRotatef(-1 * 90, 1.0, 0.0, 0.0);
//内部小圆
double R = 0.3;
glBegin(GL_POINTS);
for ( int i = 0; i < 360; i++)
{
glVertex2f(R*cos(2*PI/360*i), R*sin(2*PI/360*i)); //根据角度画圆
}
glEnd();
//外部大圆
R = 0.5;
glBegin(GL_POINTS);
for ( int i = 0; i < 360; i++)
{
glVertex2f(R*cos(2*PI/360*i), R*sin(2*PI/360*i)); //根据角度画圆
}
glEnd();
glPopMatrix();
//绘制靶点坐标
glPushMatrix();
glColor3f(0.0f,0.0f,1.0f);
glTranslatef(m_fX,-1 * m_fZ,m_fY);
glRotatef(-1 * 90, 1.0, 0.0, 0.0);
glutSolidCone(0.4, 1.0, 10, 10);
glPopMatrix();
}