文件交换

图片缩略图

波阵面OBJ工具箱

version 1.4.0.0 (203 KB) by Dirk-Jan克朗
读和写波前OBJ几何和MTL文件
3.5
22日评级

71下载

更新09年9月2011年

视图版本历史

查看许可协议

读和写波前OBJ几何和MTL文件。

一个波前几何对象文件被许多3D程序支持,它看起来像:万博1manbetx
V 0.000000 2 000000 0.000000
V 0.000000 0.000000
V 2.000000 0.000000 0.000000
V 2.000000 2.000000 0.000000
%顶点坐标4
F 1 2 3 4
%面临1

函数read_wobj允许将包括材料MTL文件在内的波前目标文件读取到Matlab结构中。
函数write_wobj输出一个Matlab结构到OBJ文件。

不管对象文件是包含样条线还是基于多边形的几何,它都能读写几乎所有的.obj文件。

请参阅“帮助read_wobj”和“帮助write_wobj”

欢迎评论和bug报告

引用作为

Dirk-Jan克朗(2021)。波阵面OBJ工具箱(//www.tianjin-qmedu.com/matlabcentral/fileexchange/27982-wavefront-obj-toolbox), MATLAB中央文件交换。检索

意见及评分(37

如果你想为一个对象创建一个单一的3d可视化,下面的代码对我来说是很好的:

Obj = read_wobj('文件名。Obj ');

obj。面临=边界(obj.vertices);

trisurf (obj。faces, obj.vertices(:,1), obj.vertices(:,2), obj.vertices(:,3), 'Facecolor', gray, 'edgecolor', 'none');

camlight

米歇尔·贝斯特尔

对于不熟悉MATLAB的人-会有人愿意键入一个集合的集合如何使用这个工具箱

基督教Wohlschlager

我正在使用你的功能
Write_obj
阵线=等值面(plot_data)
Write_obj (OBJ,文件名)

电影就像一个例子

结果与等值面不一样(完全不一样)
Input plot_data是512x512x256
也许有人
知道whatsapp错了

基督教

alihan saglam

有人能解释一下如何将。fig文件导出到。obj吗?我在努力,但还是想不出来。

嘉豪罗

克里斯Volpe

我尝试加载一个25mb的obj文件,它死与以下错误(在相当长的时间读取后,实际上):

读取对象文件:C:/Volpe/Data/ bs - photogrammetry //texture -mesh.obj/texture -mesh.obj


% OBJ文件生成的Meshlab

%对象textured-mesh.obj

%顶点:110345
%的面孔:220485

阅读材料文件:C:\Volpe\Data\ bs - photogrammetry \Dense_Pickett_4_Chris\ texture- mesh.obj\ texture- mesh.obj.mtl

%波前材料文件
%由Meshlab组转换

已完成阅读材料文件
下标赋值维度不匹配。

read_wobj错误(第90行)
顶点(nv, 1:4) =数据;

K > >
在本例中,“data”是一个1x6的双精度数组,代码试图将其压缩到四列中。

赫兹曹

德文郡Jakob

naveen B

谢谢qq,先生

杰里王

如果你使用子目录下的材料库。mtl文件导出。obj,那么。obj文件将尝试使用“mtllib <子目录>/<材料名称>.mtl”一行来导入该材料库。.mtl文件似乎总是在与.obj文件相同的目录中生成,因此当您导入位于<子目录>中的.obj文件时,<子目录>将会被材料库复制,并导致错误,至少在本机blender导入中是这样。我建议在R2018a, ubuntu 18.04, blender 2.79中进行以下修改:

(write_wobj.m: 87)

如果(isfield (OBJ,“材料”)& & ~ isempty (OBJ.material))
filename_mtl = fullfile (filefolder[文件名' .mtl ']);
%流(fid, mtllib % s \ n, filename_mtl);

% -王杰于2019年2月6日补充----------
filename_mtl2 =(文件名“.mtl”);
流(fid, mtllib % s \ n, filename_mtl2);
%——最后修正案 -------------------------------

write_MTL_file (filename_mtl OBJ.material)

结束

Matlab初学者

伟大的工作!我如何得到这个网格的(X,Y,Z)坐标?

莱纳斯波姆

很有bug,但它对我来说是有效的,通过Mike在评论中建议的修改

UKM

即使当我使用斜杠或反斜杠相同的错误:
OBJ = read_wobj(例子\ example10.obj);
未定义函数'read_wobj'用于输入char类型参数。

UKM

请. .如何修复这个错误:

OBJ = read_wobj(例子/ example10.obj);
未定义函数'read_wobj'用于输入char类型参数。

D.Jaisil玫瑰

你能告诉我们从哪里可以得到。obj和。mtl文件吗。

哈诺

迈克

这并不是现代编码实践的最佳例子。但是,这确实为我自己的写作节省了很多时间。谢谢你,德克-简·克鲁恩!

我遇到了两个错误,我解决了如下问题:

错误1:“无效的文件标识符…”

我封装了' readmtl '调用(接近第80行),使用如下方法:
%代码开头
如果存在(filename_mtl,'file') == 2
材料= readmtl (filename_mtl、详细);
结束
%代码结束

ERROR 2: "field assignment to a non-structure array object."

这个错误是由于预分配变量“objects”。我通过定义一个'defaultobject'并使用这个值来预分配数组来解决这个问题。当然,需要在使用这个预分配模式的每个函数中定义这个默认对象。

%在~50和~370行,我添加了以下行:
defaultobject =结构(“数据”,结构(),“类型”,“);
%然后我搜索并替换:
对象(+ 10001). data = 0
%,
(+ 10001) = defaultobject对象

目前这是可行的。
*慢慢退回去*

迈克

PatronBernard

PatronBernard

它并不首先检查是否有mtl文件。在我自己修复之后,我有一个关于“对象”变量的奇怪错误:错误试图在一个非结构对象中分配一个字段。在那之后我就懒得写了,所以我就自己写了。

彼得

太好了。然而,我发现了一个bug与Di3D文件没有一个正常定义;读文件被后面的/(如f1271 /674/)所混淆
我的修补是修改函数stringsplit:
% =找到(tline (2: end-1) = = tchar) + 1;i_start = (1 + 1);i_end =[张长度(tline)];%,提供
我找= (tline(2:结束)= = tchar) + 1;
如果i(end)==length(tline) %在行尾有一个'char'
我= (1:end-1);%下降最后一个
i_start = (1 + 1);i_end =[张长度(tline) 1];
其他的
i_start = (1 + 1);i_end =[张长度(tline)];
结束

哈维尔

dskan

抱歉是1星。Mathworks的注释系统显然不是很完善。

在任何情况下,代码都不能使用示例.obj格式,然后再使用函数中的示例代码。经过一些修改后,很明显%被识别为对象类型,如果.obj文件包含指定的其他类型,则代码执行得不好。

dskan

乔王

对我来说很好,但问题是如何在Matlab中显示网格模型?

amroun

我在一个由meshlab创建的obj文件上尝试了这个,它返回了这个错误


% OBJ文件生成的Meshlab

%对象example-cloud.obj

%顶点:197749
%的面孔:0

???下标赋值维度不匹配。

错误在==> read_wobj在90
顶点(nv, 1:4) =数据;

你知道怎么修吗?或者如何从meshlab获得三维坐标?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

我和纳比尔有同样的问题。你找到解决办法了?谢谢你!

Dalia纳比尔

我在一个由meshlab创建的obj文件上尝试了这个,它返回了这个错误


% OBJ文件生成的Meshlab

%对象example-cloud.obj

%顶点:197749
%的面孔:0

???下标赋值维度不匹配。

错误在==> read_wobj在90
顶点(nv, 1:4) =数据;

你知道怎么修吗?或者如何从meshlab获得三维坐标?
谢谢

mclaudt

Mourad,检查文件名是否正确的斜线方向。

在Linux下,您应该使用
OBJ = read_wobj (/ example10.obj例子)
而不是
OBJ = read_wobj(例子\ example10.obj)
从注释的例子。

mourad raafat

依靠好的工作,但它给我那个错误,所以任何人都可以帮助我,因为我是matlab的新用户
???使用==>读取错误
无效的文件标识符。使用fopen生成有效的文件标识符。

错误在==> read_wobj>file2cellarray在298
file_text =从文件中读(fid,正无穷,uint8 = >字符')';

错误在==> read_wobj>readmtl在363
file_words = file2cellarray (filename_mtl);

错误在==> read_wobj在78
材料= readmtl (filename_mtl、详细);
在read文件中
谢谢你的帮助

奥利弗·伍德福德

然而,读取大文件的速度非常慢。

奥利弗·伍德福德

效果很好,很好的帮助文本,写得很好。

雅罗斯瓦夫Tuszynski

工作好了!

保罗

到目前为止,这是一个很好的发现。我发现了一个错误,如果obj的文件名包含一个空格。在read_wobj的第69行。m: filename_mtl = fullfile (filefolder、数据);返回错误:

???未定义函数或方法'eq'的输入参数类型为'cell'。

错误在==> fullfile在39
elseif (f () = = fs) | |(部分(1)= = fs | | (bIsPC & & (f(结束 )=='/' || 一部分(1 )=='/')) )

Dirk-Jan克朗

*海迪
我知道for循环在Matlab中降低了速度,特别是因为波前obj。格式非常广泛。
如果你事先知道你的数据,你可以删除超过80%的代码行。

海迪

对于大型模型来说太慢了!

6月湾

嗨,简:
谢谢你的代码。我有一个问题,我如何使用纹理数据时,显示3D对象?在你的代码中,你只在顶点和面中使用。期待你的回答。

6月湾

这是伟大的工作!谢谢

MATLAB版本兼容性
创建R2010a
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!