02.11.2013 Aufrufe

Würfelsimulator

Würfelsimulator

Würfelsimulator

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

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

dTime * Object.RotAccaleration.Length()));<br />

Orientation.Multiply(Matrix.RotationAxis(Object.Rotation, dTime *<br />

Object.Rotation.Length()));<br />

Object.Orientation = Orientation;<br />

Object.Rotation += dTime * Object.RotAccaleration;<br />

Oriented.Reset(Object);<br />

}<br />

}<br />

Kollisionserkennung<br />

Die Kollisionserkennung wird nach jedem Intervallschritt einmal angestoßen. Zunächst werden alle<br />

im letzten Schritt gefundenen Kollisionen verworfen und danach für jede Objekt-Objekt bzw.<br />

Objekt-Wand Kombination, die nicht stillsteht, eine Kollisionsinstanz erzeugt und per Detect() auf<br />

ihren Status geprüft. Alle gefundenen Kollisionen werden zur Behandlung in die Liste<br />

aufgenommen, wobei der „tiefste“ Status zur Steuerung an die Intervallhalbierung zurückgegeben<br />

wird.<br />

private Collision.State DetectAllCollisions()<br />

{<br />

Collision.State currentState = Collision.State.UNDEFINED;<br />

collisions.Clear();<br />

for (int i = 0; i < objects.Length; i++)<br />

{<br />

foreach (ISurface wall in walls)<br />

{<br />

if (!objects[i].Resting)<br />

{<br />

Collision col = new WallCollision(objects[i], wall, this);<br />

col.Detect();<br />

Collision.State stat = col.CheckState;<br />

if (stat > Collision.State.SEPERATING)<br />

collisions.Add(col);<br />

if (stat > currentState)<br />

currentState = stat;<br />

}<br />

}<br />

for (int j = i + 1; j < objects.Length; j++)<br />

{<br />

if (!objects[i].Resting || !objects[j].Resting)<br />

{<br />

Collision col = new BodyCollision(objects[i], objects[j], this);<br />

col.Detect();<br />

Collision.State stat = col.CheckState;<br />

if (stat > Collision.State.SEPERATING)<br />

collisions.Add(col);<br />

if (stat > currentState)<br />

currentState = stat;<br />

}<br />

}<br />

}<br />

return currentState;<br />

}<br />

Die Implementierung der Detect() Methode unterscheidet sich in den verschiedenen<br />

Kollisionsarten. Beispielhaft soll hier nun der Ablauf für die BodyCollision (Objekt-Objekt-<br />

Kollision) gezeigt werden. Der Code der WallCollision (Objekt-Wand-Kollision) ist prinzipiell nur<br />

eine Untermenge davon, bei der eines der Objekte als eine einzelne, statische Fläche angenommen<br />

werden kann.<br />

Zu Beginn der Methode wird eine Initialisierung der benötigten Variablen<br />

vorgenommen. Die Kollisionsnormale wird zunächst als Vektor zwischen<br />

den Mittelpunkten der beiden Objekte approximiert, um mithilfe der Radien<br />

der beiden Objekte zu testen, ob sie sich überhaupt nah genug für eine<br />

Seite 21 / 37

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!