Reibungsloses Terrain-Rendering

7

Ich versuche mit Direct3D ein glattes Gelände zu rendern. Ich habe ein 50 * 50-Gitter mit allen y-Werten = 0 und eine Reihe von 3D-Punkten, die die Position auf dem Gitter und die Tiefe oder Höhe des "Tals" oder "Hügels" angeben. Ich muss die y-Werte der Gitterscheitelpunkte höher oder niedriger machen, je nachdem, wie nahe sie an jedem 3D-Punkt liegen. Am Ende sollte ich also einen Renderer für glattes Gelände haben.

Ich bin mir überhaupt nicht sicher, wie ich das machen kann. Ich habe versucht, die Höhe der Scheitelpunkte basierend auf dem Abstand zu jedem Punkt zu ändern, indem ich nur diese Grundformel verwendet habe:

dist = sqrt(a² + b² + c²)

Dabei sind a, b und c der x-, y- und z-Abstand von einem Scheitelpunkt zu einem 3D-Punkt. Das Ergebnis, das ich damit bekomme, ist überhaupt nicht glatt.

Ich denke, es gibt wahrscheinlich einen besseren Weg.

Hier ist ein Screenshot von dem, was ich momentan habe: https://dl.dropbox.com/u/2562049/terrain.jpg

dotminic
quelle
1
Zum einen ist die Formel, die Sie angegeben haben, die Entfernung im Quadrat, nicht die Entfernung. Es sollte sein $dist = \sqrt{a^2 + b^2 + c^2}$.
James King
2
Dein Screenshot ist kaputt. Ich würde vorschlagen, es auf imgur oder so hochzuladen.
Tetrad

Antworten:

4

Gibt es etwas Besonderes an diesen 3D-Punkten, weil es so klingt, als würden Sie nur versuchen, eine Höhenkarte zu rendern. Eine Reihe von Entfernungsberechnungen für eine beliebige Anzahl von 3D-Punkten durchzuführen, ist nicht der beste Weg, dies zu tun.

Hier ist ein einfaches DX9-Tutorial zum Rendern einer Höhenkarte.

Das Grundkonzept besteht darin, dass Sie ein 2D-Bild haben, das die Verschiebung darstellt. Die Position des Pixels (X, Y) entspricht also einem Scheitelpunkt (X, Z), und die Farbe des Pixels repräsentiert einen Höhenwert (Y) für den Scheitelpunkt.

Das Schöne an der Verwendung eines Bildes ist, dass es für den Entwickler sehr intuitiv ist, das Gelände visuell zu erstellen und / oder zu ändern.

EDIT: Schaute auf den Screenshot. Es scheint mir zu funktionieren, ich nehme an, Sie sind mit dem Abfallen des Effekts nicht zufrieden? Glatt in Bodennähe und dann eine Spitze an Ihrem 3D-Punkt.

Wenn Sie eines Ihrer Berge / Täler nehmen und es sich in 2D vorstellen und in zwei Hälften schneiden würden, würden Sie eine Kurve sehen, die wie die links aussieht, und ich vermute, Sie möchten eine, die wie die Kurve rechts aussieht.

Alt-Text

Anstatt nach der 3D-Entfernung zu Ihrem 3D-Punkt zu suchen, schlage ich vor, die 2D-Entfernung zu betrachten und die Höhe zu ignorieren. Wenden Sie dann für jeden Scheitelpunkt innerhalb eines vorgegebenen Abfalls die Höhe auf Ihre Scheitelpunkte an, basierend auf einer einfachen Ein- / Aus-Kurve.

wkerslake
quelle
Nein, ich rendere keine Höhenkarte. Ich habe nur ein paar "Höhenpunkte", die angeben, wo sich die Spitze eines Hügels oder eines Tals befinden könnte, aber es gibt nicht einen Höhenwert für jeden Scheitelpunkt. Ich habe einen Screenshot gepostet, es könnte helfen.
Dotminic
Ja, ich habe das selbst geklärt, nachdem ich diese Frage mit einer Quartic-Kurve einer AS3-Tweening-Engine gestellt hatte. Mir fehlte immer noch der vorgegebene Abfall. Vielen dank für Deine Hilfe.
Dotminic
2

Wenn Sie glatte sanfte Hügel erstellen möchten, können Sie die Box-Filtermethode verwenden. Seien Sie jedoch gewarnt, wenn Sie scharfe Klippenränder wünschen, glättet die Methode diese nur.

Hier ist der Link dazu auf GameDev.net: Box Filtering für Smooth Rolling Hills

Der Code geht davon aus, dass Sie eine Höhenkarte verwenden. Eine einfache Änderung Ihrer Lösung besteht jedoch darin, die Liste der 3D-Punkte zu durchlaufen (indem Sie diese 3D-Punkte wie jetzt dem entsprechenden Scheitelpunkt zuordnen).

Ray Dey
quelle