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

1

15.01.2018, 13:28

"Punktverschiebung" bei Betrachtung zweier Kameras

Hallo,
ich habe da eine Problemstellung, bei der ich ein wenig Hilfe gebrauchen könnte:

Ich habe einen festen Punkt (zb. P=(1,0,0)) und zwei Kameralagen K1,K2 mit unterschiedlicher Position und Orientierung.
Der Punkt wird von beiden Kameras aufgenommen und ich möchte den Abstand der aufgenommenen Punkte zueinander berechnen. (Ähnlich eines Rückprojektsionsfehlers, aber im 3D Raum).

Meine Idee war bisher folgende:
1. Man verschiebe P um den Vektor K1,Z. (Z=Zentrum (0,0,0))
2. Man drehe P um die Differenz der Orientierungen der Kameras.
3. Man verschiebe P um den Vektor Z,K2
4. Man berechne die euklidische Distanz von P_original und P_verschoben

In Unity wäre das ganze einfacher möglich:
1. Man setze P als Child unter K1
2. Man setze die Position und Orientierung auf die Werte von K2
3. Man befreit P von K1

Meine Berechnung kommt einigermaßen nahe an die Unity-Variante heran, aber ist viel zu weit weg, um an Rundungsfehlern oder ähnlichem zu liegen. Daher gehe ich davon aus, dass meine Überlegung noch fehlerhaft ist.
Die Rotation habe ich in allen x,y,z Varianten getestet.

Ist meine Überlegung richtig? Dann würde ich euch den Code zur Überprüfung nachreichen.
Oder sieht man schon einen klaren Fehler? (davon würde ich zuerst ausgehen)

Ich hoffe, ich konnte euch die Problemstellung einigermaßen verständlich aufzeigen.

Schönen Gruß!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

15.01.2018, 13:33

Verstehe ich es richtig, dass du den Unterschied der 3D-Koordinaten des Punkts in den beiden lokalen Koordinatensystemen der Kameras haben möchtest? Also der Punkt hat im Koordinatensystem der Kamera 1 die lokalen Koordinaten §(x_1, y_1, z_1)§ und im Koordinatensystem der Kamera 2 die lokalen Koordinaten §(x_2, y_2, z_2)§, und du suchst §\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2 + (z_1 - z_2)^2}§? (wobei mir aber nicht klar wäre, was einem diese Information bringt)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

15.01.2018, 13:33

Der Punkt wird von beiden Kameras aufgenommen und ich möchte den Abstand der aufgenommenen Punkte zueinander berechnen. (Ähnlich eines Rückprojektsionsfehlers, aber im 3D Raum).

Ich versteh nicht ganz was genau du damit meinst. Willst du die Distanz zwischen den beiden Projektionen von P auf den Bildebenen der beiden Kameras zueinander im Worldspace berechnen!? Darf man fragen was genau du am Ende erreichen willst? Evtl. gibt's da einen einfacheren Weg...

4

15.01.2018, 14:31

Danke schon mal für die schnellen Antworten.

Ja, ich denke, ihr habt mein Vorhaben so weit verstanden, aber zu meiner Intention werde ich das mal genauer ausführen.
(Wenn sich dadurch ein einfacherer Weg ergibt, umso besser. :) )

Ihr könnt euch meine Anwendung als Augmented Reality Programm im virtuellen Raum vorstellen.
Ich habe ein Objekt, vereinfacht in drei Punkten a=(1,0,0), b=(0,1,0), c=(0,0,1).
Mein Programm gibt mir eine Schätzung der Kameralage. Wenn ich das Objekt von dieser geschätzten Position aus render und mit der Kamera auf die bekannte ursprüngliche Kameralage verschiebe, kann ich die Differenz des Originalobjekts und des neuen Objekts sehen.
Die Distanz soll im Schätzer (ohne Unity oder anderer Grafik) nun als Fehlermaß dienen, um die Abweichung der Punkte am Objekt zu bestimmen.
Ein kleiner Fehler bei der Schätzung der Kamera kann dabei, bei größerer Distanz, natürlich zu größeren Unterschieden der beiden (Originalem und projiziertem) Objekten kommen.

Ist das so einigermaßen verständlich? Sonst kann ich einzelnes auch genauer ausführen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

15.01.2018, 16:38

Was genau meinst du mit "Originalobjekt" und "neuem Objekt"!? Sollte es sich nicht in beiden Fällen um das selbe Objekt handeln!?

@zimmer

Alter Hase

Beiträge: 1 135

Wohnort: NRW Germany

  • Private Nachricht senden

6

15.01.2018, 19:46

man könnte es als eine art ghost bei flug symolator rennen verwenden oder autorennen in einer stad ala fahre von punkt a zu b oder für raketen oder drohnen. wenn man die entfernung in die position eines ghosts setzt zeigt sie immer den vorsprung an . zumindestens wenn man davids formel benutzt. Ich habe eine demo gemacht
wasd + ijkl ist die steuerung und es ist für windows
http://underhut.de/test/my_level.cd.zip~2MB
»@zimmer« hat folgendes Bild angehängt:
  • shot_0.jpg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »@zimmer« (15.01.2018, 19:51)


7

16.01.2018, 09:10

Was genau meinst du mit "Originalobjekt" und "neuem Objekt"!? Sollte es sich nicht in beiden Fällen um das selbe Objekt handeln!?


Mit Originalobjekt meine ich die Punkte a=(1,0,0), b=(0,1,0), c=(0,0,1).
Mit "neuem Objekt" sollten die verschobenen, bzw. projizierten Punkte gemeint sein.
Wenn Kamera 1 um eins rechts verschoben ist und man würde diese mit den Punkten auf die Lage von Kamera 2 verschieben,
würden die projizierten Punkte auf a=(0,0,0), b=(-1,1,0), c=(-1,0,1) liegen (also eins nach links verschoben).

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

16.01.2018, 09:14

Ich bin mir immer noch nicht sicher was du da am Ende genau erreichen möchtest. Kann es sein dass es dir eigentlich darum geht eine dreidimensionale Sicht zu erzeugen? Falls ja dann denkst du in die falsche Richtung. Oder wofür soll das am Ende gut sein.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

16.01.2018, 09:54

Ein 3D-Punkt ist nach der Projektion durch eine Kamera ein 2D-Punkt. Kannst du nochmal ganz von vorne beginnen, alle Begrifflichkeiten erklären und genau beschreiben, was du erreichen willst?

10

16.01.2018, 10:37

Ok,entschuldigt die Verwirrung, ich werde versuchen, es noch präziser darzustellen:

Das Projekt:
Es soll ein virtuelles Objekt mit bekannter Position und Lage mit einer Kamera aufgenommen werden.
Das Kamerabild wird von meinem Programm verarbeitet und die Lage der Kamera in der Szene geschätzt.
Mit dieser Schätzung kann ich ein zweites Objekt erzeugen und so verschieben, dass ich bei korrekter Schätzung eine vollständige Überlagerung sehe. Verschätzt sich das Programm, so ist das zweite Objekt zum ersten versetzt.

Zur besseren Anschaulichkeit:
Das unverschobene Objekt sieht dabei für die geschätzte Kamera 100% genauso aus,
wie das verschobene Objekt für die richtige Kamera.

Einfache Umsetzung in Unity:
1. Man erstellt ein Objekt und eine Kamera in der Szene und wendet den Schätzer auf das Kamerabild an.
2. Man erstellt eine Kamera an der geschätzten Position und Lage.
3. Man setzt eine Kopie des Objekts als Child unter diese zweite Kamera.
4. Man setze die Position und Orientierung der zweiten Kamera auf die Werte der ersten Kamera.
5. Man befreit das kopierte Objekt von der Kamera.
Je nach Abweichung der Kamerapositionen und Orientierungen hat sich das kopierte Objekt nun verschoben.

Problemstellung:
Ich möchte mit einem Skript außerhalb von Unity ermitteln, wie gut die Schätzung war.
Dabei soll das Objekt in drei Punkten angedeutet werden.
Der Abstand der Punkte vom ersten zum zweiten (kopierten und verschobenen) Objekt soll mein Fehlermaß werden.

Wenn ich mich nicht täusche, könnte man das gleiche Objekt vom Worldspace in den jeweiligen Kameraspace übertragen und müsste nur die Ergebnisse vergleichen.

Ich hoffe, meine Beschreibung war dieses mal etwas eindeutiger.
Schönen Gruß!

Werbeanzeige