Spielephysik ed

nützliche Mathematik: Quaternionen

Die Objekte in der Spielewelt werden als starre Körper angenommen und beschrieben durch \( ( m, \vec{P}, \vec{V}, \theta, q, \vec{\omega} ) \) , (Masse, Position, Geschwindigkeit, Trägheitstensor, Winkel (Quaternion), Winkelgeschwindigkeit ).

Kollisionserkennung ed

...vielleicht später

Stöße ed

ohne Reibung ed

Zwei Objekte A und B kollidieren der Einfachheit halber vorerst nur in einem einzelnen Punkt \( \vec{P}_c = \vec{P}_A + \vec{\rho}_A = \vec{P}_B + \vec{\rho}_B \) . Der Kollision kann immer eine Tangential-Ebene zugeordnet werden, in der siche die Objekte berühren und deren Normalenvektor durch \( \vec{n} \) bezeichnet wird.

Ohne Reibung ist die einzige Möglichkeit, wie beide Körper interagieren können, indem sie entlang des Normalenvektors n Impuls austauschen. Der Impulsübertrag ist somit ein skalares Vielfaches des Normalenvektors ( \( \triangle \vec{p} = \triangle p \cdot \vec{n} \) ), somit ist nur ein Skalarwert ( \( \triangle p \) ) zu suchen. Da die Impulserhaltung automatisch erfüllt ist, muss die Energieerhaltung hierfür herhalten:

\[ \begin{array}{ccc} E_{0=\mathrm{davor}} &= \frac 12 ( m_A \, {\vec{V}_{A0}}^2 + m_B \, {\vec{V}_{B0}}^2 + \langle \vec{\omega}_{A0} , \theta_A \, \vec{\omega}_{A0} \rangle + \langle \vec{\omega}_{B0} , \theta_B \, \vec{\omega}_{B0} \rangle ) & \\ &= \frac 12 ( m_A \, \vec{V}_{A1}^2 + m_B \, \vec{V}_{B1}^2 + \langle \vec{\omega}_{A1} , \theta_A \, \vec{\omega}_{A1} \rangle + \langle \vec{\omega}_{B1} , \theta_B \, \vec{\omega}_{B1} \rangle ) &= E_{1=\mathrm{danach}} \end{array} \]

dabei ist \( m_A \, \vec{V}_{A1} = m_A \, \vec{V}_{A0} - \triangle p \, \vec{n}, \quad m_B \, \vec{V}_{B1} = m_2 \, \vec{V}_{B0} + \triangle p \, \vec{n} \) und \( \theta_A \, \vec{\omega}_{A1} = \theta_A \, \vec{\omega}_{A0} - \triangle p \, ( \vec{\rho}_A \times \vec{n} ), \quad \theta_B \, \vec{\omega}_{B1} = \theta_B \, \vec{\omega}_{B0} + \triangle p \, ( \vec{\rho}_B \times \vec{n} ) \) durch den Impulsübertrag festgelegt.

Setzt man dies oben ein und zieht die beiden Energien von einander ab, ergibt sich:

\[ \begin{array}{cl} 0 &= E_1 - E_0 = \\ & \triangle p \left( \underbrace { 2 \vec{n} ( \vec{V}_{B0} - \vec{V}_{A0} ) - 2 \langle \vec{\omega}_{A0} , \vec{\rho}_A \times \vec{n} \rangle + 2 \langle \vec{\omega}_{B0} , \vec{\rho}_B \times \vec{n} ) }_{=:a} \right) + \dots\\ & \dots \triangle p^2 \left( \underbrace { \frac{1}{m_A} + \frac{1}{m_B} + \langle \vec{\rho}_A \times \vec{n} , \theta_1^{-1} ( \vec{\rho}_A \times \vec{n} ) \rangle + \langle \vec{\rho}_B \times \vec{n} , \theta_B^{-1} ( \vec{\rho}_B \times \vec{n} ) \rangle }_{=:b} \right) \\ &= \triangle p \cdot a + \triangle p^2 \cdot b \\ \end{array} \]

Diese quadratische Gleichung hat zwei Lösungen. Die eine ist \( \triangle p = 0 \) , was bedeutet, dass beide Objekte ungehindert durcheinander hindurch fliegen (kein Impulsaustausch). Die interessantere Lösung ist

\[ \triangle p = \frac{ a }{ b } \]

mit Reibung ed

Reibung wird in meiner Physik dadurch vereinfacht, dass erst der reibungsfreie Impulsübertrag berechnet wird, dann daraus Reibung in den Richtungen orthogonal und tangential zur Kollisionsebene.

Der orthogonale Anteil ist die Sprungreibung, sie bestimmt, wie stark zum Beispiel ein Ball wieder vom Boden abprallt. Ihr Parameter \( \mu \) ist eine Zahl zwischen 0 und 1, die für 0 in den reibungsfreien Fall übergehen soll und für 1 sollen die Objekte annähernd an einander kleben bleiben.

Dazu wird im obigen, quadratischen Ausdruck ein Minimum gesucht, dieses entspricht dem maximal möglichen Energieverlust. Die Lösung dazu ist \( \triangle p \cdot a + \triangle p^2 \cdot b = \mathrm{min} \Rightarrow \triangle p = \frac{ a }{ 2 b } \) . Und somit kann man den Reibungs-Parameter ganz einfach einbauen durch:

\[ \triangle p = \frac{ a }{ b } ( 1 - \frac{ \mu }{ 2 } ) \]

Der tangentiale Anteil ist komplizierter, benutzt aber grob den reibungslosen Impulsübertrag als Normal-Kraft auf die Oberfläche, wodurch man die üblichen Reibungskräfte berechnen kann....

...irgendwann mehr dazu, sobald ich es selbst wieder verstehe :--(

mehrere Stöße ed

Objekte können bei einer Kollision mehrere Berührpunkte finden. Für diese wird jeweils ein Einzelstoß berechnet und dann entsprechend der jeweiligen Eindringtiefe gewichtet...

...die Reibung wird aber, glaube ich, erst nach der Addition aller Teilstöße berechnet...?

Statik und Gelenke ed

Dieses Thema ist zu umfangreich und hat seine eigene Seite bekommen: Spielephysik mit Zwangsbedingungen

Categories: Blog, Game programming