Fractal Noise für Mesh-Deformation

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Fractal Noise für Mesh-Deformation

Beitrag von Stephan Theisgen »

Hallo!

Ich habe eine Frage an die Experten hier. Ich würde gerne meine Asteroiden prozedural, also frei von meinem Programm generieren lassen. Dafür würde ich gerne das Vorgehen der meisten Tutorials zu dem Thema automatisch implementieren. In fast allen ist der erste Schritt ein Kugelmesh (wie ich den mit der entsprechenden Anzahl Segmenten mache, hoffe ich zu wissen) und dann wird eine Noise-Funktion meist mit Fractal als Parameter angewendet (siehe z.B. in diesem Tutorial: http://www.escalight.com/tutorials/3dsm ... art-1.html, folgendes Bild: Bild).

Hat jemand hier vielleicht eine Ahnung in welcher Richtung ich da nach Algorithmen suchen muß? Am besten wäre natürlich jemand wüßte ziemlich genau welcher Algorithmus da in 3dsmax verwendet wird.

Vielen Dank und viele Grüße
Stephan
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Fractal Noise für Mesh-Deformation

Beitrag von eXile »

Ich hab jetzt etwas rumgesucht, und habe noch immer nicht verstanden, warum die das nicht Perlin Noise statt Fractal Noise genannt haben. Aber nun gut. Hier meine Vermutung wie man das bewerkstelligen könnte:

Man nehme die OOBB des Objekts, und lege dort dreimal dreidimensionalen Perlin Noise rein. Das heißt, wir haben nun die OOBB mit Voxeln gefüllt, welche ein jeweils Wertetripel zugewiesen bekommen haben, der aus den Perlin-Noise-Formeln rauskommt. Jedem Vertex, welcher nunmehr ja in einem bestimmten Voxel liegt, wird nun eine Translation zugewiesen, welche genau dem Wertetripel in dem Voxelgrid entspricht. Dann kann man noch je nach Dimension diese Werte skalieren.

Das erste Problem ist nun mit Vertices, die direkt auf dem Rand der OOBB liegen. Aber dafür gibt es eine ganz einfache technische Lösung, nämlich dass die Voxel nicht nur die OOBB auffüllen, sondern die um die Hälfte der Voxelgröße in jede Dimension verlängerte OOBB, so dass die Randvertices nun genau in der Mitte eines Voxel liegen sollten. Viel schlimmer ist es, was passiert, wenn mehrere Vertices in einem Voxel liegen: Dann kriegen diese Vertices dieselbe Translation zugewiesen, was schlecht aussehen könnte. Dann könnte man einfach die Voxelauflösung vergrößern (d.h. die Voxel verkleinern). Oder abgefahrener: Man nimmt wieder die OOBB, rotiert die um den Mittelpunkt des Objekts (und vergrößert das Voxelgrid dann so, dass das ganze Objekt wieder umschlossen wird), und legt dort wieder Perlin-Noise rein, und die Vertices werden nun gemäß einer Kombination der Noises verschoben.

Das sind alles nur Ideen, mein Spezialgebiet ist das nicht ;)
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

Re: Fractal Noise für Mesh-Deformation

Beitrag von The_Real_Black »

Stephan Theisgen hat geschrieben:Ich würde gerne meine Asteroiden prozedural, also frei von meinem Programm generieren lassen....
Hat jemand hier vielleicht eine Ahnung in welcher Richtung ich da nach Algorithmen suchen muß? Am besten wäre natürlich jemand wüßte ziemlich genau welcher Algorithmus da in 3dsmax verwendet wird.
Wenn du bereits die Kugel als Objekt in deinen Programm erstellst wie hier in diesen XNA Beispiel, dann sollte es doch ein leichtes sein auf die Punktpositionen einen Offset zu addieren. Im leichtesten Fall kann man mit einen Sinus oder zwei überlagerten Wellen arbeiten. Dies ergibt auch nette Formen und es durfte leichter sein als eine Noise-Funktion zu implementieren.
Happy Coding.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Fractal Noise für Mesh-Deformation

Beitrag von eXile »

The_Real_Black hat geschrieben:Im leichtesten Fall kann man mit einen Sinus oder zwei überlagerten Wellen arbeiten. Dies ergibt auch nette Formen und es durfte leichter sein als eine Noise-Funktion zu implementieren.
Um einen Asteroiden zu modellieren braucht es sicherlich mehr, als nur ein, zwei Sinusfunktionen zu benutzen. Insbesondere große Asteroide, die z.B. mit Einschlagskratern eine nicht-uniforme Oberflächenstruktur aufweisen, sind selbst mit Perlin-Noise nicht ausschließlich modellierbar. Hier kommt es eher darauf an, dass Perlin-Noise und andere generierende Funktionen ein wichtiger Baustein für die prozedurale Modellierung sind, aber man dennoch nicht um viel Ausprobieren drum rum kommt ;)
Despotist
Establishment
Beiträge: 394
Registriert: 19.02.2008, 16:33

Re: Fractal Noise für Mesh-Deformation

Beitrag von Despotist »

Ich würde auch sagen dass du viel die Parameter probieren musst und dir gut aussehende merkst und diese nur geringfügig modifizierst bei der zufälligen Erstellung. So sehen sich eingie Asteroiden vielleicht ähnlich aber es ist besser als Formen zu erzeugen die vom Spieler als unpassend/unrealistisch empfunden werden.

Die Krater würde ich erst nachher durch eine zusätzliche Funktion einbauen. Dafür könntest du über der Oberfläche eine Kugel erzeugen und alle Vertices die innerhalb der Kugel liegen an deren Rand verschieben. Je weiter die Kugel weg ist und je größer ihr Radius umso größer werden die Krater. Dafür brauchst du aber mehr Vertices als bei deinem Beispielmodell.

Ich würde übrigens die Streckung nicht über den Noise oder die Heightmap machen sondern am Anfang die Kugel schonmal um zufällige Werte in allen 3 Raumrichtungen strauchen/strecken. Daraufhin modifiziert deine Zufallsfunktion die Höhe nur noch bis zu einem maximalen Prozentsatz des Durchmessers der Kugel. Bedenke aber dass bei sehr länglichen Körpern die Punkte näher am Zentrum um andere Werte verschoben als die weiter weg weshalb es dann vielleicht komisch aussieht.
Stephan Theisgen
Beiträge: 94
Registriert: 29.07.2003, 11:13

Re: Fractal Noise für Mesh-Deformation

Beitrag von Stephan Theisgen »

Also, erstmal vielen Dank für die Kommentare und Hilfestellungen. Ich bin inzwischen der Meinung, dass dort Perlin Noise verwendet wird. Trotzdem werde ich da wohl einfach mal etwas rum spielen, um zu sehen, was da die besten Ergebnisse gibt.
Mein Hauptproblem ist noch, dass man an die Asteroiden ganz nah heranfliegen können soll, was eine echte Herausforderung wird...
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

Re: Fractal Noise für Mesh-Deformation

Beitrag von The_Real_Black »

eXile hat geschrieben:
The_Real_Black hat geschrieben:Im leichtesten Fall kann man mit einen Sinus oder zwei überlagerten Wellen arbeiten. Dies ergibt auch nette Formen und es durfte leichter sein als eine Noise-Funktion zu implementieren.
Um einen Asteroiden zu modellieren braucht es sicherlich mehr, als nur ein, zwei Sinusfunktionen zu benutzen. Insbesondere große Asteroide, die z.B. mit Einschlagskratern eine nicht-uniforme Oberflächenstruktur aufweisen, sind selbst mit Perlin-Noise nicht ausschließlich modellierbar. Hier kommt es eher darauf an, dass Perlin-Noise und andere generierende Funktionen ein wichtiger Baustein für die prozedurale Modellierung sind, aber man dennoch nicht um viel Ausprobieren drum rum kommt ;)
Naja mit ein paar Sinus Funktionen kann man schon einiges erreichen was nach einen Asteroiden aussieht da kommt man aber nur durch Ausprobieren drauf danach legt man die Einschlagskrater usw sind ja nur Texturen auf das Modell, frage ist ja wie nah will man an die Asteroiden ran.

Ist ja schon geklärt:
"Mein Hauptproblem ist noch, dass man an die Asteroiden ganz nah heranfliegen können soll, was eine echte Herausforderung wird..."
Die Frage ist wie genau braucht du die Krater auf der Oberfläche? Bei vielen Spielen wird sowas mit Texturen gelößt, denn jede Erhebung muss ja mit einigen Punkten modelliert werden, dass kostet Rechenzeit. Da würde mich jetzt das Ziel deines Projekts interessieren.
Happy Coding.
Antworten