Standardskalarprodukt: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
 
K (hat „Standard Skalarprodukt“ nach „Standardskalarprodukt“ verschoben: Das ist ein Wort, nicht zwei.)
 
(7 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Standard Skalarprodukt ==
+
== Standardskalarprodukt ==
 
=== Übersicht ===
 
=== Ü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.
+
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 ===
 
=== Definition ===
Zwei Vektoren a,b wird eine eindeutige Zahl ‹a,b› das Skalarprodukt zugeordnet:
+
Zwei Vektoren a, b wird durch eine eindeutige Zahl ‹a,b› das Skalarprodukt zugeordnet:
  ‹a,b› := ||a||*||b||*cos(Phi) 0≤Phi≤Pi
+
  ‹a,b› := ||a||*||b||*cos(φ) 0≤φ≤π
  
 
[[Bild:Std_Skalarprodukt.jpg|right|Skalarprodukt]]
 
[[Bild:Std_Skalarprodukt.jpg|right|Skalarprodukt]]
Haben a,b also die Länge 1, so berechnet das Skalarprodukt ‹a,b› den Cosinus des Zwischenwinkels. Stehen beliebige Vektoren a,b Senkrecht aufeinander, so ist der Winkel gerade Pi/2, der Cosinus also 0 und damit ist das Skalarprodukt gerade dann 0, wenn die beiden Vektoren senkrecht aufeinander stehen. (Beachte: Der Nullvektor ist senkrecht zu allen anderen Vektoren definiert, sogar zu sich selbst.)
+
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, daß man das Standard Skalarprodukt sehr leicht berechenn lässt. Seien a=(a1;a2;a3), b=(b1;b2;b3). Dann gilt:  
+
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  
 
  ‹a,b› = a1*b1 + a2*b2 + a3*b3  
  
 
=== Rechenregeln ===
 
=== Rechenregeln ===
* ‹a,a› entspricht der Länge von a im Quadrat, denn ‹a,a› = ||a||*||a||*Cos(0) = ||a||^2
+
* &lsaquo;a,a&rsaquo; entspricht der Länge von a im Quadrat, denn &lsaquo;a,a&rsaquo; = ||a||*||a||*Cos(0) = ||a||<sup>2</sup>
 
* <div>Linearität in beiden Argumenten:  
 
* <div>Linearität in beiden Argumenten:  
 
  &lsaquo;a + b, c&rsaquo; = &lsaquo;a,c&rsaquo; + &lsaquo;b,c&rsaquo;
 
  &lsaquo;a + b, c&rsaquo; = &lsaquo;a,c&rsaquo; + &lsaquo;b,c&rsaquo;
 
  &lsaquo;a, b + c&rsaquo; = &lsaquo;a,b&rsaquo; + &lsaquo;a,c&rsaquo;
 
  &lsaquo;a, b + c&rsaquo; = &lsaquo;a,b&rsaquo; + &lsaquo;a,c&rsaquo;
  &lsaquo;lambda * a, b&rsaquo; = lambda * &lsaquo;a,b&rsaquo; (Lambda reel)
+
  &lsaquo;&lambda;* a, b&rsaquo; = &lambda;* &lsaquo;a,b&rsaquo; (&lambda; reel)
  &lsaquo;a, lambda * b&rsaquo; = lambda * &lsaquo;a,b&rsaquo;  
+
  &lsaquo;a, &lambda;* b&rsaquo; = &lambda;* &lsaquo;a,b&rsaquo;  
Es ist daher naheliegend das Produkt mit einem Punkt zu shcreiben und die gewohnten Rechenregeln anzuwenden. Deshalb schreibt man häufig auch: a*b := &lsaquo;a,b&rsaquo;. Die Regeln werden dann zu:
+
Es ist daher naheliegend, das Produkt mit einem Punkt zu schreiben und die gewohnten Rechenregeln anzuwenden. Deshalb schreibt man häufig auch: a&bull;b := &lsaquo;a,b&rsaquo;. Die Regeln werden dann zu:
  (a + b).c = a.c + b.c
+
  (a + b)&bull;c = a&bull;c + b&bull;c
  a.(b + c) = a.b + a.c  
+
  a&bull;(b + c) = a&bull;b + a&bull;c  
 
</div>
 
</div>
 
* Kommutativität: &lsaquo;a,b&rsaquo;=&lsaquo;b,a&rsaquo;
 
* Kommutativität: &lsaquo;a,b&rsaquo;=&lsaquo;b,a&rsaquo;
Zeile 27: Zeile 28:
 
=== Beispiel ===
 
=== Beispiel ===
 
==== Kugel - Ray - Intersection ====
 
==== 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:  
+
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,
 
  ||x-p||= r,
 
d.h. der Abstand von x zu p entspricht dem Radius.
 
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 Strah gilt also:
+
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)
 
  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:
 
Um die Schnittpunkte von Kugel und Strahl zu berechnen, wollen wir den Strahl in die Kugel einsetzen:
 
     ||x - p|| = r  
 
     ||x - p|| = r  
  &lsaquo;=&rsaquo; ||x - p||^2 = r^2 (Quadrieren)
+
  &lsaquo;=&rsaquo; ||x - p||<sup>2</sup> = r<sup>2</sup> (Quadrieren)
  &lsaquo;=&rsaquo; ||o + t*d - p||^2 - r^2 = 0
+
  &lsaquo;=&rsaquo; ||o + t*d - p||<sup>2</sup> - r<sup>2</sup> = 0
  &lsaquo;=&rsaquo; ||(o-p) + t*d||^2 - r^2 = 0 (Definiere zur kurzen schreibweise: e := o-p )
+
  &lsaquo;=&rsaquo; ||(o-p) + t*d||<sup>2</sup> - r<sup>2</sup> = 0 (Definiere zur kurzen Schreibweise: e := o-p )
  &lsaquo;=&rsaquo; &lsaquo;e + t*d, e + t*d&rsaquo; - r^2 = 0 (||.||^2 als Skalarprodukt)
+
  &lsaquo;=&rsaquo; &lsaquo;e + t*d, e + t*d&rsaquo; - r<sup>2</sup> = 0 (||.||<sup>2</sup> als Skalarprodukt)
  &lsaquo;=&rsaquo; &lsaquo;e,e&rsaquo; + 2*&lsaquo;e,t*d&rsaquo; + &lsaquo;t*d, t*d&rsaquo; - r^2 = 0  
+
  &lsaquo;=&rsaquo; &lsaquo;e,e&rsaquo; + 2*&lsaquo;e,t*d&rsaquo; + &lsaquo;t*d, t*d&rsaquo; - r<sup>2</sup> = 0  
  &lsaquo;=&rsaquo; ||e||^2 + 2*t*&lsaquo;e,d&rsaquo; + ||t*d||^2 - r^2 = 0
+
  &lsaquo;=&rsaquo; ||e||<sup>2</sup> + 2*t*&lsaquo;e,d&rsaquo; + ||t*d||<sup>2</sup> - r<sup>2</sup> = 0
  &lsaquo;=&rsaquo; |t|^2*||d||^2 + 2*t*&lsaquo;e,d&rsaquo; + ||e||^2 - r^2 = 0
+
  &lsaquo;=&rsaquo; |t|<sup>2</sup>*||d||<sup>2</sup> + 2*t*&lsaquo;e,d&rsaquo; + ||e||<sup>2</sup> - r<sup>2</sup> = 0
Man kann ||d||^2=&lsaquo;d,d&rsaquo;, &lsaquo;e,d&rsaquo; und ||e||^2 - r^2 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.
+
Man kann ||d||<sup>2</sup>=&lsaquo;d,d&rsaquo;, &lsaquo;e,d&rsaquo; und ||e||<sup>2</sup> - r<sup>2</sup> 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]]

Aktuelle Version vom 22. Januar 2011, 19:58 Uhr

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