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

16.07.2006, 00:00

tbModelHitsModel funktioniert nicht richtig ??

Hi,
ich habe schon ausführlich im Forum gesucht, aber noch keine Antwort gefunden. :(

Ich habe ein Charakter-Modell und eine einfache Box als Modell. Wenn ich eine Kollision mit tbBoxHitsBox teste, dann funktioniert alles wunderbar.

Bei tbBoxHitsBox2 gibt es Probleme: Die Kollision wird teilweise zu früh erkannt und ich kann mit meinem Charakter von links bzw. rechts in die Box laufen. Bei letzterem wird die Kollision erst in der Mitte der Box erkannt.
Ähnliche Probleme treten auch bei tbModelHitsModel auf.

Ich benutze die Matrizen, die ich auch zum Rendern benutze und die invertierten Matrizen übergebe ich per tbMatrixInvert(). Skalierung benutze ich nicht.
Achja, ich habe es auch mit tbLineHitsModel versucht, indem ich eine Linie vom Boden bis zum Kopf und eine Linie vom Rücken zum Bauch gezogen habe, aber es treten immer wieder die gleichen Probleme auf. Ich habe auch schon andere Modelle als Kollisionobjekt ausprobiert... Ohne Erfolg :(


Hatte vielleicht schon jemand dieses Problem oder hat jemand eine Vermutung, woran es liegen könnte? Ich wäre sehr dankbar für jede Hilfe.

SomeBody ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

16.07.2006, 12:40

David ist gerade auf Urlaub. Du kannst also nur hoffen, dass jemand anders schon ein Problem in dieser Richtung hatte und sich mit einer Lösung(sidee) meldet :) .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

3

16.07.2006, 12:57

aktualisierst du deione Box auch?
Was es alles gibt, das ich nich brauche - Aristoteles

4

16.07.2006, 21:40

Was meinst du mit aktualisieren? Die Box bzw. andere getestete Modelle lasse ich einfach stehen so wie sie sind. Ich setze zu Beginn die Position und Rotation. Den Charakter bewege ich.

Wie gesagt, ich benutze die gleichen Matrizen wie zum Rendern.

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

5

16.07.2006, 21:44

wenn du rotierst etc, musst du die Box aktualisieren, und je nach dem wie du den charakter bewegst ebenfalls
Was es alles gibt, das ich nich brauche - Aristoteles

6

16.07.2006, 22:24

C-/C++-Quelltext

1
2
3
4
5
6
7
8
bool CCharacter::GroundCollision(CObject* pObject)
{
    if (!(Model || pObject))
        return false;

    return tbModelHitsModel(  CollisionModel, GetMatrix(), tbMatrixInvert(GetMatrix()),
                                pObject->CollisionModel, pObject->GetMatrix(), tbMatrixInvert(pObject->GetMatrix()));
}

CollisionModel ist das normale Modell, wenn kein Kolision-Modell vorhanden ist. Ich habe es schon mit und ohne Kollision-Modell ausprobiert..
pObject ist zB. die Box.
Die Klasse CCharacter ist abgeleitet von CObject.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// h-Datei

class CObject
{
protected:
    tbMatrix    RotationMatrix;

public:

    CObject();
    virtual ~CObject();

    tbModel*    Model;
    tbModel*    CollisionModel;

    tbVector3   Position;
    tbVector3   Direction;

    virtual tbMatrix GetMatrix()    { return RotationMatrix* tbMatrixTranslation(Position); }

    virtual tbResult LoadModel(char* pFileName, char* pPrefix = NULL, char* pPostfix = NULL);
    virtual void Render();
    virtual void Move(float fNumSecsPassed);
    virtual void RotateY(float pAngle);

    // verschiedene Methoden wie GetWidth()...

};

// cpp-Datei

void CObject::RotateY(float pAngle)
{
    tbMatrix mRotate = tbMatrixRotationY(pAngle);
    Direction = tbVector3Normalize( tbVector3(tbMatrix(Direction)*mRotate) );
    RotationMatrix *= mRotate;
}



Die Kollisionüberprüfung rufe ich dann in etwa so auf:

C-/C++-Quelltext

1
2
3
4
5
6
7
void CCharacter::Move(float fNumSecsPassed)
{
    ...
    if (CGame::Instance().Objects[ i ] && GroundCollision(CGame::Instance().Objects[ i ]))
        IsJumping = false;
    ...
}



Ich hoffe, das hilft weiter. ;)

7

21.07.2006, 17:01

Hat denn keiner eine Vermutung, woran es liegen könnte?

Funktionieren die Kollisionerkennungen bei euch richtig?

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

8

04.08.2006, 14:05

Bei mir funktioniert sie auch nicht richtig, daher mache ich erst mal woanders weiter, bzw: eine anderes Projekt.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

9

19.12.2006, 21:21

Ich grab ja nur ungern dermaßen alte Threads aus (bitte nicht hauen) .....
aber bei mir funktionierts auch nicht. Hat jemand eine Lösung oder eine Alternative?

10

20.12.2006, 18:08

eine anderer libery verwenden ;)

Werbeanzeige