Standardskalarprodukt

Aus DGL Wiki
Wechseln zu: Navigation, Suche

Standardskalarprodukt

Übersicht

Das euklidische Standardskalarprodukt oder Punktprodukt dient in der 3D-Grafik meist zur Berechnung von Winkeln, kann jedoch sehr häufig auch eine Reihe anderer Zwecke erfüllen. Die Einsatzorte sind vielfältig, kann man doch damit Reflexionen, Bumpmapping, Collision Detection u.v.m. realisieren.

Definition

Zwei Vektoren a, b wird durch eine eindeutige Zahl ‹a,b› das Skalarprodukt zugeordnet:

‹a,b› := ||a||*||b||*cos(φ) 0≤φ≤π
Skalarprodukt

Haben a, b also die Länge 1, so berechnet das Skalarprodukt ‹a,b› den Kosinus des Zwischenwinkels. Stehen beliebige Vektoren a, b senkrecht aufeinander, so ist der Winkel Pi/2, der Cosinus also 0 und damit das Skalarprodukt 0, wenn die beiden Vektoren senkrecht aufeinander stehen. (Beachte: Der Nullvektor ist senkrecht zu allen anderen Vektoren definiert, sogar zu sich selbst!)

Es lässt sich zeigen, dass man das Standardskalarprodukt sehr leicht berechnen kann. Seien a=(a1;a2;a3), b=(b1;b2;b3), dann gilt:

‹a,b› = a1*b1 + a2*b2 + a3*b3 

Rechenregeln

  • ‹a,a› entspricht der Länge von a im Quadrat, denn ‹a,a› = ||a||*||a||*Cos(0) = ||a||2
  • Linearität in beiden Argumenten:
‹a + b, c› = ‹a,c› + ‹b,c›
‹a, b + c› = ‹a,b› + ‹a,c›
‹λ* a, b› = λ* ‹a,b› (λ reel)
‹a, λ* b› = λ* ‹a,b› 

Es ist daher naheliegend, das Produkt mit einem Punkt zu schreiben und die gewohnten Rechenregeln anzuwenden. Deshalb schreibt man häufig auch: a•b := ‹a,b›. Die Regeln werden dann zu:

(a + b)•c = a•c + b•c
a•(b + c) = a•b + a•c 
  • Kommutativität: ‹a,b›=‹b,a›

Beispiel

Kugel - Ray - Intersection

Gegeben sei eine Kugel um den Mittelpunkt p mit Radius r. Die Bedingung für Punkte x auf der Oberfläche der Kugel ist dann gegeben durch:

||x-p||= r,

d.h. der Abstand von x zu p entspricht dem Radius. Andererseits sei ein Strahl mit Anfang o und Richtung d gegeben. Für Punkte x auf dem Strahl gilt also:

x = o + t*d (t reel, größer gleich 0)

Um die Schnittpunkte von Kugel und Strahl zu berechnen, wollen wir den Strahl in die Kugel einsetzen:

    ||x - p|| = r 
‹=› ||x - p||2 = r2 (Quadrieren)
‹=› ||o + t*d - p||2 - r2 = 0
‹=› ||(o-p) + t*d||2 - r2 = 0 (Definiere zur kurzen Schreibweise: e := o-p )
‹=› ‹e + t*d, e + t*d› - r2 = 0 (||.||2 als Skalarprodukt)
‹=› ‹e,e› + 2*‹e,t*d› + ‹t*d, t*d› - r2 = 0 
‹=› ||e||2 + 2*t*‹e,d› + ||t*d||2 - r2 = 0
‹=› |t|2*||d||2 + 2*t*‹e,d› + ||e||2 - r2 = 0

Man kann ||d||2=‹d,d›, ‹e,d› und ||e||2 - r2 leicht berechnen und erhät so eine quadratische Gleichung für t, die man mit der Mitternachtsformel schnell löst (Anhand der "Determinante" kann man prüfen, ob überhaupt ein Schnitt vorliegt). Die höchstens 2 Lösungen von t kann man dann in den Strahl einsetzen und bekommt die Schnittpunkte.

Siehe auch

Vektorprodukt