3d-Objekt aus einzelnen Punkten zusammensetzen.
-
Hallo!
Ich habe eine Funktion zur erstellung eines 3d-Fraktals, die ich mit 3 integer Koordinaten füttern kann und diese gibt mir dann die Farben, die die einzelnen Punkte des Objekts haben sollen aus. Es wird Null ausgegeben wenn der Punkt transparent sein soll.
Ich versuche das ganze in directx 10 zu programmieren aber ich kenne mich mit Grafikprogrammierung nicht aus.
Mein erstes Problem ist, dass ich nicht recht weiß, auf welche Weise ich das 3d-Objekt erstellen soll. Das einzige was ich gefunden habe ist die Ausgabe einer Point List, aber das erscheint mir für meinen Zweg doch etwas umständlich. Git es nicht einen Weg wie man einfach ein ganzes 3d-Array Zeichnen kann?
Mein zweites Problem ist, dass in directx für die Koordinaten float Werte verwendet werden. Kann ich die integer Werte in float Werte umrechnen?
-
Um deine 3d Array zu visualisieren gibt es mehrere Möglichkeiten.
Die einfachste die mir einfällt ist es, mehrere Quadrate hintereinander zu zeichnen, welche jeweils einen Schnitt aus deinem Array darstellen.
Und natürlich kann man integer in float umwandeln.
-
Ich weiß, dass man integer in float umwandeln kann, aber ich kann doch die Numerierung in einem Array nicht einfach so auf float Koordinaten von directx übertagen?
-
Ich weiß nicht genau was du möchtest, ich weiß nicht mal ob du dir da selber so sicher bist.
Also du hast einen Haufen Daten, den du visualisieren Möchtest.
Sind diese Koordinaten begrenzt? Hast du z.B. einen Block von 100x100x100?Ich frage daher, da man größere Mengen Daten meistens als ganzen Block einmal an die Grafikkarte sendet (Daher hat die ihren eigenen Speicher) und anschließend nur noch die Position/Ansicht verändert und der Grafikkarte sagt sie soll das Objekt zeichnen.
Mein Vorschlag mit den Quadraten sehe dann so aus, dass du 100 Texturen erzeugst. Und jede Textur 100x100 groß ist (In echt 128x128 da Grafikkarten das meist in x^2 haben möchten).
Jede Textur ist also ein Schnitt aus deinem Würfel.
Dann reihen wir diese Texturen in einem 3d Raum hintereinander auf. Dazu zeichnen wir leicht versetzt Quadrate mit jeweils einer Textur.Das ist keine Perfekte Lösung. Aber relativ einfach.
Ansonsten musst du dir aus deinen Daten ein Polygonen Modell erstellen.
-
Integer-Koordinaten kommt mir schonmal komisch vor. Ist ja dann nicht mehr wirklich ein Fraktal, wenn die Auflösung begrenzt ist.
Davon abgesehen...
Wenn ich ein 3D Fraktal zeichnen sollte, würd' ich vermutlich als erstes mal mit Ray-Casting probieren:
D.h. du gehst von dem Pixel aus, den du zeichnen willst. Anhand der Projektionsmatrix bestimmst du den Sichtstrahl für diesen Pixel.
Dann rechnest du dir den Punkt aus in dem der Sichtstrahl die "Near Z Clipping Plane" schneidet. Das ist dein Startpunkt.Für diesen Punkt lässt du die Fraktal-Formel werken.
Wenn (solange) "nichts" dabei rauskommt, gehst du einen "Schritt" weiter in Richtung des Sichtstrahls. (Schrittweite = abhängig von der Entfernung, z.B. immer so viel, dass ein Schritt "seitwärts" mit dieser Distanz, auf den Bildschirm projiziert genau 1 Pixel "weit" wäre)Wenn du dann einen Punkt findest, wo die Fraktal-Formel "getroffen" meldet, schaltest du auf ne Binäre Suche um. Du hast einen Punkt davor, wo "nichts" getroffen wurde, und einen Punkt wo "etwas" getroffen wurde. Mit der Binären Suche suchst du quasi die "Oberfläche" des Fraktals. Abbruch der Binären Suche dann wenn der Abstand zwischen den beiden Punkten ein fixes Maximum unterschreitet (fix = unabhängig von der Entfernung).
Wenn du dann noch die Normale des Punktes ermitteln willst (für Beleuchtung oder was auch immer), kannst du in der Nähe der ermittelten Position nochmal ein paar Suchen starten, 1x aus Kameraperspektive leicht nach oben versetzt, 1x leicht nach links etc. Dann hast du benachbarte Punkte, die du verwenden kannst um eine Normale auszurechnen.
Mit aktuellen Grafikkarten sollte sich das alles in einem Pixel-Shader rechnen lassen.
-
Ok, danke für die Antworten.
Ich arbeite mich dann mal durch die Dokumentation von Pixel-Shader und Texturen durch...