Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.11.2003, 19:01

Terrain Collisionen oder muss ich jedes Object intersecten ?

Hi !

Weiss einer eine schnelle MEthode wie ich Object (z.b.Panzer, die auch Fahren) richtig plazier ?
Und wie kann ich rauskriegen ob z.b. ein Geschoss mit dem Boden collidiert ? (ich dachte, ich nehm den vordesten Vertex, prüfe ob der tiefer als die Terrainhöhe bei der aktuelle Posi ist und da müsste das Geschoss einschlagen, oder ?)

Thx

ps. Ich hab auch ein paar Ideen, nur brauch ich was schnelles und halbswegs genaues, wie ich zwischen Höheninterpoliere ... weiss ich nich genau :(

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

21.11.2003, 19:43

Erstmal den Punkt deines Geschosses in deinem TerrainOctree finden und unterteilen so auf 30-50 Triangles und dann jedes dieser Triangles auf Kollision testen.

Zwar gibt es bestimmt noch schnellere aber das ist das einzigste was mir grade auf die schnelle einfällt.

3

21.11.2003, 19:54

Ich hab bei mir ein Float Array erzeugt in dem fuer jede Koordinate (eher fuer jeden Vertex im Gitter) die Hoehe gespeichert. Nun brauch ich von hier aus nur noch Interpolieren.

Das ist schoen schnell, weil man grad eben nicht den ganzen Baum durchlaufen muss.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

4

21.11.2003, 20:26

@Patrick: Wer sagt das ich Octree verwende oder die TriBase ?

@Dragon: Ja sowas dachte ich mir auch, nur weiss ich nicht wie ich zwischen 4 Vertexen interpolier.
Könntest du mir da deine Formel mal sagen ?

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

5

21.11.2003, 20:42

Wenn du BruteForce benutzt, solltest du dir Performance gedanken machen, Octree oder Quadtree wäre besser.

6

21.11.2003, 20:53

@ PAtrick: Wer sagt dir eigentlich dauernd was ich nutze ? Wenn ich nicht die TriBade und kein Octree nutze, benutzt ich automatisch kein Quadtree ?
NA deine Logik möcht ich verstehen, zufällig benutzt ich Quadtree ....

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

7

21.11.2003, 20:55

huhu? Hab ich irgendwo TriBase angedeutet oder gesagt benutzt? nööööö

Wenn du einen Quadtree benutzt wo ist dann genau das Problem? :angel:

8

21.11.2003, 20:56

Zitat

@Dragon: Ja sowas dachte ich mir auch, nur weiss ich nicht wie ich zwischen 4 Vertexen interpolier.
Könntest du mir da deine Formel mal sagen ?

9

22.11.2003, 21:05

Speicher nur die Hoehendaten (also nur Y) von jedem Vertex, aber immer nur einmal, logisch ;D

http://www.scherfgen-software.net/forum/…ghlight=terrain Das war mein erster Versuch, es Funktioniert ganz gut, solange man das Terrain nicht Skaliert, dann gibt es unschoene Effekte.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
float Terrain::GetHeightData(const float x, 
                      const float y) 
{ 
   unsigned int ix = int(x / m_fScale) + (m_uiWidth / 2); 
   unsigned int iy = int(y / m_fScale) + (m_uiWidth / 2); 

   if(ix >= m_uiWidth)   ix = m_uiWidth - 2; 
   else if(ix < 0)      ix = 0; 
   if(iy >= m_uiDepth) iy = m_uiDepth - 2; 
   else if(iy < 0)      iy = 0; 

   float v[3] = { m_pfHeightData[ix + (iy * m_uiWidth)], 
                    m_pfHeightData[ix + 1 + (iy * m_uiWidth)], 
                    m_pfHeightData[ix + 1 + ((iy + 1) * m_uiWidth)] }; 

  float i1 = gtl::Interpolate(v[0], v[1], x - int(x));
  float i2 = gtl::Interpolate(v[0], v[2], y - int(y));

  return gtl::Interpolate(i1, i2, x - int(x));
}
Das war mein letzter Stand. Bin nicht zu Hause und kann daher nicht nach schauen.

gtl::Interpolate ist eine Funktion aus der GTL. Kannst dir die GTL von meiner Seite laden. Die Funktion ist in der Datei gtlmath.h Definiert und ist ein Template und fuehrt eine einfache Lineare Interpolation aus.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

10

22.11.2003, 21:51

ty

Werbeanzeige