3D Math Vektoren
Koordinatensystem
Processing nutzt das sogenannte links-händische Koordinatensystem. Es gibt CAD oder Grafikschnittstellen wie z.b. OpenGL, welche das rechts-händische System nutzten. Dies muss man beachten, dass wenn man Daten von einem Koordinatensystem in das andere transferiert, sprich von Processing zu einem CAD-Programm welches das recht-händische System verwenden. Die im Verlauf dieser Seite erklärten Methoden sind alle für das links-händische System.
Vektoren
Processing besitzt eine Vektor-Klasse:
PVector
Diese Klasse beinhaltet die meisten Funktionen welche im Umgang mit Vektoren gebraucht werden. Doch es gibt einige Kniffe welche man im Umgang mit Vektoren verstehen muss.
Länge eines Vektors errechnen:
PVector vec = new PVector(100,0,0);
float laenge = vec.mag();
Vektor zu einem Einheitsvektor umwandeln:
PVector vec = new PVector(100,0,0);
vec.normalize();
float laenge = vec.mag(); // laenge ist 1.0
Flächennormale finden:
Die Flächennormale ist ein Vektor der rechtwinklig zu einer Fläche steht. Eine Fläche oder eine Ebene kann mit mindestens 3 Vektoren beschrieben werden(Dreieck). Um die Flächennormale von einem Dreieck zu errechnen verwendet man das
Vektor Kreuzprodukt. Die Frontseite der Fläche wird nach der Laufrichtung der Vektoren bestimmt. Die Flächennormale zeigt in die Richtung nach dem Uhrzeigersinn der Vektoren.
PVector p1 = new PVector(0,0,0);
PVector p2 = new PVector(100,0,0);
PVector p3 = new PVector(100,100,100);
PVector u = PVector.sub(p2, p1);
PVector v = PVector.sub(p3, p1);
PVector normal = u.cross(v);
normal.normalize();
Download Code Beispiel
Winkel zwischen Vektoren berechnen:
Um den Winkel zwischen zwei Vektoren zu berechnen verwendet man das
Skalarprodukt. In Processing gibt es schon eine Methode hierfür:
angleBetween(PVector v1, PVector v2)
PVector p1 = new PVector(0,0,0);
PVector p2 = new PVector(100,0,0);
PVector p3 = new PVector(100,100,100);
PVector u = PVector.sub(p1,p2);
PVector v = PVector.sub(p3,p2);
u.normalize();
v.normalize();
float winkelRad = acos(u.dot(v));