Laden...

[gelöst] suche Möglichkeit, 3D-Mesh als Heightmap zu zeichnen

Erstellt von Tubifex vor 8 Jahren Letzter Beitrag vor 7 Jahren 1.617 Views
T
Tubifex Themenstarter:in
12 Beiträge seit 2015
vor 8 Jahren
[gelöst] suche Möglichkeit, 3D-Mesh als Heightmap zu zeichnen

Hallo liebe Community,
Bezüglich Heightmaps gibt es ja einige Algorithmen (z.B. habe ich dank google den Diamond-square-Algorithmus gefunden) um "zufällige" Höhenkarten zu erzeugen.

Ich suche aber einen, der mir aus einem bestehenden 3D-Mesh eine Höhenmap als png zeichnet. Das Mesh liegt mir in C# in Form von MeshGeometry3D vor. Die einzelnen Triangle und Point3D in unterschiedlichen Listen.

Ich habe bisher versucht, mein Bild (1024x768) pixel für pixel abzufahren. Jeder Pixel wird auf einen Farbwert (weis<->schwarz) entsprechend der Höhe im 3D-Modell gesetzt. Dafür "konvertiere" ich die 2D-Position im Bild in die 3D-Position des Modelles (x und y). Dann suche ich mit einer foreach-Schleife das jeweilige Triangle, in diesem diese Position liegt. Im nächsten Schritt bestimmte ich im Triangle die Höheninformation.
Da das nun für jeden Pixel (1024x768) geschieht, braucht das sehr lange.
Ich kenne von Gimp oder Blender die Normalmap bzw Heightmap-Generation, die in wenigen Sekunden Ergebnisse liefern.
Entsprechend fürchte ich, dass mein Ansatz zu zeitaufwendig ist - gibt es Ansätze, die performanter sind? Falls jemand einen kennt, wärst Du so lieb und würdest mir diesen als Gedankenanstoß als Antwort posten? Damit meine ich um Himmels Willen kein fertiges C#-Script, sondern im Idealfall den Namen des Algorithmus, damit ich etwas Futter für google hätte.

Vielen Dank fürs Durchlesen und eine gute Nacht 😃

3.003 Beiträge seit 2006
vor 8 Jahren

Du projizierte deine heightmap auf eine null-ebene und änderst den Farbwert abhängig von der Entfernung des ursprungspunktes zum projizierten Punkt. Math. Hintergrund dabei ist lediglich die Formel für den Abstand eines Punktes zu einer Ebene. Zum Schluss das projizierte Bild nach Bedarf skalieren.

LaTino
EDIT: wieder zu kompliziert gedacht - was du willst, ist ja eine Projektion auf eine Ebene, die orthogonal zur XY-Ebene ist. In dem Fall hast du den Abstand ja längst (im Z des Punkes XYZ für jeden Punkt der Projektionsebene XY0). Um das Verfahren zu verschnellern, geh nur jeden n'ten Punkt durch und skalier das entstandene Bild hoch.
Edit2: je nach Auflösung der 3D-Map. Klingt in deinem Fall nach niedriger Auflösung, dann die z-Werte der Punkte der 3d-Map benutzen und die leeren Flächen in der Projektion linear (Triangles sind ja Flächen) interpolieren.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
Tubifex Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren
[gelöst] suche Möglichkeit, 3D-Mesh als Heightmap zu zeichnen

vielen Dank für Deine Antwort!

Du hattest recht - es war tatsächlich einfacher als ich im ersten Anlauf dachte:

  • Die Z-Koordinaten hatte ich ja, da brauchte ich nur eine Methode, die mir die 3D-Koordinaten in 2D-Koordinaten für das Bild umrechnet.
  • Die Dreiecke habe ich der Einfachheit erstmal nicht gefüllt, sondern lediglich die Umrandung gezeichnet.
    Das habe ich mit dem Bresenham Algorithmus dann gemacht.
    Das Ergebnis ist für mein Projekt brauchbar, vielen Dank für die Hilfe!