MFC加载3ds模型初步

网上下一个资源,名为 OpenGL三维场景绘制.rar;

看一下它是用MFC和opengl,自己绘制三维场景;

运行一下,有一个exe可以运行;

有一个较新版本的不能运行;这应是缺少VC++运行库;

 

下面单独用VC6重新做了看一下;

新建一个单文档工程;

 

    把额外的五个头文件,3个cpp文件加进来;

主要的代码是在C3dsReader里,逐类型处理3D模型的对象;

CTriObject和CTriList是处理3ds文件里对象的,这里的list并不是一个通用的list;主要是这三个类加载3ds文件;

C3dsReader结构如下,

把View类成员定义加一下;绘制坐标的不要,DrawAxis(); 

 

主要的View类成员函数加上;

/
//	                  设置逻辑调色板
//
void CMy3dstestView::SetLogicalPalette(void)
{struct{WORD Version;WORD NumberOfEntries;PALETTEENTRY aEntries[256];} logicalPalette = { 0x300, 256 };BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};BYTE blues[] = {0, 85, 170, 255};for (int colorNum=0; colorNum<256; ++colorNum){logicalPalette.aEntries[colorNum].peRed =reds[colorNum & 0x07];logicalPalette.aEntries[colorNum].peGreen =greens[(colorNum >> 0x03) & 0x07];logicalPalette.aEntries[colorNum].peBlue =blues[(colorNum >> 0x06) & 0x03];logicalPalette.aEntries[colorNum].peFlags = 0;}m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
}//
//						初始化openGL场景
//
BOOL CMy3dstestView::InitializeOpenGL(CDC* pDC)
{m_pDC = pDC;SetupPixelFormat();//生成绘制描述表m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());//置当前绘制描述表::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);return TRUE;
}//
//						设置像素格式
//
BOOL CMy3dstestView::SetupPixelFormat()
{PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小 1,                                // 版本号 PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图 PFD_SUPPORT_OPENGL |              // 支持 OpenGL PFD_DOUBLEBUFFER,                 // 双缓存模式 PFD_TYPE_RGBA,                    // RGBA 颜色模式 24,                               // 24 位颜色深度 0, 0, 0, 0, 0, 0,                 // 忽略颜色位 0,                                // 没有非透明度缓存 0,                                // 忽略移位位 0,                                // 无累加缓存 0, 0, 0, 0,                       // 忽略累加位 32,                               // 32 位深度缓存     0,                                // 无模板缓存 0,                                // 无辅助缓存 PFD_MAIN_PLANE,                   // 主层 0,                                // 保留 0, 0, 0                           // 忽略层,可见性和损毁掩模 }; 	int pixelformat;pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd);	//设置像素格式if(pfd.dwFlags & PFD_NEED_PALETTE)SetLogicalPalette();	//设置逻辑调色板return TRUE;
}//
//						场景绘制与渲染
//
BOOL CMy3dstestView::RenderScene() 
{::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );::glMatrixMode(GL_MODELVIEW);::glLoadIdentity();::glTranslatef( camPos[0], camPos[1], camPos[2] );::glRotatef( camRot[0], 1.0F, 0.0F, 0.0F );::glRotatef( camRot[1], 0.0F, 1.0F, 0.0F );::glRotatef( camRot[2], 0.0F, 0.0F, 1.0F );::glPushMatrix();::glTranslatef(scenePos[0], scenePos[1], scenePos[2]);::glRotatef( sceneRot[0], 1.0F, 0.0F, 0.0F );::glRotatef( sceneRot[1], 0.0F, 1.0F, 0.0F );::glRotatef( sceneRot[2], 0.0F, 0.0F, 1.0F );//DrawAxis();Draw3ds();::glPopMatrix();::SwapBuffers(m_pDC->GetSafeHdc());		//交互缓冲区return TRUE;
}//
//							Draw3ds()
//
void CMy3dstestView::Draw3ds()
{if (m_3dsLoaded) {//AfxMessageBox("开始绘制!!!");m_triList.drawGL();}
}void CMy3dstestView::Init(GLvoid)
{m_3dsLoaded  = FALSE;camPos[0]	 = 0.0f;camPos[1]	 = 0.0f;camPos[2]	 = -500.0f;camRot[0]	 = 20.0f;camRot[1]	 = -20.0f;camRot[2]	 = 0.0f;scenePos[0]	 = 0.0f;scenePos[1]	 = 0.0f;scenePos[2]	 = 0.0f;sceneRot[0]	 = 0.0f;sceneRot[1]	 = 0.0f;sceneRot[2]	 = 0.0f;mouseprevpoint.x = 0;mouseprevpoint.y = 0;mouserightdown = FALSE;mouseleftdown = FALSE;m_triList.Init();::glShadeModel(GL_FLAT);::glClearColor(0.0F, 0.0F, 0.0F, 0.0F);::glClearDepth(1.0F);::glEnable(GL_DEPTH_TEST);::glEnable(GL_CULL_FACE);GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f};GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f};GLfloat lightPos[]     = {6000.0f,6000.0f,6000.0f, 1.0f};glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_POSITION, lightPos);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);}void CMy3dstestView::SetCamPos(int axis, int value, BOOL increment, BOOL apply)
{if(increment){camPos[axis] += (float)value*camPos[axis]/100;}else{camPos[axis] = (float)value/2;}::glMatrixMode(GL_MODELVIEW);::glLoadIdentity();RenderScene();}void CMy3dstestView::SetSceneRot(int axis, int value, BOOL increment, BOOL apply)
{if(increment)sceneRot[axis] += (sceneRot[axis] >=360) ? (-360 + value/2): value/2;elsesceneRot[axis] = (sceneRot[axis] >=360) ? (-360 + value/2): value/2;RenderScene();
}BOOL CMy3dstestView::OpenFile(LPCTSTR lpszPathName)
{//AfxMessageBox("视类打开文件!!!");char* file = new char[strlen(lpszPathName)];strcpy(file, lpszPathName);	C3dsReader Loader;BOOL result;if( m_triList.getNumObjects() > 0 ) m_triList.removeAllObjects();result = Loader.Reader(file, &m_triList);if( result) {m_3dsLoaded = TRUE;m_triList.doAfterMath();}return result;}int CMy3dstestView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code here//m_pDC = new CClientDC(this);InitializeOpenGL(m_pDC);Init();	return 0;
}void CMy3dstestView::OnDestroy() 
{CView::OnDestroy();// TODO: Add your message handler code here::wglMakeCurrent(0,0);::wglDeleteContext( m_hRC);if (m_hPalette)DeleteObject(m_hPalette);if ( m_pDC ){delete m_pDC;}
}

View类的OnCreate消息处理函数需要从类向导加上; 

 

OnDestroy()也是;

 

     其他鼠标的,窗口改变大小的处理,定时器的,先不要;在OnCreate和OnDestroy()里是做了一些初始化和销毁工作;然后还要把gl的头文件加入stdafx.h;

    #include <gl/gl.h>
    #include <gl/glu.h>
    #include <gl/glaux.h>
    #include <gl/glut.h>

到此运行一下程序,出来一个有背景的窗口;

 

然后再看打开文件,为Doc类添加OnOpenDocument函数,

 

其实现代码只有一句如下,

    if( ((CMy3dstestApp*)AfxGetApp())->OpenFile(lpszPathName) ) return TRUE;

它去调用了App类的OpenFile函数;

把App类的OpenFile函数定义加上;

 

 App类的OpenFile函数实现,

BOOL CMy3dstestApp::OpenFile(LPCTSTR lpszPathName)
{
    return ((CMy3dstestView*)((CFrameWnd*)m_pMainWnd)->GetActiveView())->OpenFile(lpszPathName);
}

    这样最终会调用到View类的OpenFile函数;

是在View类OnDraw里面调用RenderScene来渲染场景;

void CMy3dstestView::OnDraw(CDC* pDC)
{CMy3dstestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereRenderScene();
}

RenderScene() 主要调用Draw3ds();

此时对象已经读入列表;

Draw3ds()主要执行 m_triList.drawGL();

triList的drawGL()实现如下,

    void CTriList::drawGL()
    {
        for (int i=0; i <numobjects; i++)
        {
           objects[i]->drawGL();
        }     
        glPopMatrix();

    }

通过调用CTriObject的drawGL()来逐个绘制;

现在运行程序,打开一个文件看一下;啥也没绘制;先到这里,下回再看;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2298.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S集群搭建

K8S集群搭建 1. 基础环境 IP节点名称域名规格10.1.2.111k8s-master-1master01.k8s.io4核8G&#xff0c;50G10.1.2.112k8s-master-2master02.k8s.io4核8G&#xff0c;50G10.1.2.113k8s-cluster-endpoint&#xff0c;没有具体节点&#xff0c;只vipmaster.k8s.io10.1.2.180k8s-…

基于深度学习的高精度足球检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度足球检测识别系统可用于日常生活中或野外来检测与定位足球目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的足球目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

Unity | HDRP高清渲染管线学习笔记:材质系统Lit着色器

目录 一、Lit着色器 1. Surface Options 2. Surface Inputs&#xff08;表面输入&#xff09; 3. Transparency Inputs 二、HDRP渲染优先级 目录 一、Lit着色器 1. Surface Options 2. Surface Inputs&#xff08;表面输入&#xff09; 3. Transparency Inputs 4. Em…

【C/C++】拷贝构造函数的调用 使用方法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【shell】expect命令详解:用expect实现自动化交互式操作

文章目录 一. 运用场景二. 语法说明三. 例子1. scp文件传输自动化2. ssh远程登录3. 切到root用户4. 创建ssh key5. ssh到一个节点创建用户 一. 运用场景 expect主要应用于自动化交互式操作的场景&#xff0c;借助Expect处理交互的命令&#xff0c;可以将交互过程如&#xff1a…

037:mapboxGL输入经纬度,地址坐标转换,弹出位置点地址信息

第037个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中输入经纬度,地址坐标转换,弹出位置点地址信息. 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共158行)相关API参考:专栏目标示例效果 配置方式…

LeetCode 2. 两数相加

文章目录 1. 题目描述2. 解题代码 1. 题目描述 链接&#xff1a;https://leetcode.cn/problems/add-two-numbers/ 2. 解题代码 public ListNode AddTwoNumber(ListNode l1, ListNode l2) {ListNode head new ListNode();ListNode cur head;int carry 0;while (l1 ! null…

Node.js HTTP 模块的内存泄露问题

很久没有逛社区了&#xff0c;晚上回来看了一下最近的情况&#xff0c;突然看到一个内存泄露问题&#xff0c;作为一个 APM 开发者&#xff0c;自然想分析其中的原因。 问题 下面介绍一下具体的问题。看一下 demo。 const http require(http)async function main () {let i…

企业级微服务架构实战项目--xx优选-用户登录

一 用户登录的触发页面 1.登录常量 2.登录地址 3.配置域名 4.启动程序 触发连接小程序后端的登录接口 小程序controller的登录方法

网络空间安全数学基础考试要点

网络空间安全数学基础 阶的计算不要求那个公式&#xff0c;但是Order几次方要求 考试会考原根 Legendre必考 多项式计算必考 扩域多项式计算 同态不考 域元素表示 本元多项式不考 1.整除 3 ≡ \equiv ≡ 4 mod 7不对吧3 ≡ \equiv ≡ 3 mod 74 ≡ \equiv ≡ 4 &#xff08;m…

vscode环境部署

目录 编译cpp 编译qt 借用插件 手撸&#xff08;建议&#xff0c;避免很多未知错误&#xff09; 踩过的坑 编译cpp vscode安装2个插件&#xff0c;extension pack自动包了下面3个通过命令窗口code .打开代码目录&#xff0c;或者添加cl.exe路径到path&#xff0c;以及c需…