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