Raytracer Vektorrechnung < Vektoren < Lin. Algebra/Vektor < Oberstufe < Schule < Mathe < Vorhilfe
|
Ich möchte (muss für die Schule) einen Raytracer programmieren.
Dazu hab ich mir die benötigte Mathematik mal überlegt, und erste theoretische Ansätze gemacht.
Nun habe ich folgendes Problem: Ich habe eine Kamera, die definiert ist durch eine Position, einen Vektor wohin sie guck und einen Vektor der nach oben zeigt (für die Z-Achsenrotation). Daraus muss ich jetzt 4 Punkte berechnen die quasi die Bildebene wiedergeben. (Das Prinzip ist ja, dass man von der Kamera durch jeden Punkt im Bildschirm einen Strahl schießt und guckt wo er was trifft). Dazu habe ich die Auflösung und einen Winkel für das Sichtfeld.
Meine erste Idee war das ersteinmal 2D anzugehen, quasi von oben. Dadruch würde man die Punkte berechnen die links und rechts genau in der Mitte der Fläche liegen. Hat man die, kann man durch den nach obne zeigenden Vektor die 4 gesuchten Punkte unter berücksichtigung der Seitenverhältnisse relativ einfach ausrechnen.
v Vektor der angibt wohin die Kamera guckt
u Vektor der von der Kamera nach oben zeigt
a Vektor von Kamera zum gesuchten Punkt
[mm] \alpha [/mm] Winkel fürs Sichtfeld / 2
Um die ersten beiden Punkte zu errechnen hatte ich folgenden Ansatz:
Zwischen a und v muss ien Winkel von [mm] \alpha [/mm] sein.
a und u müssen senrecht zueinander sein.
[mm] a\*v=\alpha
[/mm]
[mm] a\*u=0
[/mm]
[mm] a\*v-\alpha=a\*u
[/mm]
[mm] a\*v [/mm] - [mm] a\*u =\alpha
[/mm]
[mm] a\*(v-u)=\alpha
[/mm]
So, normalerweise müssten jetzt 2 Punkte rauskommen, wiel es eigneltich genau 2 Lösungen geben müsste. Da ich u und v habe könnte ich es vorberechnen, hätte dann alerdings 2 Vektoren und ihren Winkle in der Gelicung. Da einer der Vektoren unbekannt ist, schein ich das nicht auflösen zu können, denn es gibt zu einem Vektor ja Prinzipiell unendlich viele andere Vektoren die einen bestimmten Winkel zm ersten haben.
Was muss ich machen, damit ich die beidne Punkte, bzw Vektoren a1 und a2 berechnen kann?
Wem ich das mit dem Raytracerprinzip zu ungenau erklärt habe, findet auf Wikipedia eine ausführlicherere Version.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:40 Di 22.08.2006 | Autor: | goeba |
Hi,
das Problem ist in der Tat, dass die Lösung nicht eindeutig sein kann.
Am Einfachsten kannst Du das umgehen, indem Du die Vektoren u und v normierst, das heißt durch ihre eigene Länge teilst.
Viele Grüße,
Andreas
|
|
|
|
|
Versteh ich nciht, wie ich das machen soll.
Mein Mathelehrer hat auch was von Längen geredet, und das mans auch mit Ebenen machen kann. Tja, damit hatte ich kein Erfolg. ich hab die Parameterebenengelchung (oder wie die heißt) ax.by.cz+d=0 genommen.
Da ich anfangs ja die Kameraposition bei 0 hatte (das braucht ja erst beim Ausgangsvektor der Geradengelichungen brücksichtig werden) habe ich wieder das Kreuzprodukt also, genau das wie in meinem ersten Ansatz.
Ich komme wieder auf 2 Geichugen, die einen Vektor und einen Winkel zu einem andern Vektor beinhalten und muss daraus den Vektor bestimmen.
Ich meine, Mathematisch muss es möglich sein, einen Vektor zu bestimmen, der zu einem Vektor senkrecht ist und zu einem andern einen festen Winkel hat. Bzw. eigentlich müssen es ja zwei sein. Ich brauch auch 2 daher passt das ja perfekt.
Ich denke man muss das irgendwie anders umformen. Über die Längen geht es irgendwie auch nicht, da die ja alle 1 sein müssten (u und v sind auf jeden Fall normalisiert, bei a ist es egal wie lang der wird, 1 wäre natürlich nicht schlecht).
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:47 Mi 23.08.2006 | Autor: | LittleJon |
Ich habe mir weitere Gedanken gemacht.
Prinzipiell will ich den Vektor v um Alpha Grad drehen würde. Als drehachse müsste der Vector u dienen. Dafür muss es doch eine Mathematische Formel gegen?
|
|
|
|
|
Hallo.
Das Problem ist in der Tat, daß es eine unendlich große Auswahl an Lösungen für das Problem gibt. Das liegt daran, daß, wenn ein Vektor a zu einem Vektor b senkrecht ist und zum Vektor c den Winkel alpha hat, so ist prinzipiell auch z.B. der Vektor 2a eine Lösung des Problems. Das führt uns aber auch schon zur Lösung dieser Schwierigkeit, denn der Trick besteht darin, die Länge des Vektors a vorzugeben, am besten auf 1. Damit bekommst Du eine neue Gleichung dazu, nämlich $|a|=1 [mm] \gdw \left|\vektor{a_x \\ a_y \\ a_z}\right|^2=1 \gdw a_x^2+a_y^2+a_z^2=1$.
[/mm]
Dadurch bekommst Du dann genau die 2 Lösungen, die Du Dir vorstellst.
Gruß,
Christian
|
|
|
|
|
Soll ich also das Gleichungssystem so aufbauen, dass eine Bedingung der Winkel zu v-Cektor ist, und die Zweite, das das Vektorprodukt des zu errechneten Vektors a und dme v-Vektor den u Vekotr ergeben soll?
Weil, ansonsten wüsste ich nicht wie ich sonst mit dem Kreizprodukt rechnen sollte.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:41 Do 24.08.2006 | Autor: | felixf |
Hallo!
> Soll ich also das Gleichungssystem so aufbauen, dass eine
> Bedingung der Winkel zu v-Cektor ist, und die Zweite, das
> das Vektorprodukt des zu errechneten Vektors a und dme
> v-Vektor den u Vekotr ergeben soll?
Du solltest kein Gleichungssystem aufstellen, sondern damit direkt die Vektoren `rechts' und `oben' fuer die Projektionsflaeche ausrechnen.
Du hast am Anfang einen Vektor $v$, der nach vorne zeigt, und einen Vektor $u$, der nach oben zeigt. Das Kreuzprodukt $r := v [mm] \times [/mm] u$ zeigt dann nach rechts, und $r [mm] \times [/mm] v$ zeigt nach oben (wenn $v$ und $u$ nicht senkrecht zueinander waren, solltest du besser diesen Vektor als oben-Vektor nehmen). Die Vektoren normierst du dann alle, und damit kannst du dir dann die Projektionsflaeche basteln durch die du die Strahlen schiesst.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:18 Do 24.08.2006 | Autor: | LittleJon |
So, ich habe jetzt endlich einen gescheiten Ansatz der funktionieren sollte.
Wenn ich nun also den Vektor Oben (Vektor U) den nach vorne (Vektor V) und den nach links oder rechts haben (Vektor R), die alle die Länge eins haben, müsste ich doch nur noch den tangensdes Winkels bestimmen, und zum Vektor V den Vektor [mm] R*tan(\alpha) [/mm] addieren. Und zwar einmal den Original Vektor und einmal den negativen Vektor um so die beidne gesuchten Punkte zu erhalten.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:37 Do 24.08.2006 | Autor: | felixf |
Hallo!
> So, ich habe jetzt endlich einen gescheiten Ansatz der
> funktionieren sollte.
>
> Wenn ich nun also den Vektor Oben (Vektor U) den nach vorne
> (Vektor V) und den nach links oder rechts haben (Vektor R),
> die alle die Länge eins haben, müsste ich doch nur noch den
> tangensdes Winkels bestimmen, und zum Vektor V den Vektor
> [mm]R*tan(\alpha)[/mm] addieren. Und zwar einmal den Original Vektor
> und einmal den negativen Vektor um so die beidne gesuchten
> Punkte zu erhalten.
Genau.
Viel Spass beim weiteren Formeln finden und Implementieren
LG Felix
|
|
|
|