ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Tiro)
Kommentare (8)
*****

Weitere
User onlineBenutzer online
Gäste online: 6
Mitglieder online: conehead, DarkPrisma, Glatzemann
Registrierte Mitglieder: 1040
Neustes Mitglied: Fantoma5

Terrain Vertices selektieren

Neue Antwort erstellen
 

 

Autor Nachricht
 
 
marcelkade
Member


Anmeldedatum: 18.02.2010
Beiträge: 29

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 18:07    Titel: Terrain Vertices selektieren

Hi,
hab folgendes Problem: Ich möchte einen kleinen Level Editor erstellen, hab schon ein Terrain erzeugt (siehe Riemers Advanced Terrain). Hab das ganze so umgeändert, dass keine Heightmap geladen wird und stattdessen nur eine glatte texturierte Oberfläche erstellt wird. Klappt wunderbar, auch hab ichs geschafft, dass ich einen Punkt auf dem Terrain verschieben kann und sobald man die Maus-Taste drückt, an dieser Stelle der entsprechende Terrain-Punkt nach oben verschoben wird. Jetzt will ich natürlich Hügel erstellen, das heißt um diesen Punkt in einem bestimmten Radius (muss nicht veränderbar sein der Radius) sollen die Punkte nach oben verschoben werden.

Dazu sollen die Punkte, die näher in der Mitte sind stärker extrudiert werden als die Randvertices, damit es einen runden Hügel ergibt. Meine Frage ist also: Wie kann XNA automatisch alle vertices innerhalb des Radius erfassen und ihre jeweiligen "Extrudierfaktoren" berechnen?

Ich hoffe ihr versteht was ich meine, ich kann gerne noch mehr infos geben, wie das ganze bisher funktioniert. Wink

Danke schonmal
Marcel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


upsj
Member


Anmeldedatum: 04.02.2010
Beiträge: 60

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 18:15    Titel:

Ich vermute mal, dass du die Terrain-Vertices in einem Array speicherst, mit dessen hilfe du auf einen Vertex an einer bestimmten "Koordinate" zugreifen kannst.
Die einfachste Möglichkeit ist, alle Vertices in einem Quadrat um den Vertex zu durchlaufen und den (quadratischen) Abstand zum Mittelpunkt zu berechnen. Wenn dieser kleiner als ein bestimmter Abstand (die halbe Seitenlänge des Quadrats) ist, dann ist er im Auswahlkreis. Mithilfe des Abstandes kann dann auch die Stärke der Verschiebung bestimmt werden, z.B. Verschiebung = 1 / Abstand

Ich hoffe mal das hilft dir weiter
_________________
No keyboard found... Press any key to continue
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


marcelkade
Member


Anmeldedatum: 18.02.2010
Beiträge: 29

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 18:20    Titel:

mm..das klingt logisch, darüber hab ich noch nicht nachgedacht, ich werd mich mal eben dran setzen und versuchen die Idee in Code zu packen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 18:35    Titel:

Geh einfach zurück zur Heightmap. Dann renderst du mit SpriteBatch unterschiedliche Formen additiv auf die Heightmap und erstellst danach deine Terrain-Vertices neu. Damit kannst du dann z.B. einen Kreis, der an den Rändern dunkler wird, als "Pinsel" nehmen, aber auch ein Dreieck oder welche Form du auch immer willst.
_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


marcelkade
Member


Anmeldedatum: 18.02.2010
Beiträge: 29

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 18:42    Titel:

also jetz hab ichs endlich soweit, dass man schonmal ein Quadrat extrudieren kann auf dem Terrain. Wie könnte ich jetzt den Abstand berechnen? Mein Ansatz wäre Vector2 und .Length()..ich versuch das mal.

Hier der Code, der bis jetzt schonmal sehr schön funktioniert. (bei Vector3 position1 ist die Z-Achse die Y-Achse, deshalb position1.Y für den Z-Wert)

Code:

for (int x = (int)position1.X - (int)radius; x < (int)position1.X + (int)radius; x++)
                {
                    for (int y = -(int)position1.Y - (int)radius; y < -(int)position1.Y + (int)radius; y++)
                    {
                        if (x > 0 && x < terrainWidth)
                        {
                            if (y > 0 && y < terrainLength)
                            {
                                    heightData[x, y] += 0.1f;
                               
                            }
                        }
                    }
                }
               
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


upsj
Member


Anmeldedatum: 04.02.2010
Beiträge: 60

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 19:05    Titel:

Der Abstand ist ganz einfach Vector3.Distance. Aber solang es nur ums Vergleichen der Abstände geht, sollte Vector3.DistanceSqared schneller sein, da keine Wurzel gezogen werden muss. Wenn du den quadrierten Abstand zur Berechnung der Verschiebung verwendest, sieht der Berg vielleicht nicht ganz so linear aus.
Glatzemanns Ansatz hat den Vorteil, dass die Werkzeuge z.B. jede beliebige Form, Größe oder auch Körnung haben können, falls du etwas Unreinheiten ins Terrain bringen willst.
_________________
No keyboard found... Press any key to continue
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 19:13    Titel:

Ja und noch diverse weitere Vorteile:


  • deutlich weniger Code (< 10 Zeilen)
  • die Werkzeuge sind frei skalierbar
  • benötigt keinen Code um neue Werkzeuge einzubringen, sondern muss nur eine Grafik "malen"
  • "abgedrehte Verteilungen" möglich, wie ein Kreis mit Wellen
  • es ist in den meisten Fällen deutlich performanter
  • Clipping macht die GraKa
  • Lade-/Speicher-Methoden für Heightmap UND Werkzeuge bereits vorhanden
  • Anisotropische Filterung der Werkzeuge

_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


marcelkade
Member


Anmeldedatum: 18.02.2010
Beiträge: 29

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 20:48    Titel:

Ich hab das ganze bisher so gemacht, dass der "Kreis" des Pinsels erzeugt wird im 3D-Raum (sind 20 Positionen), aber per Viewport.Project... in 2D umgerechnet wird und per SpriteBatch gemalt wird. das funktioniert super...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de