+ -
当前位置:首页 → 问答吧 → OPenGL的显示的模型怎么没有棱边

OPenGL的显示的模型怎么没有棱边

时间:2011-12-11

来源:互联网

大家帮忙看一下吧 用OpenGl读取STL三角形片面 然后显示出来的模型面与面之间的棱边无法显示 本来模型上还有那种盲孔的 但是现在完全看不出来 就是一团有边界的颜色 显示效果很不好 请问一下 到底是怎么回事 红宝书我也翻过 我觉得可能是我的OPenGL某些功能忘记开了 是不是要加上灯光 材质什么的 还有就是如果要可以清楚得看见模型的面与面之间的棱边 到底怎么样设置OpenGL的各种设定 感觉里面可以设定的东西太多 但是又不知道到底哪个才和我想要达到的效果有关系
  对了 模型在Z方向的距离大约是+/-21.5  

下面是我的主要的代码
BOOL CModelView::InitGL()
{
//设置一下OpenGL的作图环境参数
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告诉系统对透视进行修正

return TRUE;
}

void CModelView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if (0 == cy) // 防止被零除
{
  cy = 1; // 将Height设为1
}

glViewport(0, 0, cx, cy); // 重置当前的视口
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵

// 设置视口的大小
gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
  glLoadIdentity(); // 重置模型观察矩阵
}

BOOL CModelView::DrawScene(void)
{
CClientDC dc(this); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存

glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); // 重置当前的模型观察矩阵

//记录当前模型相对于世界坐标系原点的位置
glTranslatef(0,0,-30); //移入屏幕 30
glTranslatef(m_xTranslation,m_yTranslation,0);
glScalef(m_Scaling,m_Scaling,m_Scaling);
glRotatef(m_xRotation,1.0f,0.0f,0.0f);
glRotatef(m_yRotation,0.0f,1.0f,0.0f);
//glRotatef(m_zRotation,0.0f,0.0f,1.0f);

CLRPSDoc* pDoc=(CLRPSDoc*)GetDocument();
MySTLModel &msm=pDoc->m_STLModel;

switch (m_iPlayState)
{
case 0: //显示模型
{
//读三角面片
TRICHIP* triSearch;
triSearch=msm.trichip_head;
for(int i=0;i<pDoc->m_STLModel.num_tri;i++)
{
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLES); // 绘制三角形
glNormal3f(triSearch->N_x,triSearch->N_y,triSearch->N_z);
glVertex3f(triSearch->vertex[0].x, triSearch->vertex[0].y,triSearch->vertex[0].z);
glVertex3f(triSearch->vertex[1].x, triSearch->vertex[1].y,triSearch->vertex[1].z);
glVertex3f(triSearch->vertex[2].x, triSearch->vertex[2].y,triSearch->vertex[2].z);
glEnd(); // 三角形绘制结束
triSearch=triSearch->next_tri;
}
SwapBuffers(dc.GetSafeHdc()); // 交换缓冲区
}
break;
}

return TRUE;

作者: fantasy2700   发布时间: 2011-12-11

已经搞定了 结贴

作者: fantasy2700   发布时间: 2011-12-12

额,解决了

作者: shn521   发布时间: 2011-12-12

怎么搞定的,分享下,是用glEdgeFlag, glEdgeFlagv吗?

作者: yayafu   发布时间: 2011-12-12