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 />

Kollision beieinander befinden. Falls nicht, kann die Kollisionserkennung an dieser Stelle schon<br />

wieder verlassen werden.<br />

float radius, distance, depth = environment.Tolerance;<br />

Vector3 point, normal = bodyA.Position – bodyB.Position;<br />

if (normal.LengthSq() > Math.Pow(bodyA.Radius + bodyB.Radius, 2) +<br />

environment.Tolerance)<br />

{ currentState = State.CLEAR; return; }<br />

Als nächster Schritt wird anhand dieses Mittelpunktvektors bestimmt,<br />

welche Flächen der beiden Objekte einander zugewandt sind. Da es sich in<br />

unserer Simulation einheitlich um konvexe Polyeder mit in etwa<br />

gleichmäßiger räumlicher Ausdehnung handelt, können wir davon ausgehen,<br />

dass nur diese beiden Flächen einander berühren können.<br />

faceA = Oriented.FaceTowards(bodyA, normal);<br />

faceB = Oriented.FaceTowards(bodyB, -normal);<br />

Die FaceTowards() Methode wird von der statischen Hilfsklasse Oriented<br />

zur Verfügung gestellt. Die Winkelbestimmung erfolgt über den Vergleich der Skalarprodukte mit<br />

der Normale jeder Fläche.<br />

public static class Oriented<br />

{<br />

...<br />

public static ISurface FaceTowards(IObject Object, Vector3 Normal)<br />

{<br />

return Object.Faces[FaceIndexTowards(Object, Normal)];<br />

}<br />

public static int FaceIndexTowards(IObject Object, Vector3 Normal)<br />

{<br />

float last = 0f, least = 0f;<br />

int index = -1;<br />

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

{<br />

last = Vector3.Dot(Oriented.Normal(Object.Faces[i]), Normal);<br />

if (last < least)<br />

{<br />

least = last;<br />

index = i;<br />

}<br />

}<br />

}<br />

public static float Distance(ISurface Surface, Vector3 Vector)<br />

{<br />

return Vector3.Dot(Vector - (Corners(Surface)[0] + Surface.Object.Position),<br />

Normal(Surface));<br />

}<br />

...<br />

}<br />

Sobald die zugewandten Flächen feststehen, wird für jeden der Eckpunkte<br />

überprüft, ob er die Fläche des anderen Objektes durchdringt. Die<br />

Koordinaten jedes Eckpunktes sind relativ zu ihrem Objekt<br />

angegeben, daher wird zunächst die absolute Position bestimmt.<br />

Die Distanzermittlung behandelt die Fläche allerdings als Ebene<br />

von unbegrenzter Ausdehnung, daher muss, selbst wenn<br />

Seite 22 / 37

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!