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;
	else
		sceneRot[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 here
	RenderScene();
}

RenderScene() 主要调用Draw3ds();

此时对象已经读入列表;

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

triList的drawGL()实现如下,

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

    }

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium&#xff1f; 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、什么是Selenium&#xff1f; …

坐标系变换的坑

坐标系变换的坑 坐标系变换本来是很简单的事情&#xff0c;公式也很简单。但是卡了我很多天&#xff0c;原因是&#xff1a;两个坐标系的位姿&#xff0c;虽然都是右手系&#xff0c;但我的在顺时针旋转是yaw角是递增的&#xff0c;同事发给我的却是逆时针递减的。 理论上很简…

使用openvpn docker及frp docker工具构建虚拟专业网络(V-P-N)

使用openvpn docker及frp docker工具构建虚拟专业网络(V-P-N) 借助Docker和OpenVPN技术&#xff0c;您可以在短时间内设置并运行VPN服务器&#xff0c;并保证您的服务器安全。 运行环境 Ubuntu 16.04 TLS Docker version 19.03.8, build afacb8b7f0 OpenVPN Android Client …

zabbix-server监控mysql数据库及httpd服务、监控apache、监控ftp

目录 一、监控mysql数据库及httpd服务 1、为server.Zabbix.com添加服务模板 2、server.zabbix.com服务端 操作 3、编辑chk_mysql.sh脚本 4、server.zabbix.com测试 二、监控apache 1、获取键值 2、服务器操作 3、zabbix监控web端导入监控模板 4、server.zabbix.com添加…

MediaType的常用类型-GPT问答

MediaType的常用类型-GPT问答 MediaType是一个枚举类&#xff0c;包含了常见的媒体类型。下面是一些常用的MediaType类型&#xff1a; APPLICATION_JSON&#xff1a;JSON格式的数据APPLICATION_XML&#xff1a;XML格式的数据APPLICATION_FORM_URLENCODED&#xff1a;表单格式的…

Baichuan-13B 介绍及微调

文章目录 Baichuan-13B介绍Baichuan-13B特点Baichuan-13B效果Baichuan-13B模型参数 推理和部署模型下载模型推理 微调和部署下载仓库配置环境微调数据微调过程 Baichuan-13B介绍 2023年7月11日&#xff0c;百川智能发布Baichuan-13B&#xff01; github地址&#xff1a;https:…

【启发式算法】灰狼优化算法【附python实现代码】

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

【产品经理】小型团队通用工作流程SOP方案

&#xff1a;所谓SOP&#xff0c;即标准作业程序&#xff0c;指将某一事件的标准操作步骤和要求以统一的格式描述出来&#xff0c;用于指导和规范日常的工作。实际执行过程中sop核心是符合本企业并可执行&#xff0c;不流于形式。 一、跨部门工作流程 跨部门流程及职能如下图展…

6.3.5 利用Wireshark进行协议分析(五)----捕获并分析ICMP报文

6.3.5 利用Wireshark进行协议分析&#xff08;五&#xff09;----捕获并分析ICMP报文 一、捕获ICMP报文 打开Wireshark&#xff0c;选择网络接口并点击开始按钮。分组列表面板不断刷新抓渠道的数据包&#xff0c;为了过滤出我们所要分析的ICMP报文&#xff0c;我们在过滤框中输…

点大商城V2_2.5.0 全开源版 商家自营+多商户入驻 百度+支付宝+QQ+头条+小程序端+unipp开源前端安装测试教程

播播资源安装点大商城V2_2.5.0 全开源版测试后发现后台总体体验下来比较简洁&#xff0c;营销功能还是挺多该有的都有了&#xff0c;相比上一版优化很多细节。首页和会员中心均支持DIY装修&#xff0c;底部菜单也一样&#xff0c;安装测试中目前未发现BUG&#xff0c;小程序整体…

macOS 怎么安装redis数据库

1 访问redis数据库下载网址 http://download.redis.io/releases/ 访问上述的redis下载的网址&#xff0c;确定你想要的版本 然后下载即可 &#xff08;我选则的是6.2.6&#xff09; 然后下载 下载后 把这个文件解压&#xff0c;放在自己想要放在的位置 2 打开终端 输入对应的…

1770_VirtualBox下安装Debian

全部学习汇总&#xff1a; GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 作为我自己的日常使用&#xff0c;Debian基本上没有出现过。最多是让它运行在某个设备上作为一个服务的平台&#xff0c;因为很多东西我懒得去配置。 Debia…

mysql中的Innodb_buffer_pool_reads和Innodb_buffer_pool_read_requests

Innodb_buffer_pool_reads和Innodb_buffer_pool_read_requests是什么&#xff1f; mysql服务器维护了很多状态变量&#xff08;status variables),这些变量提供了其相关操作的信息。 我们可以通过SHOW [GLOBAL | SESSION] STATUS 查看这些变量以及变量值。这些变量有很多&…

Linux--获取最近一次的进程退出码:echo $?

举例&#xff1a; #include <stdio.h> int main() { printf("hello world,pid: %d,ppid: %…

面试题:redis是单线程、StringBuffer是线程安全的

1、说明String 和StringBuffer的区别 类底层/ 可变&#xff1f;线程安全Stringfinal char[] 不可变是StringBuffer char[] 可变 是&#xff08;synchronized方法&#xff09;StringBuilder char[] 可变否 (4条消息) Java基础&#xff1a;String、StringBuffer、…

Linux 漏洞扫描

Linux 漏洞扫描程序会仔细检查基于 Linux 的系统&#xff0c;以减轻潜在的风险和漏洞。 什么是 Linux 漏洞扫描程序 Linux 漏洞扫描程序是一种专门的漏洞扫描工具&#xff0c;旨在识别基于 Linux 的系统中的安全漏洞和弱点,它会扫描配置错误、过时的软件版本和已知漏洞。 为…

TypeScript 学习笔记 环境安装-类型注解-语法细节-类-接口-泛型

文章目录 TypeScript 学习笔记概述TypeScript 开发环境搭建 类型注解类型推断 数据类型JS的7个原始类型Array数组object、Object 和 {}可选属性 ? 和 可选链运算符?. function函数TS类型: any类型 | unknow类型TS类型: void类型TS类型&#xff1a;never类型 &#xff08;几乎…

SQL 删除重复的电子邮箱

196 删除重复的电子邮箱 SQL架构 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id是该表的主键列。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 删除 所有重复的电…

深入学习 Redis - 深挖经典数据类型之 string

目录 前言 一、string 类型 1.1、操作命令 set / get &#xff08;设置 / 获取&#xff09; mset / mget&#xff08;批量 > 设置 / 获取&#xff09; setnx / setex / psetex &#xff08;设置时指定不同方式&#xff09; incr / incrby / decr / decrby/ incrbyfloat…

深度学习——CNN卷积神经网络

基本概念 概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习中常用于处理具有网格结构数据的神经网络模型。它在计算机视觉领域广泛应用于图像分类、目标检测、图像生成等任务。 核心思想 CNN 的核心思想是通过利用局部…