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;
对了 模型在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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28