Code covered by the BSD License  

Highlights from
Matlab mesh to PDF with 3D interactive object

image thumbnail
from Matlab mesh to PDF with 3D interactive object by Alexandre Gramfort
Export triangulated mesh into a pdf with a 3D interactive object.

save_idtf(filename,points,faces,face_vertex_data)
function [] = save_idtf(filename,points,faces,face_vertex_data)
%   SAVE_IDTF   Save mesh in basic IDTF format
%       [] = SAVE_IDTF(FILENAME,POINTS,FACES,FACE_VERTEX_DATA)
%
%   Created by Alexandre Gramfort on 2009-04-21.
%   Copyright (c)  Alexandre Gramfort. All rights reserved.

% $Id: save_idtf.m 2 2009-08-26 15:05:49Z agramfor $
% $LastChangedBy: agramfor $
% $LastChangedDate: 2009-08-26 17:05:49 +0200 (Mer, 26 aoĆ» 2009) $
% $Revision: 2 $

if nargin < 4
    face_vertex_data = [];
end

nfaces = size(faces,1);
npoints = size(points,1);
normals = mesh_normals(points,faces);

if ~isempty(face_vertex_data) && size(face_vertex_data,2) ~= 3
    error('IDTF colors should be RGB');
end
nface_vertex_data = size(face_vertex_data,1);

% if nface_vertex_data == npoints
%     if 0
%         face_vertex_data_mean = (face_vertex_data(faces(:,1),:)+face_vertex_data(faces(:,2),:)+ ...
%                                 face_vertex_data(faces(:,3),:))/3;
%         xx = face_vertex_data_mean - face_vertex_data(faces(:,1),:); xx = sum(xx.*xx,2);
%         yy = face_vertex_data_mean - face_vertex_data(faces(:,2),:); yy = sum(yy.*yy,2);
%         zz = face_vertex_data_mean - face_vertex_data(faces(:,3),:); zz = sum(zz.*zz,2);
%         [tmp,I] = sort([xx,yy,zz],2);
%         face_vertex_data = face_vertex_data(I(:,2),:);
%         % [tmp,I] = min([xx,yy,zz],[],2);
%         % face_vertex_data = face_vertex_data(I,:);
%     else
%         face_vertex_data = (face_vertex_data(faces(:,1),:)+face_vertex_data(faces(:,2),:)+ ...
%                             face_vertex_data(faces(:,3),:))/3;
%     end
%     nface_vertex_data = nfaces;
% end

fid = fopen(filename,'w');

if isempty(face_vertex_data)
    str = verbatim;
    %{
    FILE_FORMAT "IDTF"
    FORMAT_VERSION 100

    NODE "MODEL" {
         NODE_NAME "Mesh"
         PARENT_LIST {
              PARENT_COUNT 1
              PARENT 0 {
                   PARENT_NAME "<NULL>"
                   PARENT_TM {
                        1.000000 0.000000 0.000000 0.000000
                        0.000000 1.000000 0.000000 0.000000
                        0.000000 0.000000 1.000000 0.000000
                        0.000000 0.000000 0.000000 1.000000
                   }
              }
         }
         RESOURCE_NAME "MyMesh"
    }

    RESOURCE_LIST "MODEL" {
         RESOURCE_COUNT 1
         RESOURCE 0 {
              RESOURCE_NAME "MyMesh"
              MODEL_TYPE "MESH"
              MESH {
                   FACE_COUNT %d
                   MODEL_POSITION_COUNT %d
                   MODEL_NORMAL_COUNT %d
                   MODEL_DIFFUSE_COLOR_COUNT 0
                   MODEL_SPECULAR_COLOR_COUNT 0
                   MODEL_TEXTURE_COORD_COUNT 0
                   MODEL_BONE_COUNT 0
                   MODEL_SHADING_COUNT 1
                   MODEL_SHADING_DESCRIPTION_LIST {
                        SHADING_DESCRIPTION 0 {
                             TEXTURE_LAYER_COUNT 0
                             SHADER_ID 0
                        }
                   }
                   MESH_FACE_POSITION_LIST {
                        %s
                   }
                   MESH_FACE_NORMAL_LIST {
                        %s
                   }
                   MESH_FACE_SHADING_LIST {
                        0
                   }
                   MODEL_POSITION_LIST {
                        %s
                   }
                   MODEL_NORMAL_LIST {
                        %s
                   }
              }
         }
    }

    %}

    strfaces = sprintf('%d %d %d\n',faces'-1);
    strpoints = sprintf('%f %f %f\n',points');
    strnormals = sprintf('%f %f %f\n',normals');
    count = fprintf(fid,str,nfaces,npoints,npoints,strfaces,strfaces,strpoints,strnormals);

elseif nface_vertex_data == npoints

    [face_vertex_data_unique,tmp,face_vertex_data_idx] = unique(face_vertex_data, 'rows');
    nface_vertex_data_unique = size(face_vertex_data_unique,1);

    disp(['nb of colors : ',num2str(nface_vertex_data_unique)]);

    str_with_colors = verbatim;
    %{
    FILE_FORMAT "IDTF"
    FORMAT_VERSION 100

    NODE "MODEL" {
         NODE_NAME "Mesh"
         PARENT_LIST {
              PARENT_COUNT 1
              PARENT 0 {
                   PARENT_NAME "<NULL>"
                   PARENT_TM {
                        1.000000 0.000000 0.000000 0.000000
                        0.000000 1.000000 0.000000 0.000000
                        0.000000 0.000000 1.000000 0.000000
                        0.000000 0.000000 0.000000 1.000000
                   }
              }
         }
         RESOURCE_NAME "MyMesh"
    }

    RESOURCE_LIST "MODEL" {
         RESOURCE_COUNT 1
         RESOURCE 0 {
              RESOURCE_NAME "MyMesh"
              MODEL_TYPE "MESH"
              MESH {
                   FACE_COUNT %d
                   MODEL_POSITION_COUNT %d
                   MODEL_NORMAL_COUNT 0
                   MODEL_DIFFUSE_COLOR_COUNT %d
                   MODEL_SPECULAR_COLOR_COUNT 0
                   MODEL_TEXTURE_COORD_COUNT 0
                   MODEL_BONE_COUNT 0
                   MODEL_SHADING_COUNT 1
                   MODEL_SHADING_DESCRIPTION_LIST {
                        SHADING_DESCRIPTION 0 {
                             TEXTURE_LAYER_COUNT 0
                             SHADER_ID 0
                        }
                   }
                   MESH_FACE_POSITION_LIST {
                        %s
                   }
                   MESH_FACE_SHADING_LIST {
                        %s
                   }
                   MESH_FACE_DIFFUSE_COLOR_LIST {
                        %s
                   }
                   MODEL_POSITION_LIST {
                        %s
                   }
                   MODEL_DIFFUSE_COLOR_LIST {
                    %s
                   }
              }
         }
    }

    RESOURCE_LIST "SHADER" {
         RESOURCE_COUNT 1
         RESOURCE 0 {
              RESOURCE_NAME "Box010"
              ATTRIBUTE_USE_VERTEX_COLOR "TRUE"
              SHADER_MATERIAL_NAME "Box010"
              SHADER_ACTIVE_TEXTURE_COUNT 0
         }
    }

    RESOURCE_LIST "MATERIAL" {
         RESOURCE_COUNT 1
         RESOURCE 0 {
              RESOURCE_NAME "Box010"
              MATERIAL_AMBIENT 0.0 0.0 0.0
              MATERIAL_DIFFUSE 1.0 1.0 1.0
              MATERIAL_SPECULAR 0.0 0.0 0.0
              MATERIAL_EMISSIVE 1.0 1.0 1.0
              MATERIAL_REFLECTIVITY 0.000000
              MATERIAL_OPACITY 1.000000
         }
    }

    MODIFIER "SHADING" {
         MODIFIER_NAME "Mesh"
         PARAMETERS {
              SHADER_LIST_COUNT 1
              SHADER_LIST_LIST {
                   SHADER_LIST 0 {
                        SHADER_COUNT 1
                        SHADER_NAME_LIST {
                             SHADER 0 NAME: "Box010"
                        }
                   }
              }
         }
    }

    %}

    strfaces = sprintf('%d %d %d\n',faces'-1);
    strfaces_colors = sprintf('%d %d %d\n',face_vertex_data_idx(faces)'-1);
    strpoints = sprintf('%f %f %f\n',points');
    strnormals = sprintf('%f %f %f\n',normals');
    strshading = sprintf('%d\n',zeros(nfaces,1));
    strcolors = sprintf('%f %f %f\n',face_vertex_data_unique');
    count = fprintf(fid,str_with_colors,nfaces,npoints,nface_vertex_data_unique,strfaces, ...
                    strshading,strfaces_colors,strpoints,strcolors);

else

    [face_vertex_data_unique,tmp,face_vertex_data_idx] = unique(face_vertex_data, 'rows');
    nface_vertex_data_unique = size(face_vertex_data_unique,1);

    str = verbatim;
    %{
    FILE_FORMAT "IDTF"
    FORMAT_VERSION 100

    NODE "MODEL" {
         NODE_NAME "Mesh"
         PARENT_LIST {
              PARENT_COUNT 1
              PARENT 0 {
                   PARENT_NAME "<NULL>"
                   PARENT_TM {
                        1.000000 0.000000 0.000000 0.000000
                        0.000000 1.000000 0.000000 0.000000
                        0.000000 0.000000 1.000000 0.000000
                        0.000000 0.000000 0.000000 1.000000
                   }
              }
         }
         RESOURCE_NAME "MyMesh"
    }

    RESOURCE_LIST "MODEL" {
         RESOURCE_COUNT 1
         RESOURCE 0 {
              RESOURCE_NAME "MyMesh"
              MODEL_TYPE "MESH"
              MESH {
                   FACE_COUNT %d
                   MODEL_POSITION_COUNT %d
                   MODEL_NORMAL_COUNT %d
                   MODEL_DIFFUSE_COLOR_COUNT 0
                   MODEL_SPECULAR_COLOR_COUNT 0
                   MODEL_TEXTURE_COORD_COUNT 0
                   MODEL_BONE_COUNT 0
                   MODEL_SHADING_COUNT %d
                   MODEL_SHADING_DESCRIPTION_LIST {
                    
    %}
    count = fprintf(fid,str,nfaces,npoints,npoints,nface_vertex_data_unique);

    idx = [0:(nfaces-1)]';
    shidx = [0:(nface_vertex_data_unique-1)]';
    str = verbatim;
    %{
                SHADING_DESCRIPTION %d {
                         TEXTURE_LAYER_COUNT 0
                         SHADER_ID %d
                    }
    
    %}
    count = fprintf(fid,str,[shidx,shidx]');

    str = verbatim;
    %{
                   }
                   MESH_FACE_POSITION_LIST {
                        %s
                   }
                   MESH_FACE_NORMAL_LIST {
                        %s
                   }
                   MESH_FACE_SHADING_LIST {
                        %s
                   }
                   MODEL_POSITION_LIST {
                        %s
                   }
                   MODEL_NORMAL_LIST {
                        %s
                   }
              }
         }
    }

    RESOURCE_LIST "SHADER" {
         RESOURCE_COUNT %d

    %}

    strfaces = sprintf('%d %d %d\n',faces'-1);
    strpoints = sprintf('%f %f %f\n',points');
    strnormals = sprintf('%f %f %f\n',normals');
    % stridx = sprintf('%d\n',idx);
    str_face_vertex_data_idx = sprintf('%d\n',face_vertex_data_idx-1);
    count = fprintf(fid,str,strfaces,strfaces,str_face_vertex_data_idx,strpoints,strnormals,nface_vertex_data_unique);

    str = verbatim;
    %{
         RESOURCE %d {
              RESOURCE_NAME "Box01%d"
              SHADER_MATERIAL_NAME "Box01%d"
              SHADER_ACTIVE_TEXTURE_COUNT 0
        }

    %}

    count = fprintf(fid,str,[shidx,shidx,shidx]');

    str = verbatim;
    %{
    }

    RESOURCE_LIST "MATERIAL" {
         RESOURCE_COUNT %d
    
    %}
    count = fprintf(fid,str,nface_vertex_data_unique);

    str = verbatim;
    %{
         RESOURCE %d {
              RESOURCE_NAME "Box01%d"
              MATERIAL_AMBIENT 0 0 0
              MATERIAL_DIFFUSE %f %f %f
              MATERIAL_SPECULAR 0.2 0.2 0.2
              MATERIAL_EMISSIVE 0 0 0
              MATERIAL_REFLECTIVITY 0.100000
              MATERIAL_OPACITY 1.000000
         }

    %}
    count = fprintf(fid,str,[shidx,shidx,face_vertex_data_unique]');

    str = verbatim;
    %{
    }

    MODIFIER "SHADING" {
         MODIFIER_NAME "Mesh"
         PARAMETERS {
              SHADER_LIST_COUNT %d
              SHADER_LIST_LIST {
    
    %}
    count = fprintf(fid,str,nface_vertex_data_unique);

    str = verbatim;
    %{
                   SHADER_LIST %d {
                        SHADER_COUNT 1
                        SHADER_NAME_LIST {
                             SHADER 0 NAME: "Box01%d"
                        }
                   }

    %}
    count = fprintf(fid,str,[shidx,shidx]');

    str = verbatim;
    %{
              }
         }
    }

    %}
    count = fprintf(fid,str);

end

fclose(fid);

end %  function

Contact us at files@mathworks.com