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
C-/C++-Quelltext |
|
1 |
void AddRotationAbs(const tbVector3& vAdd) {m_vRotation += tbVector3TransformNormal(vAdd, m_mMatrix);} |
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)); } } |
Zitat von »"Faule Socke"«
Wenn ja, das ist der dekrementoperator
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)); |
Werbeanzeige