Java3D - Problem beim Volumenrendering mit Texture3D

Walking

Grünschnabel
Hallo

Ich brüte hier schon seit längerem an einem Java3D-Problem.

Meine Abschlussarbeit beschäftigt sich mit der 3D-Visualisierung und Manipulation von medizinischen Schichtbildern.

Ich möchte daher so einen Stapel von Schichtbildern mit Hilfe einer 3D-Texture dreidimensional darstellen.
Ich habe leider im Internet keine wirklich guten Quellen gefunden, die erklären, wie man 3D-Texturen erstellt und damit umgeht, daher werde ich im folgenden mein Problem grob umreissen, damit ihr mir eventuell ein paar gute Quellen empfehlen, oder vielleicht sogar selbst einige Tips geben könnt.

Ich habe bereits ein Array von n^2 BufferedImages im ARGB-Format, welche die Schichtenbilder enthalten (Höhe und Breite ebenfalls eine 2er Potenz). Ausserdem habe ich bereits einen Quader mit einem IndexedQuadArray erzeugt, wobei jede Kante einer Kante meines volumetrischen Bildes (das BufferedImage-Array) entspricht:

Point3f[] vertices = {
new Point3f(-0.5f,-0.5f,0.5f),
new Point3f(0.5f,-0.5f,0.5f),
new Point3f(0.5f,-0.5f,-0.5f),
new Point3f(-0.5f,-0.5f,-0.5f),
new Point3f(-0.5f,0.5f,0.5f),
new Point3f(0.5f,0.5f,0.5f),
new Point3f(0.5f,0.5f,-0.5f),
new Point3f(-0.5f,0.5f,-0.5f)​
};

Point3f[] tex_coos = {
new Point3f(0,0,0),
new Point3f(1.0f,0,0),
new Point3f(1.0f,0,1.0f),
new Point3f(0,0,1.0f),
new Point3f(0,1,0),
new Point3f(1.0f,1,0),
new Point3f(1.0f,1,1.0f),
new Point3f(0,1,1.0f),​
};

int[] indices=
{3,2,1,0,4,5,6,7,1,2,6,5,0,1,5,4,3,0,4,7,2,3,7,6};​

IndexedQuadArray array =
new IndexedQuadArray(vertices.length,
IndexedQuadArray.COORDINATES|IndexedQuadArray.TEXTURE_COORDINATE_3,
indices.length);​

array.setCoordinates(0, vertices);
array.setCoordinateIndices(0, indices);
array.setTextureCoordinates(0, tex_coos);
array.setTextureCoordinateIndices(0, indices);

Shape3D shape = new Shape3D(array);
Appearance app = new Appearance();
app.setTexture(...);
shape.setAppearance(app);


Okay.... soweit so gut, jetzt brauch ich aber die Methode:

Texture3D create3DTexture(BufferedImage[] images)

Hab da schon ewig mit der Implementierung dieser Methode rumprobiert, aber ohne irgend welchen Erfolg. Hier ist die erste naive Implementierung von mir, die aber leider keine Resultate liefert:

public Texture3D createTexture3D(BufferedImage[] original){
ImageComponent3D component = new ImageComponent3D(ImageComponent.FORMAT_RGBA,
original, true, false);​
texture = new Texture3D(Texture.BASE_LEVEL, Texture.RGBA,
original[0].getWidth(), original[0].getHeight(),original.length);​
texture.setImage(0, component);
texture.setEnable(true);
texture.setMinFilter(Texture.BASE_LEVEL_LINEAR);
texture.setMagFilter(Texture.BASE_LEVEL_LINEAR);
texture.setBoundaryModeS(Texture.CLAMP);
texture.setBoundaryModeT(Texture.CLAMP);
texture.setBoundaryModeR(Texture.CLAMP);
return texture​
}

Ich hoffe, dass einer von Euch in irgend einer Form mit 3D-Texturen hat (oder weiss wo genaueres steht ;-) ), denn irgendwie hab ich das Gefühl, dass ich mich da auf einem total falschem Weg befinde.
 
Zuletzt bearbeitet:
Ja das kenn ich, leider sind die Infos zu Texture3D sehr sporadisch.

Ich hab im laufe der letzten Woche bisschen weiter rumgeforscht und bin zu dem Schluss gekommen, dass man auch eine 3D-Textur auf eine 2D-Fläche drüberlegt. Man kann aber der Textur ein Transform3D-Objekt zuweisen, welches die Textur in ihrem Rahmen rotiert bzw. verschiebt.

Okay, nun hab ich nur noch das Problem wie ich aus meinem Array aus BufferedImages eine 3D-Textur erstelle. Diese Bilder sind im RGB-Format. Ich möchte nun, dass alle schwarzen Pixel später in der Textur transparent dargestellt werden.
Ich brauche also folgende Funktion:

public Texture3D createTexture3D(BufferedImage[] images)
Hat vielleicht jetzt einer eine Idee? :)
 
Zurück