软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 架构设计 -> Opengl教程之读取obj并绘制在picturecontrol控件内 -> 正文阅读

[架构设计]Opengl教程之读取obj并绘制在picturecontrol控件内


Opengl教程之读取obj并绘制在picturecontrol控件内
By Cracent
注:本文将简单图文表述基于MFC对话框的OpenGL三维显示(picture control 类版)以及obj文件读取绘制
目录
一、 配置相应环境
二、 建立CMyStatic类
2.1 添加类
2.2 类向导
2.2.1添加消息处理函数OnTimer()
2.2.2 重写虚函数PreSubclassWindow()
2.3 添加其他函数与变量
三、 OpenGl使用
3.1函数内容
3.2插入picture control控件, 并为其添加控制变量
3.3绘制简单函数
四、 obj文件读取并绘制
4.1 添加并配置glm.h glm.c
4.2添加函数:ObjRead();和LightShine()
一、 配置相应环境
 
[img]http://img.blog.csdn.net/20160402191320706?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
二、 建立CMyStatic类
2.1 添加类
 [img]http://img.blog.csdn.net/20160402191346347?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
建立C++类;
 [img]http://img.blog.csdn.net/20160402191357362?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
2.2 类向导
2.2.1添加消息处理函数OnTimer()
 [img]http://img.blog.csdn.net/20160402191411331?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
2.2.2 重写虚函数PreSubclassWindow()
 [img]http://img.blog.csdn.net/20160402191425456?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
2.3 添加其他函数与变量
void GLDraw();//Opengl绘制
bool InitGL();//Opengl初始化
HGLRC hglrc;
HDC hdc;
三、 OpenGl使用
3.1函数内容
#include <GL\glu.h>
bool CMyStatic::InitGL(void)
{
static PIXELFORMATDESCRIPTOR pfd = 
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24 ,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32 ,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
int pixelformat;
hdc = ::GetDC(this->GetSafeHwnd());
if (!(pixelformat = ChoosePixelFormat(hdc , &pfd)))
{
MessageBox("ChoosePixelFormat failed!");
return false;
}
if (!SetPixelFormat(hdc , pixelformat , &pfd))
{
MessageBox("SetPixelFormat failed!");
return false;
}
if (!(hglrc = wglCreateContext(hdc)))
{
MessageBox("CreateContext failed!");
return false;
}
if (!wglMakeCurrent(hdc , hglrc))
{
MessageBox("MakeCurrent failed!");
return false;
}
CRect rect; //在这个矩形中画图
GetClientRect(rect);
glViewport(0 , 0 , rect.Width() , rect.Height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/*gluPerspective(45.0f , rect.Width()/rect.Height() , 0.1f , 100.0f);// 计算窗口的外观比例*/
gluPerspective(45.0f , 640/480 , 0.1f , 100.0f);// 计算窗口的外观比例
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f , 0.0f , 0.0f , 1.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
SetTimer(1 , 50 , NULL); 
return true;
}
void CMyStatic::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
DrawFunc();   //定时器中调用这个函数
CStatic::OnTimer(nIDEvent);
}
void CMyStatic::PreSubclassWindow() 
{
// TODO: Add your specialized code here and/or call the base class
InitGL();
CStatic::PreSubclassWindow();
}
若出现此种情况:
 [img]http://img.blog.csdn.net/20160402191506410?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
如此设置:
 [img]http://img.blog.csdn.net/20160402191529988?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
3.2插入picture control控件, 并为其添加控制变量
 
 [img]http://img.blog.csdn.net/20160402191540379?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://img.blog.csdn.net/20160402191622676?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
3.3绘制简单函数
void CMyStatic::GLDraw(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(-0.0f , 0.0f , -10.0f);

static int RotateDegTriangle =1;
glRotatef(RotateDegTriangle++ , 0.0f , 1.0f , 0.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f , 0.0f , 0.0f);
glVertex3f(0.0f , 2.0f , 0.0f);
glColor3f(0.0f , 1.0f , 0.0f);
glVertex3f(-1.0f , 0.0f , 1.0f);
glColor3f(0.0f , 0.0f , 1.0f);
glVertex3f(1.0f , 0.0f , 1.0f );

glColor3f(1.0f , 0.0f , 0.0f);
glVertex3f(0.0f , 2.0f , 0.0f);
glColor3f(0.0f , 0.0f , 1.0f);
glVertex3f(1.0f , 0.0f , 1.0f);
glColor3f(0.0f , 1.0f , 0.0f);
glVertex3f(1.0f , 0.0f , -1.0f );

glColor3f(1.0f , 0.0f , 0.0f);
glVertex3f(0.0f , 2.0f , 0.0f);
glColor3f(0.0f , 1.0f , 0.0f);
glVertex3f(1.0f , 0.0f , -1.0f);
glColor3f(0.0f , 0.0f , 1.0f);
glVertex3f(-1.0f , 0.0f , -1.0f );

glColor3f(1.0f , 0.0f , 0.0f);
glVertex3f(0.0f , 2.0f , 0.0f);
glColor3f(0.0f , 0.0f , 1.0f);
glVertex3f(-1.0f , 0.0f , -1.0f);
glColor3f(0.0f , 1.0f , 0.0f);
glVertex3f(-1.0f , 0.0f , 1.0f );

glEnd();
#ifdef TWO_OBJS
glLoadIdentity();
glTranslatef(5.0f , 0.0f , -15.0f);

RotateDegQuad += 3.0f;
glRotatef(RotateDegQuad , 1.0f , 1.0f , 0.0f) ;
glBegin(GL_QUADS);
glColor3f(1.0f , 1.0f , 0.0f);
glVertex3f(-1.0f , 1.0f , 0.0f);
glVertex3f(-1.0f , -1.0f , 0.0f);
glVertex3f(1.0f , -1.0f , 0.0f);
glVertex3f(1.0f , 1.0f , 0.0f);
glEnd();
#endif
SwapBuffers(hdc); //利用双缓冲
}
F5后,可以看到如下画面
一个旋转的彩色立体正四面体
 [img]http://img.blog.csdn.net/20160402191603457?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
四、 obj文件读取并绘制
4.1 添加并配置glm.h glm.c
 
 [img]http://img.blog.csdn.net/20160402191634769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://img.blog.csdn.net/20160402191745411?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
若glm.cpp没有#include "stdafx.h",必须在最开头加上
CMyStatic.cpp添加库头
#include "glm.h"
4.2添加函数:ObjRead();和LightShine()
void CMyStatic::ObjRead(void)
{
GLfloat scalefactor = 0.0;
float modelCenter[] = {0.0f, 0.0f, 0.0f};
//GLMmodel *object1;
object1 = glmReadOBJ("Model/moto.obj");
if(!scalefactor)
{
scalefactor = glmUnitize(object1,modelCenter);
}
else
{
glmScale(object1,scalefactor);
}
glmScale(object1,1.5);
glmFacetNormals(object1);
glmVertexNormals(object1,90.0);
}
void CMyStatic::LightShine(void)
{
GLfloat mat_diffuse[4]={1,0.5,0.5,1.0};
GLfloat mat_specular[4]={1.0,1.0,1.0,1.0};
GLfloat mat_shininess[1]={100.0};
//光源 1
GLfloat light_position0[4]={0,500,500,0};
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0,GL_POSITION,light_position0);
glEnable(GL_LIGHT0);
//光源 2   
GLfloat light_position1[4]={1000,-1000,1000,0};
GLfloat mat_diffuse1[4]={0.5,0.5,1.0,1.0};
glLightfv(GL_LIGHT1,GL_DIFFUSE,mat_diffuse1);
glLightfv(GL_LIGHT1,GL_SPECULAR,mat_specular);
glLightfv(GL_LIGHT1,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT1,GL_POSITION,light_position1);
glEnable(GL_LIGHT1);
//使模型能接受光照
glEnable(GL_LIGHTING); 
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
//计算定点法线
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
}
修改GLDraw()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_POINT_SMOOTH);
glEnable(GL_DEPTH_TEST);
LightShine(); 
glTranslatef(0.0f,0.0f,-5.0f);
static float step = 0.0;
step = step + 1.0;
if (step > 360.0)
step = step - 360.0;
glPushMatrix();
glRotatef(-45,1.0,0.0,0.0);
//glRotatef(step,0.0,1.0,0.0);
glRotatef(step,0.0,0.0,1.0);

if ( object1 )
{
glmDraw(object1, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE );
}
glPopMatrix();
SwapBuffers(hdc);
添加OBJ文件:
 [img]http://img.blog.csdn.net/20160402191656535?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
F5运行程序
如出现此种情况:
 [img]http://img.blog.csdn.net/20160402191759254?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
如此处理即可:
[img]http://img.blog.csdn.net/20160402191815129?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
处理后F5可看到如下:
 
[img]http://img.blog.csdn.net/20160402191826817?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
OK,我们的第一个Obj模型成功读入
原创作品,转载请联系博主。
......显示全文...
    点击查看全文


上一篇文章           查看所有文章
2016-04-04 00:13:37  
架构设计 最新文章
Opengl教程之读取obj并绘制在picturecontro
读《企业应用架构模式》第五章并发
StepbyStepintoSpring(IOC)
设计模式(2)用例图之一
使用实体组件系统(ECS)开发”吃方块”游戏实
编程学习之简单工厂模式与策略模式
Invalidprojectdescription.
基于Redis实现分布式消息队列(2)
《开源框架那点事儿15》:借船下海还是造船
原型模式——浅复制和深复制
360图书馆 论文大全 母婴/育儿 软件开发资料 网页快照 文字转语音 购物精选 软件 美食菜谱 新闻中心 电影下载 小游戏 Chinese Culture
生肖星座解梦 人民的名义 人民的名义在线看 三沣玩客 拍拍 视频 开发 Android开发 站长 古典小说 网文精选 搜图网 天下美图
中国文化英文 多播视频 装修知识库
2017-7-22 4:48:19
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --