繪製帶有顏色的模型

在這之前我的模型一直都是單一灰白顏色的,這篇博文中我將介紹帶顏色的模型

其實在obj文件中在每個點(v)的三個座標後面再跟上三個數就可以表示模型的顏色啦~

這三個數就是RGB的數,表示的是模型的顏色,關於RGB參考https://en.wikipedia.org/wiki/RGB_color_model

那麼下一個問題就是怎樣把一個一維數組的大小按照顏色來表示出來呢

用顏色表示數值大小

我這裏借用了matlab裏的colormap


運行colormap,可以看到其實是對應的64個3位數,所以只需把這些數裏最小的對應第1個三位數,最大的對應第64個即可~,如果想用別的colormap,直接換掉相對應的矩陣就好啦。對應的寫入obj文件的函數爲

function obj_write_col(filename,vertices,faces,colors )
%TEST Summary of this function goes here  
%  write matrix to file  

vertices=vertices';
faces=faces';
colors=colors';
fid=fopen(filename,'w');  
  
[x,y]=size(vertices);  
  
 for i=1:x
   fprintf(fid,'v ');
    for j=1:y-1  
        fprintf(fid,'%f ',vertices(i,j));  
    end  
    fprintf(fid,'%f ',vertices(i,y));%每一行回車\n
    for j=1:y-1
        fprintf(fid,'%f ',colors(i,j));
    end
     fprintf(fid,'%f\r\n',colors(i,y));%每一行回車\n
 end
 

 
fprintf(fid,'\n');
% for i=1:x
%     fprintf(fid,'vn ');
%     for j=1:y-1  
%         fprintf(fid,'%f ',normals(i,j));  
%     end  
%     fprintf(fid,'%f\r\n',normals(i,y));%每一行回車\n  
%     %fprintf(fid,'\n');%每一行回車\n
%  end
 
 
fprintf(fid,'\n');%每一行回車\n  

[x,y]=size(faces);  
  
 for i=1:x
    fprintf(fid,'f ');
    for j=1:y-1  
        fprintf(fid,'%d ',faces(i,j));  
    end  
    fprintf(fid,'%d\r\n',faces(i,y));%每一行回車\n  
    %fprintf(fid,'\n');%每一行回車\n  
end 
  
fclose(fid);  
  
  
end
其中colors由下面的函數得到

function colors = transfer_data2color( data )
%TRANSFER_DATA2COLOR Summary of this function goes here
%   Detailed explanation goes here
n=size(data,1);
colors=zeros(n,3);

Mindata=min(data);Maxdata=max(data);
spice=(Maxdata-Mindata)/64;
data=data-Mindata;

colormap=[0         0    0.5625
         0         0    0.6250
         0         0    0.6875
         0         0    0.7500
         0         0    0.8125
         0         0    0.8750
         0         0    0.9375
         0         0    1.0000
         0    0.0625    1.0000
         0    0.1250    1.0000
         0    0.1875    1.0000
         0    0.2500    1.0000
         0    0.3125    1.0000
         0    0.3750    1.0000
         0    0.4375    1.0000
         0    0.5000    1.0000
         0    0.5625    1.0000
         0    0.6250    1.0000
         0    0.6875    1.0000
         0    0.7500    1.0000
         0    0.8125    1.0000
         0    0.8750    1.0000
         0    0.9375    1.0000
         0    1.0000    1.0000
    0.0625    1.0000    0.9375
    0.1250    1.0000    0.8750
    0.1875    1.0000    0.8125
    0.2500    1.0000    0.7500
    0.3125    1.0000    0.6875
    0.3750    1.0000    0.6250
    0.4375    1.0000    0.5625
    0.5000    1.0000    0.5000
    0.5625    1.0000    0.4375
    0.6250    1.0000    0.3750
    0.6875    1.0000    0.3125
    0.7500    1.0000    0.2500
    0.8125    1.0000    0.1875
    0.8750    1.0000    0.1250
    0.9375    1.0000    0.0625
    1.0000    1.0000         0
    1.0000    0.9375         0
    1.0000    0.8750         0
    1.0000    0.8125         0
    1.0000    0.7500         0
    1.0000    0.6875         0
    1.0000    0.6250         0
    1.0000    0.5625         0
    1.0000    0.5000         0
    1.0000    0.4375         0
    1.0000    0.3750         0
    1.0000    0.3125         0
    1.0000    0.2500         0
    1.0000    0.1875         0
    1.0000    0.1250         0
    1.0000    0.0625         0
    1.0000         0         0
    0.9375         0         0
    0.8750         0         0
    0.8125         0         0
    0.7500         0         0
    0.6875         0         0
    0.6250         0         0
    0.5625         0         0
    0.5000         0         0];

for i=1:n
    num=floor(data(i)/spice)+1;
    if num==65
        num=64;
    end
    colors(i,:)=colormap(num,:);

end

end

測試與演示

拿之前誤差的那個測試一下,數值的大小表示網格誤差,越大表示相比原來的網格突出來越多,反之凹進去越多

obj1='rabbit_500_optimal_wm_norm_angle10.obj';
obj2='rabbit_origin.obj';

OBJ1=readObj(obj1);V1=OBJ1.v;F1=OBJ1.f.v;
OBJ2=readObj(obj2);V2=OBJ2.v;F2=OBJ2.f.v;

[distances12 ] = point2mesh_allerror( F2,V2,V1 );

trep=triangulation(F1,V1);  
figure(2);colormap jet;trisurf(trep,distances12,'edgecolor','interp','FaceColor','interp');caxis([min(distances12) max(distances12)]);...  
axis square;colorbar('vert');brighten(-0.1);axis off;

colors = transfer_data2color( distances12 );
obj_write_col('hehe.obj',V1',F1',colors' );

matlab直接繪製 obj文件顯示
其實matlab的效果還是有點。。聒噪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章