Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 10:44

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Punkt auf Quad
BeitragVerfasst: Fr Jul 05, 2013 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich such nach einer einfachen Möglichkeit den Punkt auf einem Quad zu bestimmen. Das Quad liegt irgendwo im 3D-Raum und ist entsprechend der Projektion verzerrt. Wenn ich jetzt die Maus auf dem Bild bewege möchte ich wissen welche Position die Maus auf dem Quad hat. Also x und y im Bereich [0, 1] in Abhängigkeit zur Quadgröße. Da gibt es doch sicher schon irgendwo was fertiges, oder?

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Punkt auf Quad
BeitragVerfasst: Fr Jul 05, 2013 13:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du die Position im Raum hast, kannst du einfach auf die lokale X- und Y-Achse des Quads projizieren. Dazu nimmst du deinen Punkt auf dem Quad (nennen wir in r⃗) und den Ursprung (z.B. die untere linke Ecke deines Quads), nennen wir ihn o⃗. Dazu brauchst du noch den Vektor von o⃗ zu einer Ecke in „X“-Richtung des Quads, nennen wir diesen x⃗ und einen von o⃗ zu der Ecke in „Y“-Richtung des Quads, nennen wir diesen dann y⃗. Dann bekommst du die lokalen x und y koordinaten mit:

x = ( r⃗ – o⃗ )⋅x⃗
y = ( r⃗ – o⃗ )⋅y⃗

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Punkt auf Quad
BeitragVerfasst: Fr Jul 05, 2013 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

so wollt ich das auch machen, das Problem ist: Wie komm ich an den 3D Punkt, wenn die Z nicht kenne? Hätte ich Z dann könnte ich schön mit gluUnproject arbeiten. Der Rest wäre dann einfach.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Punkt auf Quad
BeitragVerfasst: Fr Jul 05, 2013 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du Z nicht hast, kannst du nichts machen, sofern du eine perspektivische Projektion hast. Da fehlt dann einfach Information. Wenn du das Quad nicht gerade bunt machen kannst und darin die Position auf dem Quad kodieren, sehe ich da keine Möglichkeiten. Aber vielleicht hat jemand anders da eine bessere Idee.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Punkt auf Quad
BeitragVerfasst: Fr Jul 05, 2013 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Ich habs hin bekommen :) Is nur noch eine kleine Sache, die nich so funzt wie ich will. Ich berechne mir aus dem Frustum und der 2D-Mausposition einen Strahl (mit Punkt und RichtungsVector). Das Quad stell ich als Ebene in der Hesseschen Normalform dar: a*x + b*y + c*z = d => vec4(a, b, c, d). So kann ich ganz einfach den Schnittpunkt zwischen Ebene und Strahl bestimmen:
Code:
  1. vec3(a, b, c) * (Ray.P + ray.V * lambda) - d = 0 //* ist das Skalarprodukt
Der Code dazu sieht wie folgt aus:
Code:
  1. function gluPlaneCrossRay(const aPlane: TgluPlanef; const aRay: TgluRayf; var aPoint: TgluVector3f): Boolean;
  2. var
  3.   lambda, real: Double;
  4.   i: Integer;
  5. begin
  6.   result := false;
  7.   lambda := 0;
  8.   real   := 0;
  9.   for i := 0 to 2 do begin
  10.     lambda := lambda + aRay.v[i] * aPlane[i];
  11.     real   := real   + aRay.p[i] * aPlane[i];
  12.   end;
  13.   if (lambda = 0) then begin
  14.     aPoint := gluVector3f(0, 0, 0);
  15.     exit;
  16.   end;
  17.   lambda := (aPlane[3] - real) / lambda;
  18.   aPoint := gluRayPoint(aRay, -lambda);
  19.   result := true;
  20. end;

Das Problem ist jetzt, das bei einem relativ flachen Winkel zwischen Ebene und Strahl (siehe Bild) das lambda im Algorithmus vom negativen ins positive umkippt und der berechnete Punkt auf einmal wieder näher an die Kamera ran kommt umso weiter man die Maus nach rechts bewegt. Wenn wir für das Problem noch ne Lösung finden könnten wäre ich mehr als happy. :)

MfG Bergmann.


Dateianhänge:
TopView.png
TopView.png [ 6.39 KiB | 11256-mal betrachtet ]

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Punkt auf Quad
BeitragVerfasst: Mi Jul 10, 2013 11:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Bergmann89 hat geschrieben:
Das Problem ist jetzt, das bei einem relativ flachen Winkel zwischen Ebene und Strahl (siehe Bild) das lambda im Algorithmus vom negativen ins positive umkippt und der berechnete Punkt auf einmal wieder näher an die Kamera ran kommt umso weiter man die Maus nach rechts bewegt. Wenn wir für das Problem noch ne Lösung finden könnten wäre ich mehr als happy.


Wenn Du einen Algorithmus bastelst, musst Du auch überlegen, welche Ergebnisse herauskommen können. In diesem Fall sollte doch ein Punkt herauskommen, nicht wahr? Aber in einem Spezialfall kommt eben kein Punkt heraus, sondern viele Punkte (ich habe Deinen Algorithmus nicht überprüft).

Es ist der Spezialfall, wenn die Gerade zwei Bedingungen erfüllt:

1. Wenn sie normal zur Ebene ist: DotProduct(RayDir,PlaneNormal) = 0

2. .... aber zusätzlich noch direkt auf der Ebene liegt ("eingbettet"); das ist ein ziemlich irrer Spezialfall, weil den ein Algorithmus, der einen Ergebnis-Punkt liefern soll, nicht schaffen kann, weil nämlich *viele* Punkte herauskommen. Man könnte das vielleicht lösen, indem man zwei Punkte, die auf der Geraden liegen daraufhin überprüft, ob sie auch in der Ebene liegen.

Ich selber schwindle mich damit durch, dass ich dieses Ergebnis einfach als "ungültig" erkläre und verwerfe:

If Abs(DotProduct(RayDir,PlaneNormal)) > 0.0001 (<== Toleranz einbauen, wichtig!)
Then Begin
...
Result= ...
End
Else Result:= ERRORVECTOR;

Viele Grüße,
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Punkt auf Quad
BeitragVerfasst: Mi Jul 10, 2013 21:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ist mir dann den Tag danach auch iwie eingefallen, das der Vektor * Normale = 0 ist, wenn sie orthogonal zu einader sind. Den Fall hab ich schon abgefangen, da kommt bei mir auch nix raus. Das gleiche trifft zu, wenn der Strahl in der Ebene liegt. Das der Punkt dann auf einmal total "falsch" ist, wenn ich den Strahl noch weiter drehe ist klar, weil der Strahl die Ebene dann nicht mehr im positiven Schneidet, sondern im negativen. Das ist aber auch egal, weil es trotzdem nur einen gleinen Bereich gibt, auf dem der Punkt auf dem Quad gültig ist. Der Rest kann mir ja egal sein :)

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.280s | 19 Queries | GZIP : On ]