OpenGL MD2模型显示

使用OpenGL加载和显示3D模型文件(MD2类型) 具体实现过程包括MD2模型文件读取、顶点数组和纹理数组存储、关键帧动画实现和MD2模型渲染等步骤。通过这些步骤的实现,读者可以掌握在OpenGL中加载和显示3D模型文件的基本方法,为之后的3D图形学学习打下坚实的基础。MD2Loader的使用方法非常简单,只需要提供模型文件的路径,即可返回一个包含网格数据和纹理坐标数据的结构体Md2Model。然后,将MD2模型的网格数据和纹理坐标数据转换成顶点数组和纹理数组,并存储到OpenGL的缓冲区中。使用OpenGL中的顶点数组和纹理数组来存储网格和纹理数据。 阅读详情

 发文章也慢了。3D果然比2D复杂些。

MD2是一系列“帧”组成的动画模型。读取模型的文件包括md2.h,md2.cpp。此外,纹理贴图也被封装成类class Texture,相关文件包括texture.h,texture.lib。md2.cpp代码量有900多行。没必要贴出来。为了读取和显示模型,作者封装了一个类class anmobj。
使用的相关函数:
md2_readModel 读取模型
md2_getAnimationCount 读取动作数量
md2_getAnimationFrames 读取指定动作的起始帧,结束帧
测试时没有正确显示贴图,类Texture没有源文件,也无法调试。我用下面这个函数指定贴图也可以。
void mytexture(UINT textur)
{
 glBindTexture  (GL_TEXTURE_2D, textur);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
再看class anmobj。重要的是md2模型的动画信息,即每个动作的动作名称,起始帧和结束帧。这个类封装了10个士兵的帧数据,坐标数据。条条大路通罗马,这些数据也可以放到其他地方。简化后的anmobj类,如下:
//动作
struct animation
{
 char name[16]; //动作名称
 int  start; //动作起始帧 
 int  end; //动作结束帧 
};
//md2接口
class anmobj
{
public:
 md2_model_t* model[2]; //两个MD2模型
 animation* anim[2]; //各个模型的动画数据
 int  size[2]; //动作数量
 
 //初始化模型
 void   getobj(CString na);
 //读取模型的动画信息
 animation*  animations (md2_model_t* model,int p);
 //绘制模型
 //入参 ID 坐标 帧
 void drawModel(int id,float x,float y,float z,int iframe);

};

void anmobj::getobj(CString na)//
{
 anim[0]=anim[1]=NULL; 
 
 if(model[0]!=NULL)
 {
  delete[] model[0];
  model[0]=NULL;
 }
 
 if(model[1]!=NULL)
 {
  delete[] model[1];
  model[1]=NULL;
 }
 
 model[0]   = md2_readModel(na+"tris.md2");
 
 model[1]   = md2_readModel(na+"weapon.md2");
 

 if(model[0]!=NULL)
 {
  size[0] = md2_getAnimationCount(model[0]);
  // 获取动作序列
  animations (model[0],0);//
 }

 if(model[1]!=NULL)
 {
  size[1] = md2_getAnimationCount(model[1]);
  animations (model[1],1);
 }


}

animation* anmobj::animations (md2_model_t* model,int p)
{ 
 if (size[p] == 0)
  return 0;//

 if(anim[p]!=NULL)
  delete[] anim[p];//
 
 anim[p] = new animation[size[p]];//
 //设置该模型的所有动画信息
 for (int i=0; i<size[p]; i++)//
 {
  //得到动画名称
  strcpy (anim[p][i].name,md2_getAnimationName(model,i));//
  //得到动画起始结束帧
  md2_getAnimationFrames(model,i,&anim[p][i].start,&anim[p][i].end);//

 }
 return 0;//
}

//不包含贴图代码
void anmobj::drawModel(int id,float x,float y,float z,int iframe)
{
 glPushAttrib(GL_CURRENT_BIT);
 glPushMatrix();

 glTranslatef(x,y,z);
 //旋转
 glRotatef(-180,0,1,0);
 //缩小
 glScaled(.06f,.06f,.06f);

 //role
 if(model[0]!=NULL && model[0]->header.numFrames>iframe)
 {
  md2_drawModel (model[0],iframe,0,0);
 }
 //weapon
 if(model[1]!=NULL && model[1]->header.numFrames>iframe)
 { 
  md2_drawModel (model[1],iframe,0,0);
 }

 glPopMatrix();
 glPopAttrib();
}

以下是士兵模型的动画数据:
[动作名称 起始帧 结束帧]
stand : 0 , 39
run : 40 , 45
attak : 46 , 53
pain1 : 54 , 57
pain2 : 58 , 61
pain3 : 62 , 65
jump : 66 , 71
......
death1 : 178 , 183
death2 : 184 , 189
death3 : 190 , 197
这些数据可以通过打印anim[0]得到,也可以通过anim[1]看到武器模型的帧信息,如下:
stand : 0 , 39
run : 40 , 45
attak : 46 , 53
pain1 : 54 , 57
pain2 : 58 , 61
......
注意,武器只有173帧(0至172)。

 

感谢《学OPENGL编3D游戏》课件(来自www.gameres.com)

 

 

opengl加载显示3D模型3d类型文件 opengl加载显示3d模型UC类型文件前置条件项目展示项目完整C++源代码 前置条件 opengl三方库freeglut,显示3d格式的三维模型文件, 项目展示 项目完整C++源代码 #include <stdlib.h> #include <stdio.h> #ifdef __APPLE__ #include <freeglut.h> #else #include <GL/freeglut.h> #endif #define COMMAND_USAGE 阅读详情

相关推荐

opengl加载显示3D模型md2类型文件

opengl加载显示md2模型UC类型文件前置条件注意事项项目展示项目完整C++源代码 前置条件 opengl三方库freeglut,显示md2格式的三维模型文件 注意事项 源代码 model_file = “C:/Users/Administrator/Desktop/models/Md2/1.md2”;需要改为你自己的模型路径 项目展示 项目完整C++源代码 #include <stdlib.h> #include <stdio.h> #ifdef __APPLE__ #inc

希望我的博客,能帮上你解决学习中工作中所遇到的问题 647

MD2 文件读取

MD2 文件是3D关键帧动画文件。 任何文件都有自己的格式,MD2也有自己组织数据的格式,要想正确读取MD2中大量的数据,首先弄清楚文件的格式,MD2文件分为两部分,①文件头 ②文件数据。 文件头部分描述了MD2 文件的基本信息 文件数据部分才是真正数据源。 格式如下(做了部分注释):文件头: Offset Data type Name Description 0 int

chenhittler的专栏 1763

OpenGL:实现加载显示3D模型MD2类型文件(附完整源码)

OpenGL:实现加载显示3D模型MD2类型文件(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 359

【摘录】读取MD2模型文件源码

1///////////////////////////////////////MD2.H//////////////////////////////////////////////////2#ifndef_MD2_H3#define_MD2_H45//Thesearetheneededdefinesforthemaxvalueswhe...

weixin_30244889的博客 183

OpenGL加载和显示3D模型(MD2类型文件)- C/C++实现

MD2是一种简单的三角网格模型文件格式,用于存储3D模型数据。我们将使用OpenGL的固定功能管线(Fixed Function Pipeline)来实现模型加载和渲染。在本文中,我们将学习如何使用OpenGL和C/C++编程语言加载和显示3D模型,特别是MD2(Quake II模型)类型的文件。我们将使用OpenGL进行图形渲染,并使用C/C++编写相关的代码。

HqsHack的博客 338

OpenGL 使用Md2模型制作的角色扮演游戏

OpenGL 编程语言:c++ 介绍:使用Md2模型制作的角色扮演游戏,老师布置的最后一个大作业

MD2模型結構解釋

哈... 最近正着手进行Android 3D游戏... 有些心得会陆续在后面陆续与大家分享..... 首先看看構成MD2的幾種基本結構typedef struct {float X,Y,Z;}tVector;這個相信不用多說,凡是3D遊戲編程必然會有的一個結構--矢量;typedef struct{float U;float V;}tTexCoord;typedef str

wukunting的专栏 1987

辛苦找来的大量md2模型

辛苦找来的大量md2模型 辛苦找来的大量md2模型

Android用OpenGL ES显示MD2模型

原文:http://blog.sina.com.cn/s/blog_4a0a39c30100auh6.html Android的SDK老是升级,m3 -> m5 -> 0.9->1.0,看着都怕,最主要的是TMD有些代码还不能兼容,还得重新看ApiDemos,照着demo改才行。 本来AndroidGL(http://code.google.com/p/android-

1714

19个MD2的3D人物模型

之前收集的19个MD2模型,每个模型不仅只有一种纹理。 每个模型的武器也包含在里边了,

网上收集来的一堆MD2模型

网上收集来的一堆MD2模型,基本上来自于QUAKE3.亲测可用!!!

<<游戏是这样写成的>>(OpenGL ES,Objc++,MD2模型显示,粒子系统)

>(OpenGL ES,Objc++,MD2模型显示,粒子系统) 2010年06月08日   dr_watson 之

hrp091pt 162

md2模型下载md2模型下载md2模型下载

md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载md2模型下载

遊戲是這樣寫成的 (第五篇: MD2模型顯示)

遊戲是這樣寫成的 (第五篇: MD2模型顯示) Seven 同學在論譠討論怎樣顯示MD2, 正好我以前在PSP 上有個MD2的類,我把它移植了過來,給大家參考一下或拿來玩玩。在Wrapper 里,我也加了兩個新功能,一個是 Enable2D(),一個是 Enable...

weixin_30869099的博客 90

基于CNN网络的轴承故障诊断

内容参考:《基于卷积神经网络的轴承故障 诊断算法研究》–张伟 代码参考: https://github.com/AaronCosmos/wdcnn_bearning_fault_diagnosis 1 背景: 基于信号处理的特征提取+分类器的传统智能诊断算法,对专家经验要求高,设计耗时且不能保证通用性,已经不能满足机械大数据的要求。提出使用基于卷积神经网络智能诊断算法来自动完成特征提取以及故障识别。 1.1 挑战 机电产品故障诊断面临的挑战,有三大特点: (1)数据量大,专业分析人员的数量严重不足,仅依靠人

weixin_45679938的博客 7万+

Windows C语言编程:Beep API实现蜂鸣器原理与实战

如果你在 Windows 上写过 C 语言程序,想给程序加个简单的提示音,第一个想到的可能是 printf("\a") 。这个转义字符确实能在某些终端里发出“嘀”的一声,但它太原始、太不可控了,而且很多时候根本没声音。那么,有没有一种更“Windows”、更可控、更专业的方法来让你的程序“说话”呢? 答案是肯定的,而且它比你想象的要强大和复杂。Windows 提供了一个名为 Beep 的 API 函数,专门用于生成蜂鸣声。你可能觉得这功能太简单,甚至有点过时——不就是让电脑“哔”一声吗?但恰恰是这个看似简单

weixin_34109408的博客 395

《OpenGL游戏编程》学习笔记(二)

第4章 Opengl光照、材质和纹理 对于这章,我学得很马虎,只针对性地学了一些纹理相关的知识。本章着重的应该是纹理以及多重纹理的映射。 第5章 Opengl字体 作者为我们有封装了一个对象,使我们可以在opengl里显示文字。 第6章 摄像漫游 这章对于数学基础不扎实的我来说,也是一个不小的挑战。各种几何向量的点积叉积就让我转晕了。然而,最后出来的效果也是让我眼睛一亮,几个月前,我还只

仰望圣光的plusplus7 1429

ESD 防护深度解析:模型、等级、系统设计与防护策略

本文系统阐述了静电放电(ESD)防护的核心技术体系。首先对比分析了HBM(人体模型)和CDM(充电设备模型)两种基础ESD模型的物理特性、测试标准及分级要求,指出相同电压下CDM的破坏性是HBM的15-20倍。其次详细解析了IEC61000-4-2系统级ESD标准,包括接触/空气放电测试方法及判定等级。重点提出了系统级防护的三层架构:空间隔离(≥10mm间距)、电气隔离(地平面分割)和TVS管选型(响应时间<1ns),并对比了MOV、SCR等防护器件特性。针对不同应用场景(消费电子、工业控制等)给出了差异化

bother3000的博客 1882

Android3D编程之导入3dsMd2模型

提要 3d模型的导入是游戏开发中比较基础的部分了,这里通过jpct这个游戏引擎来加载的,实现起来比较简单。 jpct简介 jPCT是一款基于OpenGL技术开发的3D图形引擎(PC环境为标准OpenGL,Android为OpenGL ES), 以Java语言为基础的,拥有功能强大的Java 3D解决方案。该引擎与LGame(此为2D游戏引擎)相类似,目前拥有PC(J2SE)以及And

爱冒险的技术宅 4668

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

图像相似度的评价指标 : FID(Fréchet Inception Distance)

FID(Fréchet Inception Distance) 是用来计算真实图像与生成图像的特征向量间距离的一种度量。如果FID值越小,则相似程度越高。最好情况即是FID=0,两个图像相同。 实际计算: 参考链接:https://machinelearningmastery.com/how-to-implement-the-frechet-inception-distance-fid-from-scratch/ # example of calculating the frechet inceptio

weixin_43723625的博客 1万+
上一篇: OpenGL 3ds模型显示
下一篇: OpenGL MDL模型显示
programking
博客等级 码龄23年 450粉丝 140原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值