软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
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 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2017年11日历
2017-11-19 16:33:51
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --