Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

12.01.2017, 20:45

Berechnung einer projizierten 2D-Koordinate

Hallo Zusammen,

ich hänge grad an einem mathematischem Problem, wo ich merke, ich bin etwas eingerostet. Ich brauche es für ein Spiel, bei dem ich UI in ein 3D-Quad rendern kann. Damit ich vernünftige Hittests machen kann, möchte ich die 2D-Koordinate relativ zum 3D-Quad in einer vorgegeben Zielauflösung haben. Ich habe es aufgezeichnet:



Es handelt sich also um ein 3D-Quad, welches die Breite a und die höhe b im Worldspace hat. Zusätzlich ist die Worldposition in der Mitte (p). Zu diesem ebenen Quad sei mir auch die dazu gehörige Normale n bekannt, die in Richtung des Betrachter orientiert ist.

Ich möchte jetzt, wenn ich mit der Maus über das Quad fahre, die projizierte 2D-Koordinate d für das Koordinatensystem in grün haben. Die Skalierung des Koordinatensystems kann identisch sein wie zu den Weltkoordinaten sein.

Mein Weg ist bisher wie folgt:

1) Projektion von Screenkoordinate zu 3D-Ray mittels Rückprojektion
2) Plane-Ray intersection, Zielpunkt auf der Ebene bestimmen -> nennen wir diesen Punkt i
3) Differenzvektor von p zu i bilden.

Allerdings kann ich jetzt natürlich nicht die Komponenten des Differenzvektors aus 3) relativ zur oberen Linken ecke nehmen, weil das Quad ja gedreht ist. Ich hoffe jemand kann mir folgen und mir einen Tipp geben, wie ich an die Position herankomme.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TrommlBomml« (12.01.2017, 20:51)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

12.01.2017, 20:54

Ist das Quad ein Rechteck, also sind gegenüberliegende Seiten gleich lang?

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

12.01.2017, 21:00

Ja, ich habe es perspektivisch verkürzt gezeichnet. Also es ist ein leicht um die Y-Achse gedrehtes Rechteck.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

12.01.2017, 21:37

Sei §\vec{d}§ der Punkt im Quad, §\vec{O}§ der Ursprung des Quads (die Ecke, an der du gerne (0, 0) als 2D-Koordinaten hättest), §\vec{X}§ die x-Achse des Quads und §\vec{Y}§ die y-Achse (alles 3D-Vektoren im selben Koordinatensystem), wobei §\vec{X}\cdot\vec{Y}=0§. Dann suchen wir die 2D-Koordinaten §(u,\ v)§ des Punkts §\vec{d}§, so dass gilt:

§\vec{d}=\vec{O}+u\cdot\vec{X}+v\cdot\vec{Y}§

Hierbei bedeutet §\cdot§ die Vektor-Skalar-Multiplikation.

Die 2D-Koordinaten lassen sich recht einfach berechnen:

§u=\frac{(\vec{d}-\vec{O})\cdot\vec{X}}{\vec{X}^2},\ v=\frac{(\vec{d}-\vec{O})\cdot\vec{Y}}{\vec{Y}^2}§

Hierbei bedeutet §\cdot§ das Skalarprodukt.
§\vec{X}^2§ ist die quadrierte Vektorlänge, also das Skalarprodukt des Vektors mit sich selbst.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

12.01.2017, 21:43

Sei §\vec{d}§ der Punkt im Quad, §\vec{O}§ der Ursprung des Quads (die Ecke, an der du gerne (0, 0) als 2D-Koordinaten hättest), §\vec{X}§ die x-Achse des Quads und §\vec{Y}§ die y-Achse (alles 3D-Vektoren). Dann suchen wir die 2D-Koordinaten §(u,\ v)§ des Punkts, so dass gilt:

§\vec{d} = \vec{O} + u\cdot\vec{X} + v\cdot\vec{Y}§

Die 2D-Koordinaten lassen sich recht einfach berechnen:

§u = \frac{(\vec{d} - \vec{O}) \cdot \vec{X}}{\vec{X}^2},\ v = \frac{(\vec{d} - \vec{O}) \cdot \vec{Y}}{\vec{Y}^2}§

Hierbei bedeutet §\cdot§ das Skalarprodukt. §\vec{X}^2§ ist die quadrierte Vektorlänge, also das Skalarprodukt des Vektors mit sich selbst.


Gut, das probiere ich gleich mal aus. Dazu aber noch ein paar Fragen:

1) Bei den Multiplikationen handelt es sich natürlich um Skalarprodukte, alles andere macht ja keinen Sinn, richtig?
2) Die Vektoren §\vec{X}§ und §\vec{Y}§ sind normiert/müssen normiert sein?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

12.01.2017, 21:44

Ich habe meinen Beitrag angepasst, während du deine Fragen gestellt hast ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

12.01.2017, 21:47

... und wenn die Vektoren normiert sein müssten, würde ich nicht ihre Länge berechnen ;)

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

12.01.2017, 21:53

Ok, ich glaube ich weiß, worauf du hinaus willst. Ich teste es mal aus und gucke was für Koordinaten rauskommen. Falls ich nach längerem grübeln kein richtiges Ergebnis bekomme, würde ich den Code posten. Solange erstmal danke! :)

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

12.01.2017, 22:11

Funktioniert perfekt, vielen Dank David!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

Werbeanzeige