OBJ 文件格式

OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。

 

OBJ文件特点

(1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。

(2)OBJ文件主要支持多边形(Polygons)模型。

虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。

(3)OBJ文件支持三个点以上的面,这一点很有用。     

(4)OBJ文件支持法线和贴图坐标。 在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标了。

(5)OBJ文件不支持有孔的多边形面。

(6)OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。

 

OBJ文件的前缀

OBJ文件以纯文本的形式存储了模型的顶点、法线和纹理坐标和材质使用信息。

在OBJ文件中,每行的格式如下:前缀  参数1 参数2 参数3 ...

(前缀标识了这一行所存储的信息类型。参数则是具体的数据。)

OBJ文件的前缀可以有:

v 表示本行指定一个顶点。此前缀后跟着3个单精度浮点数,分别表示该定点的X、Y、Z坐标值

vt 表示本行指定一个纹理坐标。此前缀后跟着两个单精度浮点数。分别表示此纹理坐标的U、V值

vn 表示本行指定一个法线向量。此前缀后跟着3个单精度浮点数,分别表示该法向量的X、Y、Z坐标值

f 表示本行指定一个表面(Face)。一个表面实际上就是一个三角形图元。此前缀行的参数格式后面将详细介绍。

usemtl 此前缀后只跟着一个参数。该参数指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称。该材质可以在此OBJ文件所附属的MTL文件中找到具体信息。

mtllib 此前缀后只跟着一个参数。该参数指定了此OBJ文件所使用的材质库文件(*.mtl)的文件路径

以“#”开头的表示注释的前缀,以g开头的表示组的前缀。这些前缀并不影响模型的外观,可以忽略它们。

 

建立顶点索引

假设Indices:array of Integer是顶点索引数组,Vertices:array of TVertex是顶点数组,使用下面的代码段就可以把整个顶点索引对应的所有三角形绘制出来:

procedure DrawIndex(Indices:array of Integer;Vertices:array of TVertex);

var i :Integer;

begin

   glBegin(GL_TRIANGLES);

   for i := 0 to (High(Vertices)+1) div 3 -1 do

   begin

     glVertex3fv(@Vertices[Indices[i*3]]);

     glVertex3fv(@Vertices[Indices[i*3+1]]);

     glVertex3fv(@Vertices[Indices[i*3+2]]);

   end;

   glEnd;

end;

OBJ文件为模型中所有的顶点、法线、纹理坐标都建立起相应的索引,以节省更多的空间。

面可以使用负值索引,有时用负值索引描述面更为简便。

"f -4 -3 -2 -1"这句索引值"-3"表示从"f"这行往上数第3个顶点,

 

OBJ文件的结构

在一个OBJ文件中,首先有一些以v、vt或vn前缀开头的行指定了所有的顶点、纹理坐标、法线的坐标。然后再由一些以f开头的行指定每一个三角形所对应的顶点、纹理坐标和法线的索引。在顶点、纹理坐标和法线的索引之间,使用符号“/”隔开的。一个f行可以以下面几种格式出现:

f  1 2 3

表示以第1、2、3号顶点组成一个三角形。

f  1/3 2/5 3/4

表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,第二个顶点的纹理坐标的索引值为5,第三个顶点的纹理坐标的索引值为4。

f  1/3/4 2/5/6 3/4/2

表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,其法线的索引值是4;第二个顶点的纹理坐标的索引值为5,其法线的索引值是6;第三个顶点的纹理坐标的索引值为6,其法线的索引值是2。

f  1//4 2//6 3//2

表示以第1、2、3号顶点组成一个三角形,且忽略纹理坐标。其中第一个顶点的法线的索引值是4;第二个顶点的法线的索引值是6;第三个顶点的法线的索引值是2。

注意:文件中的索引值是以1作为起点的,在渲染的时候应注意将从文件中读取的坐标值减去1。

 

OBJ文件的基本结构

点数据(Vertex data):

v 几何体顶点 (Geometric vertices)

vt 贴图坐标点 (Texture vertices)

vn 顶点法线 (Vertex normals)

vp 参数空格顶点 (Parameter space vertices)

--------------------------------------------------------

自由形态曲线(Free-form curve)/表面属性(surface attributes):

deg 度 (Degree)

bmat 基础矩阵 (Basis matrix)

step 步尺寸 (Step size)

cstype 曲线或表面类型 (Curve or surface type)

--------------------------------------------------------

元素(Elements):

p 点 (Point)

l 线 (Line)

f 面 (Face)

curv 曲线 (Curve)

curv2 2D曲线 (2D curve)

surf 表面 (Surface)

--------------------------------------------------------

自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):

parm 参数值 (Parameter values )

trim 外部修剪循环 (Outer trimming loop)

hole 内部整修循环 (Inner trimming loop)

scrv 特殊曲线 (Special curve)

sp 特殊的点 (Special point)

end 结束陈述 (End statement)

--------------------------------------------------------

自由形态表面之间的连接(Connectivity between free-form surfaces):

con 连接 (Connect)

--------------------------------------------------------

成组(Grouping):

g 组名称 (Group name)

s 光滑组 (Smoothing group)

mg 合并组 (Merging group)

o 对象名称 (Object name)

--------------------------------------------------------

显示(Display)/渲染属性(render attributes):

bevel 导角插值 (Bevel interpolation)

c_interp 颜色插值 (Color interpolation)

d_interp 溶解插值 (Dissolve interpolation)

lod 细节层次 (Level of detail)

usemtl 材质名称 (Material name)

mtllib 材质库 (Material library)

shadow_obj 投射阴影 (Shadow casting)

trace_obj 光线跟踪 (Ray tracing)

ctech 曲线近似技术 (Curve approximation technique)

stech 表面近似技术 (Surface approximation technique)

 

 

MTL文件

材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。

newmtl:定义新的材质组。对应数据为材质组名称。

Ka,Kd,Ks,Ke:材质的环境(ambient),散射(diffuse),镜面(specular),放射(emissive)参数。对应数据为r,g,b,a。

Ns:材质的光亮度(shininess)。对应一个数据。

d,Tr:均可用于定义材质的Alpha透明度。对应一个数据。

sharpness,illum:材质的锐度(sharpness)和照明度(illumination)。对应一个数据。

Ni:材质的光密度(optical density)。对应一个数据。

Tf:材质的透射滤波(transmission filter)。对应数据为r,g,b,a。(OSG中没有读取滤波文件的功能)

map_Ka,map_Kd,map_Ks:材质的环境(ambient),散射(diffuse)和镜面(specular)贴图。对应数据为贴图文件名称。

refl:材质的反射属性。OSG中没有读取其参数。


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

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

相关文章

构建Docker镜像(三)

作者:李晓辉联系方式:Xiaohui_lifoxmail.comQQ:939958092一、建立Dockerfile1、准备文件新建一个目录和一个 Dockerfilemkdir /steventouch /steven/Dockerfile2、更新Dockerfile这个步骤是在设计镜像,如果你需要在镜像内包含什么软件,将来开放哪些端口&…

centos 配置php开发环境变量配置,CentOS中配置PHP和Nginx环境变量

搜索热词一、摘要在Linux CentOS系统上 安装完PHP和Nginx后,一般需要执行查看版本命令’PHP -v’和’Nginx -v’,确认是否安装成功,如果在没有添加到环境变量之前,执行“PHP -v”命令查看当前PHP版本信息时,则会提示命令不存在的错误&#xf…

你必须很努力,才能看上去毫不费力

世上没有一件工作不辛苦,没有一处人事不复杂。 从今天起,每天微笑吧, 世上除了生死,都是小事。 不管遇到了什么烦心事,都不要自己为难自己; 无论今天发生多么糟糕的事,都不应该感到悲伤。 今天是…

HDU 4631 Sad Love Story 平面内最近点对

http://acm.hdu.edu.cn/showproblem.php?pid4631 题意: 在平面内依次加点,求每次加点后最近点对距离平方的和 因为是找平面最近点对...所以加点以后这个最短距离一定是递减的...所以最后会形成这样一个函数图像 所以我们只要从后往前依次删点即可... 15秒惊险水过...不过我最小…

c++三/五法则

如果这个类需要一个析构函数,我们几乎可以肯定它也需要一个拷贝构造函数和一个拷贝赋值运算符。 如果一个类需要拷贝构造函数,几乎可以肯定它也需要一个拷贝赋值运算符,反之亦然。 然而,无论是需要拷贝构造函数还是需要拷贝赋值运…

itoa的用法

功能&#xff1a;将任意类型的整数转换为字符串。在<stdlib.h>中与之有相反功能的函数是atoi。 用法&#xff1a;char*itoa(int value,char*string,int radix); int value 被转换的整数&#xff0c;char *string 转换后储存的字符数组&#xff0c;int radix 转换进制数…

Tomcat与Gzip与缓存

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

java竖向菜单,垂直滑动菜单

www.lanrentuku.comtd {font-size: 12px;}width"200" />height9 src"images/bit05.gif" width8alignabsMiddle> href"javascript:void(null)">文管产品 src"images/bit06.gif" width8 alignabsMiddle> href"http://w…

作为IT从业者,你是如何做好个人职业规划?

前言 写这篇文章的原因是因为你前端时间看到朋友在公众号&#xff08;Marno&#xff09;发的一篇文章《27岁程序员职业生涯的“中年危机”》有感而发&#xff0c;谈谈自己对IT从业人员的一些职业规划上的想法。本篇文章是我在坐地铁的时候在手机上码出来的&#xff0c;写的不好…

将一句话的单词进行倒置,标点符号不倒换。比如一句话:“i love you.”倒换后变为you. love i

#include <string.h> #include <stdio.h> #include <stdlib.h>//将一句话的单词进行倒置&#xff0c;标点符号不倒换。比如一句话:“i love you.”倒换后变为"you. love i" void reverse(char *str) {int i0,jstrlen(str)-1;int begin,end;char te…

JS一些实用的方法

1、首次为变量赋值时务必使用var关键字变量没有声明而直接赋值得话&#xff0c;默认会作为一个新的全局变量&#xff0c;要尽量避免使用全局变量。2、使用取代和!操作符会在需要的情况下自动转换数据类型。但和!不会&#xff0c;它们会同时比较值和数据类型&#xff0c;这也使得…

[转]第一章 Windows Shell是什么 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987862】...

一个操作系统外壳的不错的定义是它是一个系统提供的用户界面&#xff0c;它允许用户执行公共的任务&#xff0c;如访问文件系统&#xff0c;导出执行程序&#xff0c;改变系统设置等。MS-DOS有一个Command.COM扮演着这个角色。然而Windows已经有了图形界面环境&#xff0c;他的…

20155222卢梓杰 《Java程序设计》第1周学习总结

20155222 《Java程序设计》第1周学习总结 教材学习内容总结 JDK是一个工具程序&#xff0c;包括了JAVA程序语言&#xff0c;工具程序与JRE&#xff0c;JRE包括了部署技术&#xff0c;JAVA SE API 与 JVM。 教材学习中的问题和解决过程 第一章&#xff1a;JDK的变量和选项如何设…

字符串常量与字符串变量

参考&#xff1a;http://blog.csdn.net/chenwenshi/article/details/6702576 定义&#xff1a;在一个双引号“ ”内的字符序列或者转义字符序列称为字符串常量 例如&#xff1a;“HI HI&#xff01;” “a” “\n\t” 这些字符串常量是不能改变的&#xff0c;如果试图改变指针…

java资源分配算法,java - 资源分配与动态规划算法 - 堆栈内存溢出

给定一组函数f1 ... fn(离散时间)和时间限制(int)&#xff0c;应找到最大输出&#xff0c;即在不同函数之间分配时间以最大化所用函数输出的总和。对于任何函数&#xff0c;任何时候的值表示如果用于所述时间的函数的总输出。 即F(2)函数的总输出&#xff0c;如果使用2秒。 不是…

Factorial Trailing Zeroes 172

题目描述&#xff1a; 给出一个integer n&#xff0c;计算n&#xff01;结尾0的个数 题目分析&#xff1a; 考虑暴力&#xff0c;计算n&#xff01;统计最后面0的个数。先不说数字溢出&#xff0c;其次n是一个integer &#xff0c;O(n)复杂度超时 我们接着考虑&#xff0c;产生…

DateTime.Now.ToString() 用法

//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString("d"); //2008年4月24日 16:30:15 System.DateTime.Now.ToString("F"); //2008年4月24日 16:30 System.DateTime.No…

GAP平台

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/2441327/blog/846754

二进制与十进制的转换

本文参考:http://www.360doc.com/content/11/0308/14/5327079_99222581.shtml文献整理所得。 1.正整数的十进制转换为二进制. 十进制整数转换为二进制整数采用"除2取余&#xff0c;逆序排列"法。具体做法是&#xff1a;用2整除十进制整数&#xff0c;可以得到一个商…

php记录已经点击过,最近一次的PHP面试题记录,office已到手!

1、explain 具体哪些等级具体有 system、const、range、index、all2、MySQL 优化避免全表查询&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描 (可以将字…