Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Dez 22, 2024 03:42

Foren-Übersicht » Sonstiges » Community-Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 50 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: [WIKI] Perlin Noise
BeitragVerfasst: Mo Feb 28, 2005 16:08 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hat eigentlich schon jemand ein funktionierendes Perlin Noise anhand des Artikels im Wiki gebastelt?
Perlin Noise

Ich hab's jedenfalls noch nicht geschafft und finde den Artikel stellenweise etwas... unklar formuliert...

Zum Beispiel ist mir dieser Satz nicht zu 100% klar:
Zitat:
Rand liefert hier einen Wert für eine 1 Dimensionale Positionsangabe (X - Ganzzahl) einen Wert zwischen -1 und 1.


Ist X eine Ganzzahl? Ist der Rückgabewert X - Ganzzahl (Was auch immer das ist)? Was ist hier mit einer Ganzzahl gemeint? Ein Integer?

Ansonsten ist der Beitrag nicht schlecht, ich musste (und muss immer noch) auf Fremdliteratur in Form von http://freespace.virgin.net/hugo.elias/models/m_perlin.htm zurückgreifen, um ein Perlin Noise zu basteln.

Als grundlegende Erklärung ist der Artikel von Lyr jedenfalls recht gut zu gebrauchen und ich bin froh, dass ich den entdeckt hab. Hätte mich wohl ansonsten erst später mit Perlin Noise befasst...

mfg
Frase

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 28, 2005 17:25 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Zitat:
Als grundlegende Erklärung ist der Artikel von Lyr jedenfalls recht gut zu gebrauchen und ich bin froh, dass ich den entdeckt hab.

Naja das ist in meinen Augen auch das was das Wiki sein sollte. Für komplette Sourcecodes und dergleichen ist das Wiki meines Erachtens nicht unbedingt geeignet weils ja nicht mal solche Sachen wie Syntax Highlighting ohne viel Aufwand gibt.

Ich kann dir wennst willst meinigen Source dazu geben, der is allerdings in C++.

Zitat:
Rand liefert hier einen Wert für eine 1 Dimensionale Positionsangabe (X - Ganzzahl) einen Wert zwischen -1 und 1.

Soll bedeuten, dass als Eingabe ein Integer (am besten ohne Vorzeichen ... wie hieß der noch mal in Delphi? :-) ) erwartet wird und die Ausgabe ein float im Bereich [-1|1] ist.
Das "-" beim "X - Ganzzahl" ist also ein Bindestrich kein Minus.

Wobei mir grad auffällt das der Source dazu eh ned ganz stimmen dürfte. Hab den Teil damals von irgendwo her versucht in Delphi zu übersetzen aber offenbar war diese Quelle nicht ganz so toll oder ich war damals zu dumm das richtig zu übersetzen ... . Also das Round kommt mir etwas komisch vor, weiß leider nimmer wieso ich das gemacht habe. Hier zur Sicherheit noch mal ne Erklärung in Prosa :-):
(x * (x * x * 15731 + 789221) + 1376312589) ist einfach ne Funktion mit groooßen Primzahlen (einfach aus ner Primzahlentabelle irgendwelche Werte nehmen, bleibt sich ziemlich egal).
and $7fffffff auf eine (positive) 32 Bit-Zahl bringen, wenn man unsigned integer verwendet kann man das auch weg lassen wenn man dafür mit $80000000 dividiert anstatt mit 1073741824 (= $40000000) wie im Artikel. Das Ergebniss dieser Division muss nun natürlich ein float sein weshalb man in C(++) auch 1073741824.0f (f steht für float-Zahl) schrieben sollte und nicht die Hex-Schreibweise. Wie das mit den Datentypen in Delphi so gehandhabt wird weiß ich ned so genau.

Und noch ein kleiner Hinweis am Rande für ein schöneres Perlin Noise. Im Artikel steht was von linearer Interpolation, ist zwar ausreichend aber nicht soo toll. Ich verwende da eine quadratische Interpolation die schon sehr nah an eine cos-Interpolation kommt ... hier (wie solls auch anders sein) der C++ Code dafür :-):
Code:
  1.  
  2. V1 und V2 ... zu interpolierende Werte
  3. Step ... Wert im Bereich 0 bis 1
  4. float Interpolate( float V1, float V2, float Step)
  5. {
  6.    float   Fact;
  7.  
  8.     if( Step > 0.5f )
  9.     {
  10.         Fact  = (1.0f - Step);
  11.         Fact  = Fact * Fact * 2.0f;
  12.     }
  13.     else
  14.     {
  15.         Fact  = 1.0f - Step * Step * 2.0f;
  16.     }
  17.  
  18.     return V1 * Fact + V2 * (1.0f - Fact);
  19. }
  20.  

Die ganzen Interpolationsfunktionen wollt ich eigentlich in nen eigenen Bereich geben weil es ja nicht nur für Perlin Noise zu gebrauchen ist ...

Hoffe etwas mehr Klarheit in das ganze gebracht zu haben. Und ich würd mich freuen wenn du meine Fremdsprachenfehler die ich bei Delphi begangen habe etwas aufklären könntest :-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 28, 2005 19:24 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Find ich cool, dass du so schnell antwortest ;)

Ich seh das Wiki auch nicht unbedingt als Code-Archiv und jetzt verstehe ich den Artikel ein ganzes Stück mehr...

Zitat:
Ich kann dir wennst willst meinigen Source dazu geben, der is allerdings in C++.

Das wär' echt nett.
Und C++ sollte nicht das Problem sein ;)

Wenn ich mir deine Interpolation da anschaue...

Dir dürfte http://freespace.virgin.net/hugo.elias/models/m_perlin.htm gefallen.
Daran hab ich mich hauptsächlich orientiert. Das einzige, was mich an dem Artikel stört ist der Pseudo-Code, der recht widersprüchlich ist. Aber ansonsten ist der Artikel klasse. Da wird auch etwas auf Interpolation (Linear, Cosinus, Kubisch) eingegangen, wobei die Kubische dort 5 Werte entgegen nimmt. Schaut aber auch nicht übel aus:
Zitat:
Bild


Wegen den Primzahlen... Dachte mir doch, dass mein alter Primzahlgenerator noch mal zu was Nütze sein wird... Wo ist das Teil bloß hin...? ;)
Und das Round... Das hat mich auch recht stutzig gemacht...

Zu den Fremdsprachenfehlern:

Integer ohne Vorzeichen ist ein Cardinal
Wenn ich noch welche finde versuch ich natürlich die aufzuklären ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 28, 2005 20:01 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
am besten gleich im Artikel. Gutwenn das mal jemand durcharbeitet.

@Codearchiv: Das Wiki soll tatsächlich mal mehr werden als nur Nachschlagewerk. Je detailierter die Infos desto besser. Allerdings muss gewart bleiben, dass beim schnellen überfliegen (z.B. der Einleitung eines Artikels) der Leser erstmal grob weiß um was es eigentlich geht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 28, 2005 20:47 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Zitat:
Find ich cool, dass du so schnell antwortest

War mehr Zufall :-).

Zitat:

Ja das war auch mein primäres Nachschlagewerk damals als ich das brauchte. Die Cubic-Interpolation is ja noch ganz nett allerdings hast du dabei den doppelten Rechenaufwand für das Produzieren der Rand-Zahlen wie für eine lineare, oder für eine cos-Interpolation. Die quadratische Funktion von mir ist ja wie gesagt sehr ähnlich zur cos-Interpolation nur das es halt ein klein wenig schneller is :-).
Mir gings damals sehr viel um Performance, deshalb hab ich im Artikel das SmoothedNoise auch nicht erwähnt (bzw. drauf vergessen... ) aber es schaut ohne eh auch ganz gut aus finde ich. Sind halt die kleinen aber feinen Verbesserungen zur Idee hinter Perlin Noise.

Na dann werd ich wohl jetz mal das mitm Anhang ausprobieren ... aber wunder dich bitte nicht über etwas eigentümlich anmutenden Code-Stil, is ursprünglich Teil eines größeren Projektes, deshalb auch eigene Datentypen und so (siehe die 2 typedefs ganz oben im .h File)


Dateianhänge:
Perlin.zip [2.25 KiB]
655-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 28, 2005 21:18 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Erstmal Danke für den Code. Hat mir jetzt endlich Klahrheit verschafft nach dem Pseudo-Code von http://freespace.virgin.net/hugo.elias/models/m_perlin.htm.
Kombiniert mit einem Texturgenerator gibt das bestimmt geile Ergebnisse...

Bis auf die 2 Typedefs ist an dem Stil doch absolut nichts auszusetzen. :wink:

Ich hab vorher unbedingt sehr oft C++-Code angesehen und hättest du das mit den Typedefs nicht gesagt - mir wären die Floatingpoint32 und der SYSunsignedinteger nicht sofort aufgefallen ;-)

Das einzige, was mir auf Anhieb nicht einfällt sind die *=-Geräte. Ich hoffe nur, dass die so funktionieren, wie in PHP.
Code:
  1. # C++
  2. variable *= 3;
  3.  
  4. // Delphi
  5. variable := variable * 3;

Du hast mich jetzt schon neugierig gemacht... Wieso hast du das ganze denn so auf Geschwindigkeit getrimmt? Sinus ist ja nicht das langsamste und Cosinus wahrscheinlich auch nicht. Jedenfalls bei heutigen Maschinen dürfte man davon nicht mehr viel merken. Ein Bekannter von mir musste jedoch mal mit Trigonometrie auf einer Maschine arbeiten, die in Echtzeit Sensoren überwachen musste. Die Maschine war nicht die schnellste und so hat er dann bei Programmstart 30 Sinus-Werte in einem Array gespeichert und bei dem Aufruf von sin() wurde dann aus diesem Array mittels Linearer Interpolation zugegriffen...

Mit Interpolierung müsste ich mich auch mal irgendwann befassen... Möchte ja schließlich für meine Kamerafahrten schöne sanfte Bewegungen haben. Im Moment sind die noch etwas kantig ;)

Zurück zu Perlin Noise...

Diese Zufallsmuster haben mich schon immer fasziniert. Als ich mal bei Terragen, Photoshop usw. Resultate sah, die einander recht ähnlich waren, machte ich mir Gedanken über einen solchen Algorithmus. Ich hab zu diesem Zeitpunkt zwar schon von Perlin Noise gehört, wusste aber nichts damit anzufangen. Als ich eine kleine Börsen-Simulation geschrieben habe (Wozu braucht man sowas?? ;) ) bastelte ich mir einen Algorithmus der, ähnlich wie Perlin Noise, in mehreren Stufen mit jeweils Abnehmender Stärke, aber zunehmendem Chaos, mehr oder weniger schöne Aktienkurse bildete... ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 28, 2005 21:45 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Code:
  1. # C++
  2. variable *= 3;
  3.  
  4. // Delphi
  5. variable := variable * 3;

Stimmt soweit, nur der Kommentar schaut in C++ auch so // oder so /* ... */ aus :-).

Um deine Neugier zu stillen:
Es handelt sich um eine teils prozeduale Landschaft wo halt so Gschichtln vorkommen vonwegen: erstell mir mal ne Farbtextur für diesen und jenen Patch, oder natürlich auch für die Höhen. Wenn man nun rechnet, dass man eine Sichtweite von sagen wir mal 300 Metern hat, 1 Patch 16 x 16 Meter groß sein soll und du der Einfachheit halber eine max-Geschwindigkeit von 16 Meter (= 1 Patch je Sekunde) hast, dann hast du so ganz ganz grob 300 Meter Radius * Daumen und PI und so = 1800 Meter Umfang macht 1800 / 16 (Patchgröße) / 2 (die Hälfte muss entladen nicht erstellt werden) ~= 56 Patches die je Sekunde erstellt werden müssen und ggf. nochmal so viel wenn unterschiedliche Level of Details benötigt werden (derzeit nur für Höhen).
Wenn man nun weiter rechnet das für die Texturen sagen wir mal durchschnittlich 2 Perlin Noise Texturen mit einer Auflösung von 32x32 generiert werden müssen und für die Höhen nochmal 17x17 (LOD jetz mal weg gelassen), dann kommst du auf so 32*32 * 2 * 56 + 17*17 * 56 = 130872 Perlin Noise Werte die je Sekunde berechnet werden müssen.
Is natürlich eine ziemlich pessimistische Rechnung, aber keine unrealistische in Extremfällen.

Tja das war die negative Seite des ganzen, die positive ist, dass ich je Höhenpunkt auf unter 1 Byte Speicherbedarf komme, wodurch du bei einer 100 MB Landschaft schon mal ne Stunde oder so brauchst wenn du "normal" drüber gehst :-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 01, 2005 00:14 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@Frase: Für die sanften Kamerafahrten sind Bezierkurven wie geschaffen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 01, 2005 16:07 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Das dachte ich mir auch, nachdem ich das Kurven-Tutorial hier durchgelesen habe.
Aber ich hab das nicht so ganz geblickt.
Ausschlaggebend dafür, dass ich zur Zeit keine Bezierkurven verwende, ist aber auch 3ds Max. Dort gibt es bei den Linien die Möglichkeit, diese Linien zu smoothen (Sorry, mir ist keine Übersetzung eingefallen ;) ). Da muss ich auch nicht die Eckpunkte einstellen, wie bei den Bezierkurven. Aber ich hab keine Ahnung, wie das in 3ds Max berechnet wird.

Als ich dann die Interpolierung bei dem Perlin Noise gesehen hab und entdeckt habe, wie einfach das ist, bin ich mehr auf Kubische oder Quadratische Interpolierung gekommen. Cosinus interpoliert bei mir immer do merkwürdig um eine gerade Linie herum.

Beispiel:
Code:
  1. +------+------+

Daraus wird mit einer Cosinus-Interpolation so eine Art Sinus-Kurve. Und das schaut bestimmt nicht schön bei Kamerafahrten aus ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 01, 2005 16:40 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
smoothen könnte man mit glätten übersetzen. :wink:

(Verenglischung ist ein schleichender Prozess. 8))

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 13, 2005 20:39 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hi,
Bin grad bei der einzigen Verständnissschwierigkeit angekommen. ;)
Code:
  1. L_Base = (L_Base<<13) ^ L_Base;


Bedeutet das in Delphi sowas hier?
Code:
  1. L_Base := (L_Base shl 13) xor L_Base;


Das << dürfte ja Bit Shift Left seind, aber das ^ irritiert mich doch etwas... Nimmt man das nicht für Potenzen? Im Wiki-Perlin_Noise wird nämlich statt des ^ ein xor verwendet...

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 13, 2005 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ja das ist in den C ähnlichen Sprachen ein xor.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 18:52 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
So. Hab Lyrs Code jetzt nach Delphi konvertiert.
Funktioniert auch wunderbar, bis auf eine Merkwürdigkeit mit dem Wertebereich...

Wenn ich SetAmplitude(0, 255) aufrufe, sollte das doch dafür sorgen, dass alle Werte im Bereich 0 bis 255 liegen, oder hab ich da was falsch verstanden?

Es werden aber Werte geliefert, die in ganz anderen Bereichen liegen. Und die Größe dieser Bereiche scheint, neben der Amplitude, von der Rechentiefe und der Persistenz abhängig zu sein.

Anbei der Code. Müsste eigentlich der gleiche Code sein. Bis auf die Tatsache, dass es Delphi ist und kein C ;)

Zur Veranschaulichung hier ein Bild...


Dateianhänge:
Perlin.zip [1.96 KiB]
660-mal heruntergeladen
Perlin-Noise2.png
Perlin-Noise2.png [ 65.77 KiB | 21851-mal betrachtet ]

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 19:59 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Müßte das bei

Code:
  1. procedure TPerlinNoise2D.SetAmplitude(Min, Max: Single);
  2. begin
  3.   m_Add       := Min;
  4.   m_Amplitude := Max;
  5. end;

nicht eigentlich

Code:
  1. procedure TPerlinNoise2D.SetAmplitude(Min, Max: Single);
  2. begin
  3.   m_Add       := Min;
  4.   m_Amplitude := Max-Min;
  5. end;


heißen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 20:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
das Problem liegt darin, dass die Berechnungen, die zu einer entsprechend angepassten Amplitude führen nur im create aufgerufen werden.
Wenn dieser codeTeil des creates nach sämtlichen setdepths und setAmplitudes aufgerufen wird, sollte es wunderbar gehn:
Code:
  1.  
  2.  
  3.   L_Range := m_Amplitude - m_Add;
  4.   m_Add := m_Add + L_Range * 0.5;
  5.  
  6.   // We get values between -1 and 1 out of the Rand function
  7.   L_SummedMultiplyer := 0;
  8.   L_Multiplyer       := 2;
  9.  
  10.   for L_Count := 0 to m_Depth -1 do
  11.   begin
  12.     L_SummedMultiplyer := L_SummedMultiplyer + L_Multiplyer;
  13.     L_Multiplyer := L_Multiplyer * m_Persistence;
  14.   end;
  15.  
  16.   m_Amplitude := L_Range / L_SummedMultiplyer;
  17.  


Weil ja um auf einen Gesamtwert von 0 bis 255 der Faktor von der möglichen Persistance, depth usw. abhängt.

Edit:
btw: vll. sollte man darüber nachdenken nen paar Funktionsaufrufe (v.a. SmoothRand is da eher überflüssig) zu entfernen, was der Performance wohl deutlich zu gute kommen sollte.Wenn das ganze dafür ausgelegt ist geschlossene Flächen zurückzugeben, könnte es allgemein recht sinnvoll sein die funktionen direkt für ne ganze Matrix anzuwenden, was die anzahl der funktionsaufrufe weiter reduzieren würde da
(bastel selber grad an nem Perlin noise).


Zuletzt geändert von Grizzly am Mo Mär 14, 2005 20:35, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 50 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Foren-Übersicht » Sonstiges » Community-Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.022s | 18 Queries | GZIP : On ]