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

idontknow

unregistriert

51

08.12.2009, 22:13

Was ich nicht ganz versteh ist das Get und Set der Masse!
Warum Masse erst mit 1/mass setzen und DANN bei get mass (ist das überhaupt eine gültige invertierung?) nochmal 1/invertedmass oO

Ist das nur um die Werte in ihrerer Größe anzupassen oder steckt da mehr dahinter? ;)

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

52

09.12.2009, 09:40

Zitat von »"idontknow"«

Was ich nicht ganz versteh ist das Get und Set der Masse!
Warum Masse erst mit 1/mass setzen und DANN bei get mass (ist das überhaupt eine gültige invertierung?) nochmal 1/invertedmass oO

Ist das nur um die Werte in ihrerer Größe anzupassen oder steckt da mehr dahinter? ;)


Bei den internen Berechnungen wird an mehreren Stellen durch die Masse geteilt. Anstatt durch die Masse zu teilen kann man aber auch (viel "besser") mit der inversen Masse multiplizieren. Daher bietet es sich an, direkt den Wert der inversen Masse vorzuhalten. Die Getter und Setter müssen dann halt entsprechend implementiert sein. Falls sich der Wert der Masse (bzw. der inversen Masse) häufig ändert oder häufig drauf zugegriffen wird, könnte man sich ggf. zwei redundante Werte halten: Masse (für Getter und Setter) und inverse Masse (für interne Berechnungen). Der Zusammenhang der beiden Werte muss dann natürlich stets konsistent gehalten werden.

edit:
Und der Wertebereich der inversen Masse ist wesentlich interessanter als der der regulären Masse: Eine inverse Masse von 0 bedeutet z.B. einen Körper mit unendlich großer Masse. Während solche Objekte mit unendlich großer Masse sehr häufig und praktisch sind, gibt es masselose Objekte hingegen "kaum" bzw. sind sie sogar sinnlos. Beides natürlich im Hinblick auf Physikmodelle für Computerspiele etc. Objekte unendlicher Masse können z.B. den Erdboden, Wände, oder statische Objekte generell repräsentieren. Masselose Objekte müssten sowieso eine spezielle Behandlung erfahren, insofern tauchen sie, wenn überhaupt, wohl eher selten in entsprechenden Physikmodellen auf. Zugegeben, die Eigenschaft "Unbeweglich" eines statischen Objekts o.ä. kann man natürlich auch durch ein einfaches Flag kennzeichnen, aber das erfordert dann ja eine Fallunterscheidung bei der Berechnung der jeweiligen Kollisionsverhalten. Bei einer inversen Masse von 0 für solche Objekte ist eine generische Formel vollkommen ausreichend.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

53

09.12.2009, 17:02

Würde man wirklich mit einer inversen Masse von 0 arbeiten um unendliche Masse zu erzeugen käme aber hier wieder das Problem.

C-/C++-Quelltext

1
2
3
4
float GetMass()
{
    return 1.0f / m_InverseMass;
}


So wie es implementiert ist kann man das auch gar nicht machen.. Dann müsste man ja schon beim Setter eine unendliche Masse angeben, damit man die inverse Masse 0 bekommt.

Oder versteh ich das jetzt falsch? :)

idontknow

unregistriert

54

09.12.2009, 23:17

C-/C++-Quelltext

1
2
3
4
5
6
7
void SetMass(float mass)
{
    if(mass != 0.0f)
    {
        m_InverseMass = 1.0f / mass;
    }
}


m:InverseMass wird wohl nie 0 werden außer man hat mega Pech und da stand vorher im Speicher 0 :P^^

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

55

10.12.2009, 10:23

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class RigidBody
{
// [...]

private:
    float _inverse_mass;
// [...]

public:
    float get_inverse_mass() const { return _inverse_mass; }
    float get_mass() const { return _inverse_mass != 0 ? 1/_inverse_mass : FLT_MAX; }
    void set_inverse_mass(float im) { _inverse_mass = im; }
    void set_mass(float m) { _inverse_mass = m != 0 ? 1/m : FLT_MAX; }
    bool has_infinite_mass() const { return _inverse_mass == 0; }
    bool set_infinite_mass() { _inverse_mass = 0; }
// [...]

};


Dieser Ansatz ist auf jeden Fall praktischer und weniger fehleranfällig als ständig bei den Dynamikberechnungen durch die Masse zu teilen bzw. ständig zu checken, ob sie 0 ist, um entsprechend andere Berechnungen durchzuführen. Zumal eine Masse von 0 wenig Sinn ergibt, wie bereits angesprochen...
Dividieren muss man in jedem Fall an irgendeiner Stelle, also besser in irgendwelchen Getter- und Setter-Methoden, die wohl seltener und nicht so zeitkritisch aufgerufen werden wie die Logik zur Berechnung der Dynamik...
Kommen Sie nie mit einem Schwert zu einer Schießerei.

Asmodiel

Treue Seele

  • »Asmodiel« ist der Autor dieses Themas

Beiträge: 150

Wohnort: Schweiz

Beruf: Applikationsentwickler

  • Private Nachricht senden

56

15.12.2009, 11:00

Wah, ihr stellt vielleicht Fragen. ;) Ich muss sagen, dass ich mich erst wieder ins Thema einarbeiten müsste. Als ich das Tutorial geschrieben habe, habe ich etwa einen Monat vorher - nicht, dass mir jemand mit abtippen kommt ;) - zwei Bücher über Physik und Physik-Engine-Entwicklung gelesen. Ist also schon länger her. Ich versuche dauernd, mich wieder ranzusetzen, aber so ganz klappen will das nicht. :) Konnte die Posts sogar nur kurz überfliegen, weil ich mich sofort wieder ans Werk machen muss.

Wie Steven schon sagte, bringt eine inverse Masse von 0 eine unendliche Masse, also ein unbewegliches Objekt. Die normale Masse von 0 sollte nicht vorkommen. Ich schaue mir die Posts demnächst genauer an und versuche, Unklarheiten im Tutorial noch zu klären. Generelle Verbesserungen wird's so oder so auch geben.
Eat a beaver - Save a tree.

57

09.06.2010, 23:26

Habe mir gerade dein Tut durchgelesen und gefällt mir soweit ganz gut. Hätte da nur eine Sache zu bemängeln:

Zitat

Beschleunigung in m/s/s
Ist zwar auch richtig, aber algemein sagt man m/s².

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

58

23.09.2010, 14:47

Ich muss persönlich sagen, dass das Tut mir gefällt.
Bin neu in der Spieleprogrammierung und zum Anfang um hinter die Programmierung zu schauen finde ich es gut.
Das die Physikberrechnungen dabei keinen mehr schocken war mir auch direkt klar ^^
Es hätte vllt nur bei mir an der Umsetzung gehapert :lol:

Werbeanzeige