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/