matlab保存/写入到obj文件

16 篇文章 0 订阅

综述

matlab保存/写入到obj文件

代码

function writeOBJ(filename, V,F,UV,TF,N,NF)
  % WRITEOBJ writes an OBJ file with vertex/face information
  %
  % writeOBJ(filename,V,F,UV,N)
  %
  % Input:
  %  filename  path to .obj file
  %  V  #V by 3 list of vertices
  %  F  #F by 3 list of triangle indices
  %  UV  #UV by 2 list of texture coordinates
  %  TF  #TF by 3 list of corner texture indices into UV
  %  N  #N by 3 list of normals
  %  NF  #NF by 3 list of corner normal indices into N
  %

%disp(['writing: ',filename]);
f = fopen( filename, 'w' );


if size(V,2) == 2
  warning('Appending 0s as z-coordinate');
  V(:,end+1:3) = 0;
else
  assert(size(V,2) == 3);
end
fprintf( f, 'v %0.17g %0.17g %0.17g\n', V');

hasN =  exist('N','var') && ~isempty(N);
hasUV = exist('UV','var') && ~isempty(UV);

if hasUV
    switch size(UV,2)
    case 2
      fprintf( f, 'vt %0.17g %0.17g\n', UV');
    case 3
      fprintf( f, 'vt %0.17g %0.17g %0.17g\n', UV');
    end
end

if hasN
    %for k=1:size(N,1)
    %    fprintf( f, 'vn %f %f %f\n', N(k,1), N(k,2), N(k,3) );
    %end
    fprintf( f, 'vn %0.17g %0.17g %0.17g\n', N');
end

if hasUV && (~exist('TF','var') || isempty(TF))
    TF = F;
end
if hasN && (~exist('NF','var') || isempty(NF))
    NF = F;
end

if ~hasN && ~hasUV
  % A lot faster if we just have faces and they're all triangles
  fmt = repmat(' %d',1,size(F,2));
  fprintf( f,['f' fmt '\n'], F');
else
  for k=1:size(F,1)
      if ( (~hasN) && (~hasUV) ) || (any(TF(k,:)<=0,2) && any(NF(k,:)<=0,2))
          fmt = repmat(' %d',1,size(F,2));
          fprintf( f,['f' fmt '\n'], F(k,:));
      elseif ( hasUV && (~hasN || any(NF(k,:)<=0,2)))
          fmt = repmat(' %d/%d',1,size(F,2));
          fprintf( f, ['f' fmt '\n'], [F(k,:);TF(k,:)]);
      elseif ( (hasN) && (~hasUV || any(TF(k,:)<=0,2)))
          fmt = repmat(' %d//%d',1,size(F,2));
          fprintf( f, ['f' fmt '\n'],[F(k,:);TF(k,:)]');
      elseif ( (hasN) && (hasUV) )
          assert(all(NF(k,:)>0));
          assert(all(TF(k,:)>0));
          fmt = repmat(' %d/%d/%d',1,size(F,2));
          fprintf( f, ['f' fmt '\n'],[F(k,:);TF(k,:);NF(k,:)]);
      end
  end
end


fclose(f);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值