marcelkade Member
Anmeldedatum: 18.02.2010 Beiträge: 29
|
Verfasst 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.
Danke schonmal
Marcel |
|
| Nach oben |
|

|
upsj Member
Anmeldedatum: 04.02.2010 Beiträge: 60
|
Verfasst 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 |
|

|
marcelkade Member
Anmeldedatum: 18.02.2010 Beiträge: 29
|
Verfasst 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 |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
Verfasst 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 |
|

|
marcelkade Member
Anmeldedatum: 18.02.2010 Beiträge: 29
|
Verfasst 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 |
|

|
upsj Member
Anmeldedatum: 04.02.2010 Beiträge: 60
|
Verfasst 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 |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
Verfasst 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 |
|

|
marcelkade Member
Anmeldedatum: 18.02.2010 Beiträge: 29
|
Verfasst 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 |
|

|
|