Vektorrechnung, brauche Hilfe ^^
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
ja, mach ein tut draus....
such dir ne oberfläche, wo man das schrittweise nachvollziehen kann,
und wenn du die 3D-commands von PB benutzt, egal.
pack dieses wissen in ne gute story, und die Leute lernen von dir und sind dir ewig dankbar!
such dir ne oberfläche, wo man das schrittweise nachvollziehen kann,
und wenn du die 3D-commands von PB benutzt, egal.
pack dieses wissen in ne gute story, und die Leute lernen von dir und sind dir ewig dankbar!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
OK, das war mir auch klar - aber wie du vielleicht an meinem Code siehst wurde das mit x = p + r*a + s*b nichts. Als ich dann die Ebene mit n*x = -p definierte kam ich zu einem Ergebnis - hatte nun aber kein "r" und kein "s". Nur t und den Schnittpunkt und anhand der Werte rauszubekommen ob man nu das Dreieck getroffen hat ist nicht so einfach - denke ich.STARGÅTE hat geschrieben:mit dem Punkt im Dreieck:
Ein Dreieck/Ebene besteht aus einem Stützvektor und 2 Richtungsvorktoren welche eine Ebene Aufspannen und beim Dreieck gleichzeitig 2 von den 3 Seiten bilden.
Nun möchte ich prüfen ob ein Punkt im Dreieck liegt. Also versuche ich vom Dreiecksstützvektor zum Schnittpunkt zu kommen, indem ich vor den 2 Richtungsvektoren Faktoren setzte, sodass x = p + r*a + s*b (x Schnittpunkt, p Stützvektor, a & b Richtungsv. )
Ich erhalte nun ein r und ein s
dann muss diese Gleichung gelten 1 >= r + s und r>0 und s>0 damit der Punkt im Dreieck ist.
Der Grund dafür ist, wenn r oder s kleiner als 0 wäre würde der Punkt auf jedenfall außerhalb liegen (hinter dem Dreieck)
würde r + s > 1 sein, würde der Punkt auch außerhalb liegen.
Wenn entweder r =1 oder s=1 wäre würde der Schnittpunkt genau auf einem der Dreiecks-Ecken liegen

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
ach so du hast das mit der Normalen Form gemacht.
Gut, aber dann ist das mit r s trotzdem einfach
Es bleibt ja bei der Gleichung x = p + r*a + s*b
wenn du nun umstellst nach zB r:
r = ( x-p - s*b ) / a
nun zerlegen wir das in die 3 Raumgleichungen
r = ( xx-px - s*bx ) / ax
r = ( xy-py - s*by ) / ay
r = ( xz-pz - s*bz ) / az
Da brauchen wir ja jetzt nur noch 2 gleich setzten hier mal I und II
( xx-px - s*bx ) / ax = ( xy-py - s*by ) / ay
jetzt n bisschen umstellen:
s = ( ax*(xy-py) - ay*(xx-px) ) / (by*ax-bx*ay)
ja und dann s oben rein, und r ausrechnen
Sry, ich weiß sieht alles sehr komplex aus, aber das ist es nicht^^
Leider kann ich hier im Forum kein Formeleditor anwenden...
Gut, aber dann ist das mit r s trotzdem einfach
Es bleibt ja bei der Gleichung x = p + r*a + s*b
wenn du nun umstellst nach zB r:
r = ( x-p - s*b ) / a
nun zerlegen wir das in die 3 Raumgleichungen
r = ( xx-px - s*bx ) / ax
r = ( xy-py - s*by ) / ay
r = ( xz-pz - s*bz ) / az
Da brauchen wir ja jetzt nur noch 2 gleich setzten hier mal I und II
( xx-px - s*bx ) / ax = ( xy-py - s*by ) / ay
jetzt n bisschen umstellen:
s = ( ax*(xy-py) - ay*(xx-px) ) / (by*ax-bx*ay)
ja und dann s oben rein, und r ausrechnen
Sry, ich weiß sieht alles sehr komplex aus, aber das ist es nicht^^
Leider kann ich hier im Forum kein Formeleditor anwenden...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
@Laurin ...
http://rapidshare.de/files/38815052/Abi ... k.zip.html
pssst, haste aber nicht von mir
Ansonsten den Wiki fragen, der weiß das auch.
Ich will dir keine falschen Versprechungen machen, aber ich werde nicht drum herum kommen, das bei meinem Projekt ebenfalls zu berechnen, wann sich irgendwas im Raum schneidet.
Mit Normalen-Vektoren kann man ganz gut Ebenen im Raum beschreiben.
Da man für Meshes allerdings noch zwei Begrenzugen auf der Ebene benötigt und einen Winkel, der die Drehung einer Fläche auf einer Ebene beschreibt, werde ich wohl mit einem Normalen-Vektor allein nicht auskommen. Aber du darfst auf das Resultat gespannt sein.
Kannst gern bei neuen Erkenntnissen an diesem Projekt teilnehmen.
http://www.purebasic.fr/german/viewtopic.php?t=15857
(für Stargate gibt es auch kein Verbot
)

http://rapidshare.de/files/38815052/Abi ... k.zip.html
pssst, haste aber nicht von mir

Ansonsten den Wiki fragen, der weiß das auch.
Ich will dir keine falschen Versprechungen machen, aber ich werde nicht drum herum kommen, das bei meinem Projekt ebenfalls zu berechnen, wann sich irgendwas im Raum schneidet.
Mit Normalen-Vektoren kann man ganz gut Ebenen im Raum beschreiben.
Da man für Meshes allerdings noch zwei Begrenzugen auf der Ebene benötigt und einen Winkel, der die Drehung einer Fläche auf einer Ebene beschreibt, werde ich wohl mit einem Normalen-Vektor allein nicht auskommen. Aber du darfst auf das Resultat gespannt sein.
Kannst gern bei neuen Erkenntnissen an diesem Projekt teilnehmen.
http://www.purebasic.fr/german/viewtopic.php?t=15857
(für Stargate gibt es auch kein Verbot


Kinder an die Macht http://scratch.mit.edu/
Danke Xaby
Wenn ich zuhause bin, schau ich mir das mal an.
Ich will sowas ähnliches machen wie du: Raytracing. Zumindest eine simple Version. Ich hab mir auch schon so einiges überlegt und geschrieben, aber es happert ja noch an der Vektorrechnung bzw. Strahlverfolgung. Wenn das Problem gelöst ist, kann ich beliebige 3D-Modelle (deshalb das Dreieck) rendern.
Ich hab gemerkt, dass mir die Grundlagen zum größten Teil fehlen bzw ich sie vergessen habe (das ist alles schon ein paar Jahre her). Hoffentlich bekomme ich das endlich auf die Reihe.

Wenn ich zuhause bin, schau ich mir das mal an.
Ich will sowas ähnliches machen wie du: Raytracing. Zumindest eine simple Version. Ich hab mir auch schon so einiges überlegt und geschrieben, aber es happert ja noch an der Vektorrechnung bzw. Strahlverfolgung. Wenn das Problem gelöst ist, kann ich beliebige 3D-Modelle (deshalb das Dreieck) rendern.
Ich hab gemerkt, dass mir die Grundlagen zum größten Teil fehlen bzw ich sie vergessen habe (das ist alles schon ein paar Jahre her). Hoffentlich bekomme ich das endlich auf die Reihe.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
And we're out of beta. We're releasing on time.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Hab auch noch einen Link von mir:
http://www.purebasic.fr/german/viewtopic.php?t=3452
Da wird zwar nur der Schnittpunkt einer Linie und eines Dreiecks überprüft,
aber der Unterschied ist nur eine Zeile.
Aber irgendwo müsste im Forum auch noch ein Code für Strahlen rumfliegen.
In meiner Raytracing-Engine hab ich auf jeden Fall sowas drin. Braucht man
ja.
Die Procedure aus dem Link oben sollte eigentlich sehr schnell sein. Hab aber
auch schon andere Ideen die Kollision mit einem Dreieck zu verwirklichen,
nur noch nie programmiert.
http://www.purebasic.fr/german/viewtopic.php?t=3452
Da wird zwar nur der Schnittpunkt einer Linie und eines Dreiecks überprüft,
aber der Unterschied ist nur eine Zeile.
Aber irgendwo müsste im Forum auch noch ein Code für Strahlen rumfliegen.
In meiner Raytracing-Engine hab ich auf jeden Fall sowas drin. Braucht man
ja.
Die Procedure aus dem Link oben sollte eigentlich sehr schnell sein. Hab aber
auch schon andere Ideen die Kollision mit einem Dreieck zu verwirklichen,
nur noch nie programmiert.
Ich hab mir das angeschaut, Xaby und das Material ist echt gut. Ich hab auf Anhieb verstanden, wie ich aus den Eckpunkten des Dreiecks auf die Parameterform der Ebene komme. Ist eigentlich ganz einfach
Wie man auf den Schnittwinkel kommt, steht da auch. Und so einigermaßen komme ich da auch dahinter.
Edit:
D'oh, jetzt hat da Nic kurz vor mir gepostet
Deinen Code schaue ich mir genauer an, wenn ich mir ein paar Dinge überlegt und durchgerechnet habe. Sonst blicke ich bei deinen Rechnungen vermutlich nicht durch

Wie man auf den Schnittwinkel kommt, steht da auch. Und so einigermaßen komme ich da auch dahinter.

Edit:
D'oh, jetzt hat da Nic kurz vor mir gepostet

Deinen Code schaue ich mir genauer an, wenn ich mir ein paar Dinge überlegt und durchgerechnet habe. Sonst blicke ich bei deinen Rechnungen vermutlich nicht durch

Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
And we're out of beta. We're releasing on time.
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Um einen Strahl an einer Ebene zu spiegeln, braucht man keinen
(Co)Sinus, sondern das macht man so:
R als Stützpunkt und Richtung: s+µd [Strahl (Ray)]
P als Normalform: n * (x - a) = 0 [Ebene (Plane)]
I als Koordinaten: v [Schnittpunkt (Intersection)]
M als Stützpunkt und Richtung: t+λe [Spiegelstrahl (Mirrored Ray)]
Man nimmt R und P und berechnet I.
Zuerst R in P einsetzen um µ zu erhalten.
n * ((s + µd) - a) = 0
n*(s+µd) - n*a = 0
n*s + n * µd = n*a
µ * n*d = n*a - n*s
µ = (n*a - n*s)/(n*d)
µ = n*(a-s)/(n*d)
Dann mit µ I ausrechnen.
I = s + µ*d
Dann den Spiegelstrahl ausrechnen.
Zunächst die relative Entfernung γ von I + d zur Ebene berechnen.
n*((I + d + γn) - a) = 0
n*I + n*d + n* γn - n*a = 0
γ * n*n = n*a - n*I - n*d
γ = (n*a -n*I - n*d)/(n*n)
Diese dann verdoppeln und auf I + d addieren, damit wir T erhalten.
T = I + d + 2*γ*n
Jetzt können wir den Spiegelstrahl berechnen.
M = I + λ*(T-I)
Ich weiß jetzt nicht wie weit ihr das mitverfolgen konntet, aber es ist auf
jeden Fall ganz einfach. Es reicht auch eine 2D-Zeichnung um sich das
vorzustellen.
///Edit 1:
ŋ durch λ ersetzt und dann þ durch ŋ ersetzt.
///Edit 2:
ŋ durch γ ersetzt.
(Co)Sinus, sondern das macht man so:
R als Stützpunkt und Richtung: s+µd [Strahl (Ray)]
P als Normalform: n * (x - a) = 0 [Ebene (Plane)]
I als Koordinaten: v [Schnittpunkt (Intersection)]
M als Stützpunkt und Richtung: t+λe [Spiegelstrahl (Mirrored Ray)]
Man nimmt R und P und berechnet I.
Zuerst R in P einsetzen um µ zu erhalten.
n * ((s + µd) - a) = 0
n*(s+µd) - n*a = 0
n*s + n * µd = n*a
µ * n*d = n*a - n*s
µ = (n*a - n*s)/(n*d)
µ = n*(a-s)/(n*d)
Dann mit µ I ausrechnen.
I = s + µ*d
Dann den Spiegelstrahl ausrechnen.
Zunächst die relative Entfernung γ von I + d zur Ebene berechnen.
n*((I + d + γn) - a) = 0
n*I + n*d + n* γn - n*a = 0
γ * n*n = n*a - n*I - n*d
γ = (n*a -n*I - n*d)/(n*n)
Diese dann verdoppeln und auf I + d addieren, damit wir T erhalten.
T = I + d + 2*γ*n
Jetzt können wir den Spiegelstrahl berechnen.
M = I + λ*(T-I)
Ich weiß jetzt nicht wie weit ihr das mitverfolgen konntet, aber es ist auf
jeden Fall ganz einfach. Es reicht auch eine 2D-Zeichnung um sich das
vorzustellen.
///Edit 1:
ŋ durch λ ersetzt und dann þ durch ŋ ersetzt.

///Edit 2:
ŋ durch γ ersetzt.

Zuletzt geändert von NicTheQuick am 14.03.2008 00:54, insgesamt 2-mal geändert.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22