Würfelsimulator
Würfelsimulator
Würfelsimulator
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