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

17.09.2010, 10:05

Kollissionserkennung nach Skalierung fehlerhaft?

Hi @all,

ich benutze in meinem aktuellen Projekt die Kollissionserkennung der TriBase Engine. Jetzt bin ich auf ein Problem gestoßen:

Wenn ich versuche, ein skaliertes Objekt zu testen, dass ist das Ergebnis immer negativ. Ich habe einen Asteroiden, der mit 1.0 skaliert wird und einen, der den Faktor 100 benutzt. Gegen den 1er kann ich stoßen, gegen den 100er nicht...

Die Matrizen enthalten sinnvolle Werte, sie werden so berechnet:

C-/C++-Quelltext

1
2
3
4
    m_mMatrix = tbMatrixScaling(tbVector3(m_fScaling, m_fScaling, m_fScaling)) *
                tbMatrixAxes(m_v3XAxis, m_v3YAxis, m_v3ZAxis) * 
                tbMatrixTranslation(m_v3Pos);
    m_mInvMatrix = tbMatrixInvert(m_mMatrix);


Auch wenn sich das Objekt an Punkt (0|0|0) in der Spielwelt befindet, so dass Verschiebungsfehler ausgeschlossen sind, kann keine Kollision stattfinden...

Ist so ein Problem schonmal aufgetreten oder kennt jemand die Lösung?

Danke im Voraus

Oromis

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

2

17.09.2010, 12:14

welche funktion(-saufrufe) benutzt du, um die Kollision zu berechnen?

Ich vermute, dass die skalierung ignoriert wird, und nur die kollision zwischen den mit dem Faktor 1.0 skalierten Objekte geprüft werden; dann würde es nur zu einer Kolision kommen, wenn sich der eine Asteorid ungefähr in der Mitte des anderen befindet.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

3

17.09.2010, 13:22

C-/C++-Quelltext

1
2
3
4
5
6
7
8
                     tbVector3 vCollision = tbVector3(0.0f);

            CShip* pShip = (*ship);
            CLevelObject* pObj = (*it);

            bool bCrash = false;
            bCrash = tbModelHitsModel(pShip->GetCollisionModel(), pShip->GetMatrix(), pShip->GetInvMatrix(),    
                    pObj->GetCollisionModel(), pObj->GetMatrix(), pObj->GetInvMatrix(), &vCollision);


Damit wird die Kollision getestet. Und nein, auch wenn ich genau die Mitte des Asteroiden treffe, bequemt er sich nicht, eine Kollision zu melden....

Quellcode

1
2
3
4
5
6
7
8
9
10
11
Schiffsmatrix:
0.980   0.000   0.197   0.000
0.000   1.000   0.000   0.000
-0.197  0.000   0.980   0.000
-9.915  0.000   -15.673 1.000

Asteroidenmatrix:
100.000 0.000   0.000   0.000
0.000   100.000 0.000   0.000
0.000   0.000   100.000 0.000
0.000   0.000   0.000   1.000


Das sind 2 Matrizen zu einem Zeitpunkt, an dem sich die Objekte auf jeden Fall berühren müssten

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

4

17.09.2010, 13:56

wenn du als Asteoridenmatrix die Identitätsmatrix hast, klappt es?

Lass dir am besten mal so viele informationen wie möglich loggen und schaue, was nicht passt...

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

5

17.09.2010, 16:14

Es funktioniert, wenn ich die Skalierung auf 1.0 setze. Sobald die Skalierung jedoch einen anderen Wert annimmt, funktioniert es nicht mehr.

6

17.09.2010, 16:21

Hmmm... Ich habe gerade herausgefunden, dass die Kollissionserkennung zwischen zwei Schiffen funktioniert, wenn ich die Skalierung beider Schiffe auf einen von 1.0f verschiedenen Wert setze... Das ist vor allem deshalb seltsam, weil sowohl die Klasse für schiffe als auf die Asteroidenklasse von der selben Oberklasse erben.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

7

17.09.2010, 17:33

Am besten, du versuchst einen minimalen Code zu erstellen, der das Problem reproduziert und lädst den Code mal hoch, ich bin so langsam mit meinem latein am Ende...

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

8

17.09.2010, 18:31

OK, wenn das so einfach wäre.........

Ich werde es versuchen, da der Code aber schon stark mit dem Rest meines Spiels verwoben ist, weiß ich nicht, ob ich das heute noch hinbekomme. Wenn nicht, dann poste ich es in einer Woche, ich habe Abifahrt ;)

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

9

17.09.2010, 18:56

Ja, aber oft ist es die einzige möglichkeit ;)
Ich finde das auch oft nervig, ansonsten musst du selber mit dem Debugger durchgehen (was du so oder so schon getan haben solltest ;) )...

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

10

26.09.2010, 12:31

Ich habe es mir jetzt noch einmal angeschaut und bin dabei über den Radius der Bounding Spere gestolpert. Der ist ja logischerweise auf Skalierung 1.0f ausgerichtet, sodass er andere Skalierungen gar nicht berücksichtigen kann. Ich habe die TriBase Kollissionsfunktionen angeschaut und habe keine Stelle gefunden, an der der Sphärenradius mit dem Skalierungsfaktor multipliziert wird... Habe ich da etwas übersehen oder ist das ein Bug der TriBase - Engine?

Werbeanzeige