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

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

1

08.07.2007, 14:36

Probleme mit der TriBase-Engine

Hallo mal wieder,
ich hab' jetzt mit der TriBase-Engine (genauer tbObject) ein bisschen rumexperimentiert und auf folgende Hindernisse gestolpert.

1. Es wird gesagt, dass wenn man einen absoluten Vektor mit der invertierten Matrix transformiert, kommt ein Vektor relativ zu Objekt, das durch diese Matrix beschrieben wird heraus. Aber in der Zeile:

C-/C++-Quelltext

1
    void AddRotationAbs(const tbVector3& vAdd)  {m_vRotation += tbVector3TransformNormal(vAdd, m_mMatrix);}

sieht es anders aus. Auf jedenfall hab' ich es in meinem Programm vewendet und es kommen Ergebnisse, die ich nicht nachvollziehen konnte. Statt m_mMatrix hab' ich dann m_mInvMatrix verwendet und siehe da, das Objekt wird tatsächlich um die absoluten Achsen gedreht.

2. Die ApplyForce Methode liefert irgendwie falsche Ergebnisse (das Objekt dreht sich nicht in die Richtung, in die es normallerweise drehen sollte).

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Kraft einwirken lassen

void tbObject::ApplyForce(const tbVector3& vAttack,
                          const tbVector3& vForce,
                          const float fMovementExaggeration,    // = 1.0f

                          const float fRotationExaggeration)    // = 1.0f

{
    // Diese Funktion stellt den Kern der gesamten Physikeinheit dar.

    // Sie berechnet die Wirkungen der Kraft mit der Richtung und

    // Stärke vForce, die am Punkt vAttack angreift.

    // Beides sind absolute Angaben.


    // Rotations- und Bewegungsfaktor werden berechnet.

    // Sie bestimmen, welcher Anteil der Kraft in eine Rotation und

    // welcher in eine Bewegung umgewandelt wird.

    // Ihre Summe ergibt immer 1, daher braucht man nur einen der

    // beiden Faktoren zu berechnen.

    // Der Rotationsfaktor ist das Verhältnis zwischen dem Quadrat der

    // kürzesten Distanz zwischen dem Schwerpunkt und der Linie

    // mit der Richtung der Kraft, die durch den Angriffspunkt geht,

    // und dem Quadrat des Radius.

    float r = tbPointLineDistance(m_vPosition,
                                  vAttack - (10000.0f * vForce),
                                  vAttack + (10000.0f * vForce));
    float fRotationFactor = (r * r) / (m_fRadius * m_fRadius);
    if(fRotationFactor > 1.0f) fRotationFactor = 1.0f;

    // Der Bewegungsfaktor kann nun ganz leicht berechnet werden.

    float fMovementFactor = 1.0f - fRotationFactor;

    // Kehrwert der Masse bestimmen (für schnellere Division)

    float fInvMass = 1.0f / m_fMass;

    if(fMovementFactor >= 0.0001f)
    {
        // Dem Objekt Bewegung hinzufügen. Man erhält sie, indem man

        // die Richtung der Kraft mit dem Bewegungsfaktor multipliziert

        // und das Produkt durch die Masse des Objekts teilt.

        // Alles wird noch mit einem bestimmten Faktor multipliziert,

        // um den Effekt ein wenig zu übertreiben.

        AddVelocityAbs(fMovementFactor * fMovementExaggeration * vForce * fInvMass);
    }

    if(fRotationFactor >= 0.0001f)
    {
        // Rotation hinzufügen. Erst rechnen wir die relative Position des Angriffspunkts

        // aus und teilen sie durch den Radius. Die Richtung der Kraft wird ebenfalls

        // in eine relative Richtung umgerechnet.

        tbVector3 vRelAttack(AbsToRelPos(vAttack) / m_fRadius);
        tbVector3 vRelForce(AbsToRelDir(vForce));

        // Rotation um die x-Achse

        AddRotationRel(tbVector3(vRelAttack.z * -vRelForce.y * fInvMass, 0.0f, 0.0f));
        AddRotationRel(tbVector3(vRelAttack.y * vRelForce.z * fInvMass, 0.0f, 0.0f));

        // Rotation um die y-Achse

        AddRotationRel(tbVector3(0.0f, vRelAttack.x * vRelForce.z * fInvMass, 0.0f));
        AddRotationRel(tbVector3(0.0f, vRelAttack.z * vRelForce.x * fInvMass, 0.0f));

        // Rotation um die z-Achse

        AddRotationRel(tbVector3(0.0f, 0.0f, vRelAttack.x * -vRelForce.y * fInvMass));
        AddRotationRel(tbVector3(0.0f, 0.0f, vRelAttack.y * vRelForce.x * fInvMass));
    }
}

Da ich nicht verstanden habe wozu die zwei Minuszeichen gut sind, habe ich die kurzerhand entfernt. Wenigstens dreht sich das Objekt bei einem Treffer in die richtige Richtung (wenn auch nicht ganz).
Übrigens, fRotationExaggeration wird gar nicht verwendet oder habe ich Tomaten auf den Augen :?
Meine Frage ist dann, ob ich was falsch verstanden habe oder liege ich richtig.
To go back to the drawing board is not everyone's cup of tea! :-)

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

2

08.07.2007, 14:48

Da ich soweit noch net mit dem buch bin, hab ich einfach mal geraten, was du für minuszeichen weggemacht hast. ist es --?

Wenn ja, das ist der dekrementoperator. den solltest ud vltl dalassen, wo du ihn herhast(also net wegmachen).


Socke

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

3

08.07.2007, 15:08

Zitat von »"Faule Socke"«

Wenn ja, das ist der dekrementoperator

Nö, was ein Dekrementierungsoperator ist, weis ich schon lange. Ich dachte, es ist aus dem Konzept zu verstehen, was ich meine:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
        // Rotation um die x-Achse

        AddRotationRel(tbVector3(vRelAttack.z * -vRelForce.y * fInvMass, 0.0f, 0.0f));
        AddRotationRel(tbVector3(vRelAttack.y * vRelForce.z * fInvMass, 0.0f, 0.0f));

        // Rotation um die y-Achse

        AddRotationRel(tbVector3(0.0f, vRelAttack.x * vRelForce.z * fInvMass, 0.0f));
        AddRotationRel(tbVector3(0.0f, vRelAttack.z * vRelForce.x * fInvMass, 0.0f));

        // Rotation um die z-Achse

        AddRotationRel(tbVector3(0.0f, 0.0f, vRelAttack.x * -vRelForce.y * fInvMass));
        AddRotationRel(tbVector3(0.0f, 0.0f, vRelAttack.y * vRelForce.x * fInvMass));

Vor vRelForce.y steht ein Minuszeichen. Zwei, weil eben zwei mal vRelForce.y verwendet wird.

Ich hoffe, das war jetzt verständlich ausgedrückt ;)
To go back to the drawing board is not everyone's cup of tea! :-)

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

4

09.07.2007, 18:59

Kann mir da wirklich keiner weiter helfen???:?:

OK, ich habe es so gemeint: Ich habe in tbObject ein paar potenzielle Fehler entdeckt und meine Frage ist dann, ob es diese wirklich sind oder ob ich was falsch verstanden habe. Ich möchte nur darauf aufmerksam machen, dass ich die TriBase-Engine zu verbessern versuche. Wie ich im Forum so mitgekriegt habe, bin ich nicht der einzige User dieser Engine. Auf jeden Fall freue ich mich auf ein bisschen Feedback (vor allem dem des Autors ;)).
To go back to the drawing board is not everyone's cup of tea! :-)

Werbeanzeige