我要发帖 回复

高级会员

109

主题

1366

积分

0

专家分

OSG-VR-GIS

忠于职守杰出贡献

:

私信
发表时间 : 2007-9-21 16:54:40 | 浏览 : 7549    评论 : 6
OSG的OBJ文件读取插件 - ReadWriterOBJ(转)
<OBJ格式简介>
OBJ文件是Wavefront公司开发的一种三维图形文件格式,这种格式同样也以通过Maya软件进行读写。
OBJ文件是直接可读的文本文件,用户可以直接用写字板打开对它进行编辑。
与该格式相对应的二进制文件格式使用.MOD为后缀,二进制文件的格式结构目前还没有公开。
OBJ文件的特点是:
1、OBJ文件属于三维模型文件,不包含动画、材质特性、贴图路径、动力学、粒子等信息。
2、OBJ文件主要支持多边形(Polygons)模型,也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但使用Maya导出的OBJ文件并不包括这些信息。
3、OBJ文件支持三个点以上的面。很多其它的模型文件格式只支持三个点的面,使得模型不得不进行三角化,有的时候这对模型的再修改较为不利。
4、OBJ文件支持法线和贴图坐标。在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中。
OBJ文件由多行文本组成,文件中可以任意添加空格和空行。它不需要任何形式的文件头,不过用户往往使用表明文件信息的注释行作为文件头。
注释行以“#”开始,其它行由一个或数个关键字(Keyword)开始,其后为相应的数据信息。关键字用于说明当前行的数据或功能类型。
多行文本可以连接在一起表示一行,方法是在每一行最后添加一个连接符“\”。注意连接符后面不能出现空格。

OSG目前支持的关键字列表:
(readOBJ相关)
#,$:注释行。
v:顶点坐标。对应数据为x,y,z。
vn:顶点法线坐标。对应数据为x,y,z。
vt:贴图坐标。对应数据为x,y。
p,l,f:指定多个几何元素组合成点(point),线(line),或者面(face)。对应数据为顶点,法线和贴图坐标的多个索引值。同一点的顶点、贴图和法线索引值之间用“/”分隔,多个点信息之间用空格分隔。
usemtl:指定要使用的材质。对应数据为材质名称。
mtllib:指定ue4material/' target = '_blank' style = 'color: #666; padding-right: 16px; background: url(static/image/admincp/newwin.gif) no-repeat right;'>材质库。对应数据为ue4material/' target = '_blank' style = 'color: #666; padding-right: 16px; background: url(static/image/admincp/newwin.gif) no-repeat right;'>材质库名称。
o:指定几何对象的名称。对应数据为文本或者为空。
g:指定几何对象组的名称。对应数据为文本或者为空。
s:指定光滑组的名称。对应数据为文本或者为0。

(readMTL相关)
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中没有读取其参数。

关于OBJ文件和MTL文件的格式,以及各个关键字的详细说明,请参阅
http://www.fileformat.info/format/material/

<插件基本结构>
ReaderWriterOBJ类继承自osgDB::ReaderWriter类。为了正确实现一个文件读写插件的应有功能,该插件继承了以下一些函数:
1、插件类的名称
const char* className() const;
2、检查本插件是否可以解析输入的文件扩展名
bool acceptsExtension(const std::string& extension) const;
3、读取模型节点
ReadResult readNode(const std::string& fileName, const osgDB::ReaderWriter::Options* options) const;
ReadResult readNode(std::istream& fin, const Options* options) const;

当用户程序中执行osgDB::readNodeFile函数时,OSG系统将跳转到Registry::read函数进行执行,寻找符合扩展名要求的节点,并执行相应的readNode函数,将解析结果保存到ReadResult对象中;
在read函数中,系统将按照以下的搜索顺序,寻找可能符合文件扩展名的插件:
1、首先检查文件是否为压缩包格式(.osga),并尝试读取其中的模型;
2、如果文件路径中包含网络地址,那么使用osgdb_net插件读取网络上的模型文件;
3、尝试从已经注册的插件列表_rwList中查找对应当前文件扩展名的插件,并执行文件的读入;
4、尝试根据文件的扩展名,在可搜索目录下查找对应的osgdb_xxx.dll文件,加载并尝试读取模型。
如果模型文件解析完成,那么系统将执行ReaderWriter::ReadResult::takeNode函数,把解析得到的节点返回给用户。

为了实现该插件的注册,定义全局变量
osgDB::RegisterReaderWriterProxy<ReaderWriterOBJ> g_objReaderWriterProxy
该全局变量的初始化过程中,会使用Registry::addReaderWriter函数自动注册插件所对应的扩展名;换句话说,当程序中第一次加载某个插件DLL之后,下一次再载入同扩展名的文件时,系统将从_rwList中获取该DLL信息并执行相应的readNode函数。

<OBJ插件工作流程>
OBJ插件的目的是读取用户指定的.obj文件,并返回其中包含的场景图形树的根节点,以便加入到整个场景中来。
该插件中包括以下几个模型相关的类:
Model类:模型的读取和分析类
Material类:记录纹理信息
Element类:记录某个几何元素集合信息
ElementState类:记录文件中几何元素组的信息,如组名称,纹理名称

工作流程:
readNode
  Model::readOBJ
    Model::readline 循环执行该函数,按行读取.obj文件内容
    Model::addElement 对于l,p,f指定的几何元素组合,使用该函数保存元素信息到链表
    Model::readMTL 如果文件中定义了用户纹理库mtllib,则执行该函数读取纹理参数
  convertModelToSceneGraph
    buildMaterialToStateSetMap 将纹理数据保存成纹理渲染状态信息
    convertElementListToGeometry 根据几何元素链表的信息,建立顶点、法线和纹理坐标索引,保存几何体
       Model::needReverse 此判断为真的话,翻转几何体法线坐标,以保证OSG与.obj文件的元素顺序一致
    osg::Geometry::setStateSet 设置几何体的纹理渲染状态
    osgUtil::Tessellator::retessellatePolygons 细分几何体多边形
    osgUtil::TriStripVisitor::stripify 对几何体多边形进行三角条带化处理,以增强性能
    osgUtil::SmoothingVisitor::smooth 如果没有指定法线的话,由SmoothingVisitor类自动为几何体指定法线
  返回osg::Node节点

评分

参与人数 1积分 +45 收起 理由
weiyu + 45 赞一个!

查看全部评分

最近VR访客


OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
FlySky 评论于2007-9-21 16:59:09
大家一起看,呵呵~~~~~

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
FreeSouth 评论于2007-9-21 17:08:01
FlySky 评论于2007-9-21 18:37:12
原帖由 FreeSouth 于 2007-9-21 05:08 PM 发表


??????

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
array 评论于2007-9-22 16:24:09
呵呵~~FlySky兄,这篇我还想修改修改呢~~
不过感谢你转贴在这里了,嗯,过几天我再写新的,最近忙乱七八糟的事
FlySky 评论于2007-9-22 17:03:54
array大哥,应该说是辛苦你了,你为学习OSG的人做的无私贡献,真是多呀~~

作为学习OSG的一员,感谢你了!!!!!

期待你写出更多的作品,,呵呵~~~~

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
weiyu 评论于2020-7-1 14:37:30
FlySky 发表于 2007-9-22 05:03 PM
array大哥,应该说是辛苦你了,你为学习OSG的人做的无私贡献,真是多呀~~

作为学习OSG的一员,感 ...

找了一堆资料都没找到,资料太少了谢谢作者写的博客帮了我大忙,要是有一个demo出来就更好理解了!关键官方居然还没有文档 哎

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-10-26 02:01 AM

返回顶部