3D Viewer Isosurfaces? Wahl der API

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Hallo,

ich bin im Bereich der 3D Grafik mit APIs absoluter Neuling und "darf" einen 3D Viewer erstellen. Der Viewer wird in ein Programm eingebunden, dass (von mir) in C# geschrieben wurde.
=> er muss in einem Panel/Canvas etc laufen(im aller schlimmsten Fall würde ich sowas abartiges wie ein Topmost Fenster, das den Panel verdeckt ,verwenden)

Die Datensätze liegen als 3D Matrix vor => hält man eine Spalte fest ergeben sich 2D Schichten. Der Datensatz ist sehr "grobkörnig" eher im Bereich von 64x64x64 (Der Wert ist dabei eine Art Helligkeit, wer sowas kennt: ein 3D Bild aus einem Kernspintomographen analog Computertomographen)

1. Ich will die 2D Schichten gleichzeitig von einer Schrägsicht (Alpha Blending) anzeigen lassen.
2. Die wahrscheinlich größere Herausforderung ist es Isosurfaces darzustellen, also einen Helligkeitsbereich aussuchen und daraus ein drehbares 3D Objekt generieren.

Meine Probleme:
a) sinnvolle Bibliothek api oÄ. ?
Bis jetzt tendiere ich zu SlimDX eine wrapper Bib die die Directx funktionalität abbildet. http://slimdx.org/
=> Habe damit schon eine Sprite in ein Panel gezeichnet. Da, soweit ich das verstehe, damit aber keine 3D Transformation möglich ist(Bild lässt sich sinnvoll nur in eine Richtung rotieren, in alle anderen verschwindet es einfach nur.)
b) Ist die Lösung ein Mesh?

c) zu 2. Wie erstelle ich ein 3D Objekt?
=> Habe überlegt einfach an jedem Punkt eine Kugel zu machen mit dem Radius = Abstand zwischen zwei Punkten. Könnte aber was bescheuert aussehen.
=> Dreiecke an jedem Punkt und dann versuchen alles durch Interpolation zu zermatschen (ist sowas ohne gigantischen Aufwand mit Direct X ) möglich?
=> Die 2D Schichten übereinander zeichnen mit vielen Zwischenschritten ( selber interpoliert) und durch alpha blending aus den Schichten das 3D Objekt erstellen.
Für mich klingt das aber alles nach sehr kläglichen Versuchen etwas abzubilden was die API wahrscheinlich von Haus aus kann.
Deswegen wollte ich mal die Experten anhauen.

Ich weiß keiner wird mir eine allgemeine Lösung für alles bieten, aber vielleicht hat einer Idee was mir sinnloses herumprobieren ersparen würde.
Vielen Dank.
Gruß,
Ralf
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von dot »

Ich würd das Volumen wohl direkt im PixelShader raycasten. Sollte mit SlimDX absolut kein Problem sein.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Zudomon »

dot hat geschrieben:Ich würd das Volumen wohl direkt im PixelShader raycasten. Sollte mit SlimDX absolut kein Problem sein.
Halte ich auch für die beste Lösung. Das Volumen ist ja noch recht klein ( 64³ ) da hat man keine Probleme, dass in eine 3D-Textur zu stecken.
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von joeydee »

Dennis hat geschrieben:zu 2. Wie erstelle ich ein 3D Objekt?
Marching Cubes wäre eine Möglichkeit, falls du nicht nur die Darstellung, sondern auch die Meshdaten brauchst.
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Hallo,
vielen Dank für die Anregungen.
Die Marching Cubes habe ich durchgelesen und soweit ich das verstehe gibt es nur eine zusammenhängende Oberfläche.
Wenn ich jetzt z.B. Trauben hätte würde er versuchen alles zu verbinden. Das würde leider nicht ausreichen.
Das raycasten im Pixel Shader ist mir instantan erstmal kein Begriff, arbeite mich jetzt erstmal darin was weiter ein.

Für andere Interessierte, das Schlagwort scheint "Volume rendering" zu sein.
http://en.wikipedia.org/wiki/Volume_rendering

Zum anderen Problem
>>1. Ich will die 2D Schichten gleichzeitig von einer Schrägsicht (Alpha Blending) anzeigen lassen.
Kann man es mit Sprites lösen? Oder muss man dort auf Meshes zurückgreifen?

Gruß,
Ralf
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Chromanoid »

Mal doch mal eine Skizze oder suche ein Bild wie das ganze am Ende aussehen soll, vielleicht kann dir dann besser geholfen werden. Hat das ganze eigentlich mit Spieleprogrammierung zu tun? Wenn nicht, würde ich das Thema gerne in den Grafikprogrammierung-Bereich verschieben.
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von joeydee »

Dennis hat geschrieben: soweit ich das verstehe gibt es nur eine zusammenhängende Oberfläche.
Wenn ich jetzt z.B. Trauben hätte würde er versuchen alles zu verbinden.
Nein, das hängt rein vom Datensatz und dem Grenzwert ab: http://www.cs.bris.ac.uk/~long/img/littlemetaballs.jpg
Die Frage ist eher, ob du solch ein Mesh überhaupt gebrauchen kannst oder ob dir andere Darstellungen besser in den Kram passen.
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

@joeydee
Ok, das hatte ich nicht direkt am Algo erkannt.

Ich habe mal zwei Bilder angehängt die genau die Lösungen repräsentieren(sind aus meiner Dipl. Arbeit).
Btw. wer erkennt was auf dem zweiten Bild zu erkennen ist, bekommt nen Keks :D

Was ich wohl dazu hätte sagen sollen. Meine Zielplattform ist so ziemlich jeder Schrott Pc (Atom etc inbegriffen). Ich kann nicht bewerten wie stark das Volume ray casting (so hätte ich das Pixel shader raycasten verstanden) bei kleinen Datengrößen skaliert, deswegen schrecke ich noch ein wenig davor zurück. Ein Bild bzw. das 3d Modell sollte aber in <5 s erzeugt werden können und dann relativ schnell rotiert etc werden können. Deswegen fände ich die Lösung mit dem Marching Cubes nicht uninteressant, da ein Shader soweit ich das verstanden habe auf den Atom Dingern nur durch die CPU emuliert würde.

@Chromanoid
Nein, es ist nicht direkt Spiele Entwicklung. Sorry, habe gedacht es passt thematisch hier besser rein, da es eigentlich nicht direkte API fragen sein sollten. Verschieb es wenn es dort besser aufgehoben ist.
Dateianhänge
schichten
schichten
schichten.png (103.58 KiB) 9673 mal betrachtet
Neue Bitmap.png
Neue Bitmap.png (142.48 KiB) 9673 mal betrachtet
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von joeydee »

Zum MC-Einstieg empfehle ich dir aus persönlicher Erfahrung einfach mal das Tutorial, das auf Wikipedia verlinkt ist. Da gibts auch Source-Code komplett mit den nötigen Tabellen und wie diese verwendet werden. Für Optimierungen gibts auch einige Ideen, z.B. hier: http://www.alphanew.net/index.php?secti ... m&lang=eng
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Vielen Dank, für die Links. Das scheint doch ein guter Ansatz zu sein.
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Ich habe versucht das Konzept wie im ersten Bild dargestellt zu implementieren.

Wenn ich eine Textur lade im A8R8G8B8 Modus bei Rotation so eine Art "Schatten" also je nach Winkel wird die Textur ausgeblendet, würde es als ein teiweise Alpha blending bezeichnen (Culling ist aus). Da ich nicht weiß wie der Effekt heißt bekomme ich ihn auch nicht "kontrolliert"

Wenn ich einfach eine Textur aus einer BMP lade passiert das nicht=> denke da gibt es keinen Alpha kanal. Mein Ziel ist es aber nun die Texturen hintereinander wie im ersten Bild darzustellen mit einer leichten Transparenz, wofür ich das Alpha blending verwende (Zielplattform dx9 primitivste Grafikkarte => keinen Shader)
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von joeydee »

Hast du dran gedacht die Planes zum Betrachter hin zu sortieren, wenn es kein additives Blending ist? Hört sich nämlich fast so an, als ob der Z-Buffer dir hier einen Strich durch die Rechnung macht, kann aber bei den Infos auch nur raten.
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Vielen Dank für die Antwort. Anbei habe ich mal ein Bild hochgeladen was zeigt, was ich meine.
Links sind die Schichten hintereinander und die "Bilder" darauf sind deutlich zu erkennen. Wenn ich die Schichten rotiere blenden die Bilder immer weiter aus, bis zum extremfall(ganz rechts) wo nichts mehr zu erkennen ist. Das passiert allerding nur wenn ich ein Textur wähle mit Alpha kanal. Lade ich einfach eine Bmp blendet er nichts weg.

Alpha Blending ist wie folgt aktiviert:

Code: Alles auswählen

 D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
         D3DDevice.SetRenderState(RenderState.AlphaBlendEnable, true);
            D3DDevice.SetRenderState(RenderState.SourceBlend,Blend.SourceAlpha);
            D3DDevice.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);


Dabei wähle ich als Alpha Kanal extra nur die diffuse color vom Vertex:

Code: Alles auswählen

 D3DDevice.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg2);
            D3DDevice.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Texture);
            D3DDevice.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Diffuse);
            D3DDevice.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.SelectArg1);
            D3DDevice.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Diffuse);
            D3DDevice.SetTextureStageState(0, TextureStage.AlphaArg2, TextureArgument.Texture);

Ich sortiere die Schichten nicht, aber soweit ich es verstehe sollte dies kein Problem sein?
Dateianhänge
delme.png
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Schrompf »

Alpha-Operationen, die den Dest-Pixel irgendwie dämpfen (also auch Deine gepostete AlphaBlend-Einstellung) sind grundsätzlich reihenfolgen-abhängig. Zusätzlich musst Du aber auch den ZBuffer abschalten, damit nicht zufällig die hinteren Planes weggelassen werden, weil die vordere Plane bereits in den ZBuffer geschrieben hat.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Ja, stimmt der Z-Buffer muss auch schon wegen der Transparenz aus ( aus Verzweiflung hatte ich das auch schon ausprobiert). Das ändert aber leider nicht am "alpha Blending", dass durch die Perspektive ensteht. Dieses Ausblenden wird auch bei einer einzelnen Schicht ausgeführt.
Ich hätte erst auf eine Beleuchtung getippt, die ist aber meines erachtens ausgestellt, und es müsste dann mehrere Lichtquellen geben.

Wenn ich theoretisch einen Würfel male, bei dem alle Seiten die gleiche Farbe besitzen. Dann färbt dx doch die Seite auch je nach perspektive anders ein. Wie heißt dieser Effekt und wie verhindere ich den?
Dateianhänge
delme.png
delme.png (18.89 KiB) 9357 mal betrachtet
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von dot »

1) Sortierst du deine Ebenen richtig?
2) Verwendest du Mip-Mapping?
3) Hast du die Beleuchtung ausgeschaltet?
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von joeydee »

Dennis hat geschrieben:Wenn ich theoretisch einen Würfel male, bei dem alle Seiten die gleiche Farbe besitzen. Dann färbt dx doch die Seite auch je nach perspektive anders ein. Wie heißt dieser Effekt und wie verhindere ich den?
Eigentlich nicht, das macht nur die Beleuchtung. Ansonsten kann es ja eigentlich nur noch ein (Mip)Mapping-Problem sein, also dass die Textur bei steilen Winkeln nicht mehr gut genug gesampled oder gefiltert wird.
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Super vielen Dank! Es war das Mip-Mapping. Hatte einen Teil des Code aus einem Tutorial und die Filter hatte ich als Glättung oÄ. abgetan.. da hätte ich wohl zu aller letzt gesucht.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von dot »

Dacht ich mir. Allerdings bedeutet das wohl auch, dass dein Volumen Mip-Maps hat. Wenn du diese sowieso nicht brauchst, dann würd ich auch keine generieren, Volumendaten sind eh so schon groß genug ;)
Dennis
Beiträge: 33
Registriert: 10.02.2004, 20:00

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Dennis »

Damit vielleicht noch andere irgendwas von diesem Thread haben:
Ich habe das ganze in slim dx ganz gut implementieren können. Leider hat dies aber meine restliche GUI in C# extrem flackern lassen(auch wenn ich externe Frames oder Ähnliches verwendet habe), dieses Problem habe ich nicht wegbekommen, so dass ich alles nochmal in WPF 3D implementiert habe. War auch nicht alles wunderbar mit der GUI zu vereinbaren, aber inzwischen habe ich eine Implementierung die man einen Kunden präsentieren kann.

Volume mapping habe ich mit Marching Cubes erreicht. Ein großes Problem ist/war das echtzeit smoothing der Normalen ( da dynamisch das Rauschlevel gewählt wird). Hier habe ich schlussendlich den Raum zerstückelt und dann nur in Stücken den Raum durchsucht.
Dateianhänge
delme3.png
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von B.G.Michi »

Beim Marching Cubes kannst du doch direkt die Normalen mitberechnen und zwar als Gradient der Dichteverteilung. Oder werden nur die Normalen immer neuberechnet?
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: 3D Viewer Isosurfaces? Wahl der API

Beitrag von Artificial Mind »

Gradient der Dichteverteilung ist auch nur eine eher schlechte Approximation. Ich würde bei Marching Cubes tatsächlich Face Normals empfehlen (und dann entsprechend jeder Vertex eine Gewichtung der umliegenden Face Normals).
Antworten