VTK笔记-OBJ格式-vtkOBJReader与vtkOBJWriter
OBJ文件格式
obj文件是3D模型文件格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准,适合用于3D软件模型之间的互导,也可以通过Maya读写。OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。
文件特点
OBJ3.0文件格式支持直线(Line)、多边形(Polygon)、表面(Surface)和自由形态曲线(Free-form Curve)。直线和多边形通过它们的点来描述,曲线和表面则根据它们的控制点和依附于曲线类型的额外信息来定义,这些信息支持规则和不规则的曲线,包括那些基于贝塞尔曲线(Bezier)、B样条(B-spline)、基数(Cardinal/Catmull-Rom)和泰勒方程(Taylor equations)的曲线。其他特点如下:
- OBJ文件是一种3D模型文件。不包含动画、材质特性、贴图路径、动力学、粒子等信息。
- OBJ文件主要支持多边形(Polygons)模型。虽然也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group aterials),但Maya导出的OBJ文件并不包括这些信息。
- OBJ文件支持三个点以上的面,这一点很有用。很多其它的模型文件格式只支持三个点的面,所以导入Maya的模型经常被三角化了,这对于我们对模型进行再加工甚为不利。
- OBJ文件支持法线和贴图坐标。在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标。
基本结构
OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符()。注意连接符()后面不能出现空格或Tab格,否则将导致文件出错。
下列关键字可以在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)
OBJ里的面的索引可正可负,为正数时是指顶点的绝对索引,为负时(比如:f -a -b -c),表示从该面位置开始,倒数的第a,b,c个顶点,vn,vt索引也一样。
OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。
材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。
正常情况下顶点数据中每一行表示一个XYZ的坐标点(x,y,z);
有自定义的OBJ文件,会在坐标点后,紧跟3个RGB值,可能是浮点型(0.0-1.0),可能是0-255;
如果使用VTK中的vtkOBJReader来解析OBJ文件,只会得到与坐标相关的坐标点集合;
VTK中对OBJ文件的操作
vtkOBJReader
加载常规OBJ文件很简单,直接使用vtkOBJReader即可;
vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New();
reader->SetFileName(filename.c_str());
reader->Update();
vtkOBJReader对外提供了输出流;
reader->GetOutput();
reader->GetOutputPort()
由于vtkOBJReader类只读取了坐标信息,对于自定义的OBJ文件每行中的v 后三个坐标位置之后信息未使用;
如果需要对后面紧跟信息进行解析使用,就需要对 vtkOBJReader源码进行修改,或者在使用vtkOBJReader读取OBJ文件后,再次解析 OBJ文件,使用vtkUnsignedCharArray对OBJ中的几何数据增加标量数据,以标量数据来表示颜色值;
在《VTK图形图像进阶》中,讲到颜色可以直接作为一种标量属性数据,设置到相应的点或者单元数据中,这也是最直接的一种图形着色方式。
vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New();
reader->SetFileName(filename.c_str());
reader->Update();
int numPts = reader->GetOutput()->GetPoints()->GetNumberOfPoints();
vtkSmartPointer<vtkUnsignedCharArray> pointColors = vtkSmartPointer<vtkUnsignedCharArray>::New();
pointColors->SetNumberOfComponents(3);
for (int i = 0; i < numPts; ++i)
{pointColors->InsertNextTuple3(255, 0, 0);
}
// 设置标量属性数据;
reader->GetOutput()->GetPointData()->SetScalars(pointColors);
之前书本上使用了:
unsigned char red[3] = {255,0,0};
pointColors->InsertNextTupleValue(red);
InsertNextTupleValue函数已经不再使用;
可以使用:
pointColors->InsertNextTuple3(255, 0, 0);
或者
double red[3] = { 255.0,0.0,0.0 };
pointColors->InsertNextTuple(red);
对于自定义i的OBJ文件,有的会在v 的XYZ坐标后,紧跟RGB的颜色值;
如果使用VTK提供的vtkOBJReader,只能获取到无颜色属性的poly数据;
需要我们自己从OBJ文件中获取到颜色值,生成vtkUnsignedCharArray数据,设置reader的几何点的标量数据;
vector<tuple<double, double, double>> GetColorRGBFromOBJ(string obj_file_path)
{vector<tuple<double, double, double>> color_sets;FILE *in = fopen(obj_file_path.c_str(), "r");if (in == nullptr){cout << "File " << obj_file_path << " not found" << endl;return color_sets;}const int MAX_LINE = 1024 * 256;char rawLine[MAX_LINE] = { 0 };while (!feof(in) && fgets(rawLine, MAX_LINE, in) != nullptr){char *pLine = rawLine;char *pEnd = rawLine + strlen(rawLine);if (*(pEnd - 1) != '\n' && !feof(in)){break;}while (isspace(*pLine) && pLine < pEnd) { pLine++; }const char *cmd = pLine;if (cmd[0] == '#'){memset(rawLine, 0, MAX_LINE);continue;}while (!isspace(*pLine) && pLine < pEnd) { pLine++; }// terminate commandif (pLine < pEnd){*pLine = '\0';pLine++;}if (strcmp(cmd, "v") == 0){float xyz[3] = { 0 };float rgb[3] = { 0 };if (sscanf(pLine, "%f %f %f %f %f %f", xyz, xyz + 1, xyz + 2, rgb, rgb + 1, rgb + 2) == 6){color_sets.push_back(make_tuple(rgb[0], rgb[1], rgb[2]));}}else{break;}memset(rawLine, 0, MAX_LINE);}fclose(in);return color_sets;
}
将GetColorRGBFromOBJ生成的RGB颜色集合;生成vtkUnsignedCharArray;
int numPts = reader->GetOutput()->GetPoints()->GetNumberOfPoints();
vtkSmartPointer<vtkUnsignedCharArray> pointColors = vtkSmartPointer<vtkUnsignedCharArray>::New();
pointColors->SetNumberOfComponents(3);
for (auto it = colors.begin(); it != colors.end(); it++)
{pointColors->InsertNextTuple3(std::get<0>(*it) * 255.0, std::get<1>(*it) * 255.0, std::get<2>(*it) * 255.0);
}
reader->GetOutput()->GetPointData()->SetScalars(pointColors);
这样reader中的数据就有了标量数据,可以用来带有颜色的图形;
vtkOBJWriter
vtkOBJExporter
vtkOBJImporter
引用资料
1.obj文件
VTK笔记-OBJ格式-vtkOBJReader与vtkOBJWriter相关推荐
- (01)VTK读取OBJ格式模型
前言 使用vtk可以读取的模型格式非常有限,在此适应vtk加载.stl格式的工业数据(使用SolidWorks输出的或者CAD输出的,后来为了减少模型容量,用上SolidWorks将stl格式转换成了 ...
- VTK读取dicom序列,并保存成vtk和obj格式的3D格式文件
在vs中配置好vtk之后,新建项目,然后加入如下代码. #include "stdafx.h" #include <vtkAutoInit.h> VTK_MODULE_ ...
- obj转stl_STL转STP的方法视频教程,OBJ格式转STP或者IGS开模具格式的过程,STL转STP软件介绍...
STL转STP视频教程,OBJ格式转STP或者IGS开模具格式的方法过程 本文视频中详细演示STL格式转换成STEP格式的方法制作过程,3D文件格式转换过程,OBJ文件转实体STP或IGS可开模具格式 ...
- VTK笔记-裁剪分割-几何裁剪-vtkClipPolyData
什么是裁剪分割 VTK加载二维数据和三维数据,我们通常观察到的是三视图图像,或者是vtkImageReslice获取到的转换矩阵对应的观察点三视图或者是斜平面图像,想要看到图像中间部分的渲染结果就 ...
- blender 导出 obj 格式,3dsmax 导入3ds max obj 格式数据
blender 导出 obj 格式,3dsmax 导入3ds max obj 格式数据 blender 导出 3dsmax 导入
- 初次转化max模型为3D Tiles失败、cesium加载一个obj格式的3D 机房模型
先下一个3D max模型,后缀为.max:用3D max打开:网上下的其他模型查看器不能打开: 打开时会出错误提示:对max模型文件和3d max还不了解: 打开后如下:是一个机房的3D模型: 下载一 ...
- wpf加载obj格式的3D模型图解
网上下一个obj格式的3D模型:再下一个obj文件查看器,看一下模型,效果如下: 使用SharpDevelop,新建一个WPF工程: 加载obj模型需要WavefrontObjLoader.cs文件: ...
- Android OpenGLES2.0(十四)——Obj格式3D模型加载
转自:http://blog.csdn.net/junzia/article/details/54300202 在博主<OpenGLES系列>文章中,最开始的几篇讲的就是OpenGL世界中 ...
- 将Unity地形以Wavefront Obj格式导出
原文链接 使用方法请参考原文链接.导出的Obj文件可以作为RecastNavigation的RecastDemo.exe程序的输入文件. 对于已经创建好的Unity Scene,使用原文链接给出的Ed ...
最新文章
- 北大计算机博士生先于OpenAI发表预训练语言模型求解数学题论文,曾被顶会拒绝...
- 2.1JAVA基础复习——JAVA语言的基础组成注释和常量变量
- 哪种云存储服务最适合你?
- .net知识和学习方法系列(七)string类型
- maven私服-详细部署搭建笔记
- 使用Synergy多台电脑共享键盘鼠标和剪贴板
- java shiro登录实例_使用Shiro实现登录成功后跳转到之前的页面
- 断点续传的原理剖析与实例讲解
- springboot2.0版本后配置拦截器会导致静态资源被拦截
- python测试抽奖脚本_B站动态转发抽奖脚本+教程
- eclipse neon php插件,Eclipse Neon安装Tomcat插件
- (Java)idea连接数据库
- game design原理系列学习笔记(四)
- 问题 C: [入门OJ]和||
- Ubuntu下的LibTorrent库编译
- html5页面布局 最基本的规范
- 货车超载计算公式用计算机怎么算,超载计算公式
- power oj 3149【弱水三千,只取一瓢】
- 商务网站建设与维护【16】
- 大数据时代下的SQL Server第三方负载均衡方案----Moebius测试
热门文章
- GO语言从入门到精通全套教程
- Python小数比较
- 【附源码】Java计算机毕业设计小锅米线点餐管理系统(程序+LW+部署)
- DataReader与DataSet,DataGrid与DataList等相关知识
- 不烧钱、不裁员,闪送何以不畏资本寒冬?
- VMware ESXi 8.0b Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)
- 计算机中如何美化表格,Excel 2016怎么美化表格_Excel 2016表格美化方法_一聚教程网...
- 哈尔滨市建筑物矢量数据(Shp格式+带高度)
- 《JSDOM编程艺术》笔记
- Windows服务器基础知识_01