OpenGL选择

fescort 2009-02-19 03:28:45
请教关于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();
}



...全文
455 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaigates 2009-10-21
  • 打赏
  • 举报
回复
不错,明天搞定
yaoatou1984 2009-02-20
  • 打赏
  • 举报
回复
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));
}
你希望点中时改变绘制模型的颜色?
是不是应该在OnLButtonDown里面判断selectBuf里面的值,选中了哪个物体,然后改变颜色
且SetMaterial这句放在if (mode == GL_SELECT) 里面是不能在render模式下看到效果的吧
zzz822163 2009-02-20
  • 打赏
  • 举报
回复
http://game.chinaitlab.com/devdoc/28101.html
再看看NEHE教程第32课
zzz822163 2009-02-20
  • 打赏
  • 举报
回复
mode 是哪里来的,你确定和人家设置一样?仔细看看
gwemail2003 2009-02-20
  • 打赏
  • 举报
回复
看一下,应该有问题
fescort 2009-02-20
  • 打赏
  • 举报
回复
glRenderMode (GL_RENDER);
这一句不是就退出了选择模式了么
fescort 2009-02-20
  • 打赏
  • 举报
回复
这个代码我看过了,设置都一样,但就是没有效果
zzz822163 2009-02-19
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/openGL/openglmousesellection.aspx
要想实现你的目的,看看他的吧
zzz822163 2009-02-19
  • 打赏
  • 举报
回复
在进入选择模式之后,帧缓冲区的内容不会被修改,除非退出了选择模式
pioneer_public 2009-02-19
  • 打赏
  • 举报
回复
也在学习中

帮顶

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧