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