02.11.2013 Aufrufe

Würfelsimulator

Würfelsimulator

Würfelsimulator

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

PDA-Programmieren • "<strong>Würfelsimulator</strong>" • SS10 • Simon Brennecke • Ivo Torp • Klaus Manneck<br />

Durchdringung<br />

Durchdringung<br />

Keine Kollision<br />

Kollision<br />

Bewegung<br />

Um die Objekte zu bewegen, muss zuerst einmal deren Beschleunigung bestimmt werden, wie oben<br />

bereits erwähnt. Die wirkenden Kräfte, die von der libPhysics berücksichtigt werden, sind die<br />

geschwindigkeitsabhängige Dämpfung (die auf jede Bewegung wirkt) und Gravitation (die nur<br />

Translation betrifft).<br />

private void CalculateAllAccelerations()<br />

{<br />

foreach (IObject body in objects)<br />

CalculateAcceleration(body);<br />

}<br />

private void CalculateAcceleration(IObject Object)<br />

{<br />

if (!Object.Resting)<br />

{<br />

Object.TransAcceleration = new Vector3();<br />

Object.TransAcceleration += gravity;<br />

Object.TransAcceleration -= transDamping * Object.Velocity;<br />

}<br />

}<br />

Object.RotAccaleration = new Vector3();<br />

Object.RotAccaleration -= rotDamping * Object.Rotation;<br />

Nachdem die Beschleunigungen für dieses Intervall feststehen, können alle Objekte entsprechend<br />

bewegt werden. Hierbei ist zu beachten, dass durch die Annahme einer konstanten Beschleunigung<br />

innerhalb eines Intervalls eine Rechnung in beide zeitlichen Richtungen möglich ist. Dies ist für die<br />

oben genannte Intervallhalbierung von besonderer Wichtigkeit.<br />

private void MoveAll(float dTime)<br />

{<br />

foreach (IObject body in objects)<br />

{<br />

Translate(body, dTime);<br />

Rotate(body, dTime);<br />

}<br />

}<br />

private void Translate(IObject Object, float dTime)<br />

{<br />

if (!Object.Resting)<br />

{<br />

Object.Position += dTime * Object.Velocity + 0.5f * dTime * dTime *<br />

Object.TransAcceleration;<br />

Object.Velocity += dTime * Object.TransAcceleration;<br />

}<br />

}<br />

private void Rotate(IObject Object, float dTime)<br />

{<br />

if (!Object.Resting)<br />

{<br />

Matrix Orientation = Object.Orientation;<br />

Orientation.Multiply(Matrix.RotationAxis(Object.RotAccaleration, 0.5f * dTime *<br />

Seite 20 / 37

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!