声明:本文内容及源代码只能作为学习参考用,转载请注明本声明blog.csdn.net/t163ang。

最近为了测试我的碰撞检测代码,需要使用Opengl来导入模型及渲染出来做碰撞,之前我发表一篇文章是对斯坦福模型ply文件渲染的,ply模型资源有限,所以今天看了其它三维模型,发现Obj模型网上有丰富的资源,且表达能力更强,但解析其就相对来讲复杂一些,我看网上一些代码,不是过于简单就是过于复杂,于是自己写了一个,上网下载了几个模型效果可以。渲染调用很简单直接调用RenderObj函数即可。当然如果你要应用到你的项目中,这个代码需要稍微改一改就行罗。另外如果是四边形将会拆成两个三角形,网上好多代码都没这个功能。

#define MAXN 1024*1024
#define MAXTEX 32
map<string,size_t> ObjMp;
size_t vn,vtn,vnn,fn;
float V[MAXN][3];
float VT[MAXN][2];
float VN[MAXN][3];
size_t F[MAXN][3][3];
size_t TexFacCnt[MAXTEX],TexFacID[MAXTEX],tfn;
#pragma comment( lib, "glaux.lib")
void _InitMtl(const char *filename){ifstream in(filename);assert(in);ObjMp.clear();char buffer[300],word[300];while(in.getline(buffer,300)){if(strncmp("newmtl",buffer,strlen("newmtl"))==0){sscanf(buffer,"%*s%s",word);}else if(strncmp("map_Kd",buffer+1,strlen("map_Kd"))==0){GLuint texName;glGenTextures(1,&texName);AUX_RGBImageRec *aux = auxDIBImageLoadA(buffer+strlen("\tmap_Kd "));glBindTexture(GL_TEXTURE_2D,texName);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_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D,0,3,aux->sizeX,aux->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,aux->data);ObjMp.insert(make_pair(word,texName));delete aux;}}in.close();
}
void ReadObj(const char *filename){ifstream in(filename);assert(in);char buffer[300];vn=1;vnn=1;vtn=1;tfn=0;while(in.getline(buffer,300)){if(buffer[0] == 'v'){if(buffer[1]==' '){//vsscanf(buffer,"%*s %f %f %f",&V[vn][0],&V[vn][1],&V[vn][2]);++vn;}else if(buffer[1]=='n' && buffer[2] == ' '){//vnsscanf(buffer,"%*s %f %f %f",&VN[vnn][0],&VN[vnn][1],&VN[vnn][2]);++vnn;}else if(buffer[1]=='t' && buffer[2] == ' '){//vtsscanf(buffer,"%*s %f %f",&VT[vtn][0],&VT[vtn][1]);++vtn;}}else if(buffer[0]=='f'){//fif(buffer[1] == ' '){char str[4][32];int sn = sscanf(buffer,"%*s %s %s %s %s",str[0],str[1],str[2],str[3]);if(sn == 3){                  for(size_t i = 0; i < 3; ++i){sscanf(str[i],"%d/%d/%d",&F[fn][i][0],&F[fn][i][1],&F[fn][i][2]);}++fn;/*直接渲染,但是当模型很大时,速度将很慢glBegin(GL_TRIANGLES);{size_t iv,it,in;for(size_t i = 0; i < 3; ++i){sscanf(str[i],"%d/%d/%d",&iv,&it,&in);glNormal3fv(VN[in]);glTexCoord2fv(VT[it]);glVertex3fv(V[iv]);}}glEnd();*/}else if(sn == 4){//拆分成两个三角形,四边形0123分成Tri012和Tri023for(size_t i = 0; i < 3; ++i){sscanf(str[i],"%d/%d/%d",&F[fn][i][0],&F[fn][i][1],&F[fn][i][2]);}++fn;for(size_t i = 0; i < 3; ++i){sscanf(str[i!=0?i+1:0],"%d/%d/%d",&F[fn][i][0],&F[fn][i][1],&F[fn][i][2]);}++fn;/*glBegin(GL_TRIANGLES);{size_t iv,it,in;for(size_t i = 0; i < 3; ++i){sscanf(str[i],"%d/%d/%d",&iv,&it,&in);glNormal3fv(VN[in]);glTexCoord2fv(VT[it]);glVertex3fv(V[iv]);}for(size_t i = 0; i < 3; ++i){sscanf(str[i!=0?i+1:0],"%d/%d/%d",&iv,&it,&in);glNormal3fv(VN[in]);glTexCoord2fv(VT[it]);glVertex3fv(V[iv]);}}glEnd();*/}else{assert(false);}}}else if(buffer[0]=='m'){//mtllibif(buffer[1]=='t' && buffer[2]=='l' && buffer[3]=='l'&&buffer[4]=='i' && buffer[5] == 'b' && buffer[6] == ' '){_InitMtl(buffer+strlen("mtllib "));}}else if(buffer[0]=='u'){//usemtlif(buffer[1]=='s' && buffer[2]=='e' && buffer[3]=='m'&&buffer[4]=='t' && buffer[5] == 'l' && buffer[6] == ' '){string key = string(buffer+strlen("usemtl "));TexFacCnt[tfn]=fn;//记录信息,以后渲染使用if(ObjMp.find(key) != ObjMp.end()){//直接在读文件时渲染,处理很方便,但渲染更新速度慢//glBindTexture(GL_TEXTURE_2D,ObjMp[key]);TexFacID[tfn] = ObjMp[key];}else{//glBindTexture(GL_TEXTURE_2D,0);TexFacID[tfn] = 0;}++tfn;}}}
}void RenderObj(const char* filename){static bool firstRender = true;if(firstRender){ReadObj(filename);firstRender = false;}glBegin(GL_TRIANGLES);{for(size_t i =0,j = 0; i < fn; ++i){if(j < tfn && i == TexFacCnt[j]){glBindTexture(GL_TEXTURE_2D,TexFacID[j]);++j;}glNormal3fv(VN[F[i][0][2]]);glTexCoord2fv(VT[F[i][0][1]]);glVertex3fv(V[F[i][0][0]]);glNormal3fv(VN[F[i][1][2]]);glTexCoord2fv(VT[F[i][1][1]]);glVertex3fv(V[F[i][1][0]]);glNormal3fv(VN[F[i][2][2]]);glTexCoord2fv(VT[F[i][2][1]]);glVertex3fv(V[F[i][2][0]]);}}glEnd();
}

随便下载一个模型渲染出来效果图:

编码请看:http://www.maidoupig.cn

Opengl读取及渲染Obj三维模型相关推荐

  1. OPENGL读取OBJ模型(包围盒、法向等计算)附加源码与资源下载页面

    OPENGL读取OBJ模型 标签(空格分隔): OPENGL/C++ 哈哈,先贴出下载链接好吧.下载页面 首先大家不要害怕,读取obj模型听上去很高端很麻烦,其实当你真正了解obj模型的格式,以及OP ...

  2. android 视频播放滤镜,用openGL ES+MediaPlayer 渲染播放视频+滤镜效果

    之前曾经写过用SurfaceView,TextureView+MediaPlayer 播放视频,和 ffmpeg avi解码后SurfaceView播放视频,今天再给大家来一篇openGL ES+Me ...

  3. FCPX插件直接导入OBJ三维模型FCPX3D MODEL

    FCPX3D MODEL for Mac是一款由Pixel Film Studios公司出品的直接导入OBJ三维模型fcpx插件,FCPX3D Model插件允许Final Cut Pro X用户在F ...

  4. java opengl_java基于OpenGL ES实现渲染实例

    这篇文章主要介绍了java基于OpenGL ES实现渲染,实例分析了OpenGL渲染操作的相关技巧,需要的朋友可以参考下 本文实例讲述了java基于OpenGL ES实现渲染的方法.分享给大家供大家参 ...

  5. OpenGL 位图字体渲染的实例

    OpenGL 位图字体渲染 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <sb7.h> #include <sb7ktx.h ...

  6. OpenGL 三角形的渲染

    OpenGL 三角形的渲染 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include "GL/g ...

  7. Android OpenGL ES视频渲染(一)GLSurfaceView

    相关文章:Android OpenGL ES视频渲染(二)EGL+OpenGL Android中视频渲染有几种方式,之前的文章使用的是nativewindow(包括softwareRender).今天 ...

  8. three.js 笔记 --- 渲染图片 和 渲染obj,mtl文件

    渲染图片 let textureLoader = new THREE.TextureLoader();let textureLoaderRes = function (url) {return tex ...

  9. htmlUnit的读取js渲染的页面

    htmlUnit的读取js渲染的页面 我这边有个这么的需求,要求前端每次上版本的时候,有一个版本号.然后后端去爬前端,比较禅道的版本发布计划,如果发布计划和生产上的版本号不一致,就告警. 这个跟后端的 ...

最新文章

  1. Codeforces Round #406 (Div. 1) B. Legacy(线段树上优化建图)
  2. html设置边框dw,Dreamweaver Css边框属性
  3. JQuery弹出层,点击按钮后弹出遮罩层,有关闭按钮
  4. 万字总结webpack实战案例配置
  5. .NET Framework 如何:提高性能
  6. 如何自动导出内存映像文件?
  7. 贝叶斯之垃圾邮件分类
  8. oracle_导致实例逐出的五大问题
  9. 今天终于安装了Snippet Compiler!!!
  10. Mac上Gtk-WARNING **: cannot open display解决
  11. iPhone企业应用实例分析之三:程序框架分析
  12. mysql用alter创建外键_MySQL入门(alter语法 与 外键)
  13. 2021年全国计算机南京考点,2021考研考场安排:往年南京市考研考点及考场安排
  14. weblogic 12c 打补丁
  15. JSP水电费管理系统myeclipse开发mysql数据库web结构java编程
  16. h5 视频活体检测(人脸认证)的前端
  17. jQuery实现异形轮播图
  18. 共轭梯度法详细推导分析
  19. 策划经验分享——常用软件篇
  20. Github三天点击破亿,四天助力金九银十,精通SpringCloud微服务架构,成就大厂梦

热门文章

  1. 【锐捷交换】端口镜像配置
  2. 《炬丰科技-半导体工艺》硅片清洗条件下薄氧化物特性的研究
  3. DLNA 和如何在xp win7 搭建 DLNA服务器
  4. 【英语词组】恋恋不忘Day5-4
  5. 华章公司图书备受2010年数据库大会会员喜欢
  6. 互信息特征选择python_基于互信息的特征选择方法杂谈
  7. 一个好的企划书由哪几部分组成?
  8. 神经网络模型简介及常见的损失函数
  9. 受女性青睐网络游戏更容易成功
  10. 【渐进交互学习网络:轻量级:超分:工业应用】