Changes between Version 26 and Version 27 of tutorial


Ignore:
Timestamp:
Jun 29, 2013, 4:28:38 PM (6 years ago)
Author:
leon
Comment:

Converter source

Legend:

Unmodified
Added
Removed
Modified
  • tutorial

    v26 v27  
    510510== Reading Objects ==
    511511[[Image(motorBike-subset.png,right)]]
    512 Sometimes we hit limitations of the visualisation tools for the data that we want to visualize. For example [attachment:motorBike.obj] from [http://openfoam.org OpenFOAM] contains object groups that we want to show colored separately and not as whole. Neither [http://wci.llnl.gov/codes/visit/ VisIt] and [http://paraview.org ParaView] can read [http://en.wikipedia.org/wiki/Wavefront_.obj_file Wavefront OBJ] file with group separation. We are forced to convert [attachment:motorBike.obj] into bunch of files and read them one by one.
     512Sometimes we hit limitations of the visualisation tools for the data that we want to visualize. For example [attachment:motorBike.obj] from [http://openfoam.org OpenFOAM] contains object groups that we want to show colored separately and not as whole. Neither [http://wci.llnl.gov/codes/visit/ VisIt] and [http://paraview.org ParaView] can read [http://en.wikipedia.org/wiki/Wavefront_.obj_file Wavefront OBJ] file with group separation. We are forced to convert [attachment:motorBike.obj] into bunch of files and read them one by one. The following {{{wavefront.c}}} converts [attachment:motorBike.obj] into 67 files. Try to open them in VisIt and ParaView.
     513{{{
     514#!c
     515#include <stdio.h>
     516#include <GL/glew.h>
     517#include <GL/glut.h>
     518
     519#define MaxVertices 400000
     520#define MaxFaces    400000
     521#define MaxGroups   100
     522
     523GLfloat vertex[MaxVertices][3];
     524GLuint  face[MaxFaces][3];
     525char    group_name[MaxGroups][80];
     526int     start_face[MaxGroups];
     527
     528int vertices = 0;
     529int faces    = 0;
     530int groups   = 0;
     531
     532void read_wavefront(const char *filename)
     533{
     534  char line[80];
     535  FILE *f = fopen(filename, "r");
     536  while(fgets(line, sizeof(line), f))
     537    switch(line[0])
     538      {
     539      case 'v':
     540        sscanf(&line[1],  "%f %f %f", &vertex[vertices][0],
     541               &vertex[vertices][1], &vertex[vertices][2]);
     542        ++vertices;
     543        break;
     544      case 'g':
     545        sscanf(&line[1], "%s", group_name[groups]);
     546        start_face[groups++] = faces;
     547        break;
     548      case 'f':
     549        sscanf(&line[1],  "%d %d %d", &face[faces][0],
     550               &face[faces][1], &face[faces][2]);
     551        ++faces;
     552        break;
     553      }
     554  fclose(f);
     555  start_face[groups] = faces;
     556  printf("Read %d vertices and %d faces within %d groups from %s\n",
     557         vertices, faces, groups, filename);
     558}
     559
     560void write_wavefront(int group_number)
     561{
     562  int i = 0; char n[80], *p = group_name[group_number];
     563  while (*p != '%' && *p != '\0') n[i++] = *p++; // remove % from name
     564  n[i++] = '.'; n[i++] = 'o'; n[i++] = 'b'; n[i++] = 'j'; n[i] = '\0';
     565  FILE *f = fopen(n, "w"); fprintf(f, "# Wavefront OBJ file\n");
     566  for (i = 0; i < vertices; i++)
     567    fprintf(f, "v %g %g %g\n", vertex[i][0], vertex[i][1], vertex[i][2]);
     568  fprintf(f, "g %s\n", group_name[group_number]);
     569  for (i = start_face[group_number]; i < start_face[group_number+1]; ++i)
     570    fprintf(f, "f %d %d %d\n", face[i][0], face[i][1], face[i][2]);
     571  fclose(f);
     572}
     573
     574int main(int argc, char **argv)
     575{
     576  int i;
     577  read_wavefront("motorBike.obj");
     578  for(i = 0; i < groups; i++) write_wavefront(i);
     579  return 0;
     580}
     581}}}