Project-VolVisWeb

Implementierung des Konvertierers

Zuerst wird der Datensatz geladen. Intern erfolgt eine Streckung des gesamten Volumes auf die nxnxn Größe mittels trilinearer Interpolation

       if(!(volume = loadtexture(ch_inputfilename, width, height, depth, components, scalex, scaley, scalez)))
           ERRORMSG();

       printf("found volume with width=%d height=%d depth=%d components=%d\n",
              width,height,depth,components);

Es wird noch einmal verifiziert ob alle Seitenlängen auch gleich sind

       // Check if really a nxnxn size was generated
       /////////////////////////////////////////////////////////////
       if(!(width==height) && (height ==depth))ERRORMSG();
       else
       {
            texureLength = width; 
       }

Um die Texturen im WebGL Renderer verwenden zu können müßen sie in einem Ordner vorliegen, der die Größe, gefolgt von einem “_” und den Namen der jeweiligen Textur enthält. Beispielsweise 32_Bucky oder 256_MRI-Head. Das Konvertierprogramm erstellt die Dateien entsprechend dieser Namenskonvention automatisch. Dies geschieht sowohl für Windows als auch für Linux-basierte Rechner. Auf die Implementierung wird nicht weiter eingegangen.

Aus dem angepassten Volume werden nun die einzelnen Schichten in x-, y- und z-Richtung ausgelesen und als zweidimensionale .pnm-Dateien gespeichert.

       for(int planetest = 0; planetest < 3; planetest++)
       {
            if(planetest==0)
                plane = 'x';
            ...

            for(int val = 0; val < texureLength; val++)
            {
                // Create the names of the individual planes 
                /////////////////////////////////////////////////////////////////////
                ...

                if(planetest==0)
                    str_CreatedFileNamePNM += "x";
                ...
                Namen der Daten erzeugen und am Ende als Char* in ch_outputfilename speichern
                ...
                // get a trilinear interpolated 2D Texture
                /////////////////////////////////////////////////////////////////////
                test2DTexture = get2DTextureFrom3DTexture(volume, texureLength, plane, val);

                // save the 2D texture as .pnm-file
                /////////////////////////////////////////////////////////////////////                
                writePNMimage(  ch_outputfilename,
                                test2DTexture,
                                texureLength,
                                texureLength,
                                1,  //unsigned int components,
                                0   /*int dds=0*/);
            }// end for(int val = 0; val < texureLength; val++)
       }// end for(int planetest = 0; planetest < 3; planetest++)

       free(volume);

   }

Auf eine tiefergehende Erläuterung der Interna der get2DTextureFrom3DTexture-Mehtode wird an dieser Stelle verzichtet. Prinzipiell wird nach der trinlinearen Interpolation der 3D-Textur aus dieser eine 2D Textur für jede Schicht erstellt. Hierzu ein exemplarischer Codeausschnitt:

    if(plane == 'x')
    {
        i = row;

        for(j = size_y_init; j < size_y_end; j++)
        {
            for(k = size_z_init; k < size_z_end; k++)
            {
                texture2D[k + (size_y_end-1-j)*size]= texture3D[i + size * j + size * size * k];
            }
        }
    }

Die writePNMimage-Funktion stammt aus der ddsbase.h von Prof. Dr. Röttger.
Sie ist zu finden unter:
https://sourceforge.net/p/volren/code/HEAD/tree/viewer/volren/ddsbase.cpp
https://sourceforge.net/p/volren/code/HEAD/tree/viewer/volren/ddsbase.h
Der komplette Converter ist zu finden unter:
https://sourceforge.net/p/volren/code/HEAD/tree/webgl-pvm2web/

Konvertierprogramm | | Manuelle Weiterverarbeitung

Options: