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/