Position im Raum bestimmen

Status
Nicht offen für weitere Antworten.

kawrom

Mitglied
Tagchen,
ich habe das folgende Problem, ich möchte, wenn ich im 3D Raum mit der Maus klicke, und dabei ein Objekt treffe, daß mir die genauen Koordinaten (x, y, z) des Treffers zurückgegeben wedren. Hab mich schon durch diverse Tutorials gequält aber keine lösung dieses Problems gefunden. Das einzige was ich erreichen kann das ich das komplette Objekt als rückgabe erhalte, ich möchte aber wie gesagt die Koordinaten des auftreffenden Mausklicks...
Für Antworten bedanke ich mich schon im Voraus.
 

MPW

Top Contributor
Aehm, wie soll das gehen? die dreidimensionale Maus ist noch nicht erfunden worden, der Computer weiss also nicht, welche Z Koordinate dein klick hat;-)
 

kawrom

Mitglied
Naja ich hab mir das so gedacht , dass im Raum zb bei ( z= 0) ein Quad-Array-Shape3D mit nur einem Polygon liegt
die Koordinaten für die einzelnen ecken wären zB.

Code:
QuadArray backGlas = new QuadArray(4, QuadArray.COORDINATES);

backGlas.setCoordinate(0, new Point3f(-2.0f, -2.0f, 0.0f));
backGlas.setCoordinate(1, new Point3f( 2.0f, -2.0f, 0.0f));
backGlas.setCoordinate(2, new Point3f( 2.0f,  2.0f, 0.0f));
backGlas.setCoordinate(3, new Point3f(-2.0f,  2.0f, 0.0f));

Shape3D obj = new Shape3D();

obj.setGeometry(backGlas);

(das backGlas-Objekt macht man dann Transparent, und der View-Punkt steht z.B. bei (0, 0, 3))

Die z-Koordinate ist hierbei auch garnicht wichtig (die ist eh immer 0), sondern nur die x- und y-Koordinate bei der mein Click auf mein Shape3D-Objekt auftrifft.
Das einzige was ich aber abfragen kann ist die Mausposition auf dem Canvas3D.
 

MPW

Top Contributor
Hm, kenne mich da jetzt auch nicht so aus, aber theoretisch muesste das mit einer mathematischen Formel zu loesen sein.

Wenn du den Ausschnitt kennst und die groesse der Canvas, muesste man die Pixelkoordinaten in die der 3DWelt umrechnen koennen...sonst koennte man ja auch keine Objekte auswaehlen....
 

kawrom

Mitglied
Genau das habe ich mir auch gedacht, denn um zu bestimmen ob man ein Objekt im 3D-Raum getroffen hat, muss man auch wissen welche koordinaten mein Klick-Strahl durchläuft und schleisslich die des Objektes schneidet.

Der Ansatz deis mit mathematidschen Formeln zu lösen ist aber auch keine schlechte Idee...ich werds mal jetzt auch so versuchen...danke für den Tip, hab bis jetzt nur hartnäckig nach einer Methode gesucht die dieses Problem löst anstatt mir selbst eine zu basteln.
 

MPW

Top Contributor
hm, hast du dir denn schon Clipping angeguckt, das ist naemlich eigentlich dafuer gedacht.
 

kawrom

Mitglied
So geschafft, hab es auf die mathematische Art gelöst. War garnicht mal so schwer, da sich das Sichtfeld linear zur Entfernung verändert.
D.h. wenn ich mein View auf "1m" enfernung eingestellt hab seh ich z.B. ca "0.82m" Breite und "0.62m" Höhe (bei z = 0). Wenn ich mein View dann au "2m" rauszoome seh ich dann genau das doppelte also "1.64m X 1.24m".
Bei "3m" Entfernung "2.64m X 1.86" usw...

Da hierbei eine lineare Abhängikkeit besteht lässt sich jetzt natürlich ohne Probleme eine Urechnung von Pixeln meiner Canvas3D auf die Koordinaten im 3D-Raum umrechnen (voraugesetzt natürlich z= 0 und der Winkel und die Rotation meines Views bleiben unverändert)

Beispiel:

- Canvas3D Breite: 640 Höhe: 480
- bei 1m (zoom = 1)entf. Sicht wie oben beschrieben 0.82m X 0.62m
- Klick mit der Maus bei 100 X 100

also kann ich jetzt mittels Dreisatz sagen:

Koordinate X = 0.82 / 640 * 100 * zoom= 0.128125
Koordinate Y = 0.62 / 480 * -100 * zoom= -0.129666 (-100 -> da sich der Klick unterhalb des Nullpunktes befindet)

(eigentlich müssten hierbei beide Zahlenwerte (ohne Beachtung des Vorzeichens) gleich sein, doch sind die Werte 0.82m und 0.62m nur eine Schätzung von mir, die ein bieschen abweicht. Bestimmt man die werte genau, dann kriegt man auch exakte Koordinaten)

Was hierbei auch zu beachten ist, ist die Tatsache, daß sich der Koordinaten-Nullpunkt (also x = 0 und y = 0) bei den Pixelwerten 0 X 0 befinden. Verschiebt man den Nullpunkt muss man darauf achten, links des Ursprungs negative X-Werte und unterhalb des Ursprungs negative Y-Werte für die Pixelwerte anzugeben
:cry: :?: :### :!: :D

(ach so mir ist durchaus bewust, daß es sich hierbei nicht um "Meter" handelt, hab es aber des besseren Verständnisses wegen so angegeben ;) )
 

DeepBlue

Aktives Mitglied
Ziemlich kompliziert gelöst.

Einfacher wäre es gewesen, am MausClick ein PickCanvas zu erstellen, und dir von diesem die Startpositionen zurückgeben zu lassen. Dabei ist dann die Z-Koordinate zu vernachlässigen.

Code:
PickCanvas pickcanvas = new PickCanvas(canvas, root);
pickcanvas.setTolerance(0.0f);
pickcanvas.setShapeLocation(loc.x, loc.y);
Point3d point = pickcanvas.getStartPosition();

loc entspricht dabei der Position des MouseClicks.
 

DeepBlue

Aktives Mitglied
Seit der 1.4.0 Beta 3 in:
com.sun.j3d.utils.pickfast.PickCanvas

Vorher in:
com.sun.j3d.utils.picking.PickCanvas
 

h0b0

Mitglied
Ich stand vor dem selben Problem und habe den Schnittpunkt von Fläche und PickRay über ein lineares Gleichungssystem bestimmt.
Ich habe die Vektorgleichungen für Gerade und Fläche gleichgesetzt, in Matrixschreibweise gebracht und das Gleichungssystem dann über die Multiplikation mit der Inversen Matrix gelöst. Klappt einwandfrei.
Sollte jemals jemand an Details interessiert sein, möge er Bescheid sagen und ich werde mir mal die Zeit nehmen, die Details auszubreiten.
 

h0b0

Mitglied
Es kam jetzt eine Anfrage per PM, wie ich obiges nun genau getan hätte. Inzwischen habe ich aber das bereits erfundene Rad dazu in J3D gefunden:
Code:
myPickCanvas.setShapeLocation(x, y);
PickResult myPickResult = myPickCanvas.pickCloseset();
PickIntersection myPickIntersection = myPickResult.getIntersection(0);
Point3d result = myPickIntersection.getPointCoordinatesVW();
Das ist jetzt sehr gradlinig. Es ist z.B. auch sehr gefährlich, davon auszugehen, dass ein PickResult auch immer mindestens eine PickIntersection liefert. Es lohnt sich, einmal einen Blick in die Dokumentation der verwendeten Klassen zu werfen; sie bieten noch einen Haufen Möglichkeiten mehr.
Habe leider nicht früher gewusst. Immerhin verstehe ich dadurch, dass ich den ganzen Quatsch einmal selbst implementiert habe, warum diese scheinbar überflüssige Klasse PickIntersection eingeführt wurde...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B BufferedImage Position Spiele- und Multimedia-Programmierung 8
coolian meine funktion um die höhe des terrains an bestimmter position in diesem fall spieler position zu bekommen giebt nur 0 zurück Spiele- und Multimedia-Programmierung 6
T Position eines Image verändern mithilfe eines Timers Spiele- und Multimedia-Programmierung 6
E Isometrische Tiles mit unterschiedlicher Größe an korrekter Position zeichnen Spiele- und Multimedia-Programmierung 1
BRoll AudioInputStream (Mp3) aktuelle Position Spiele- und Multimedia-Programmierung 0
A .jpg-Bild auf andere Position verschieben Spiele- und Multimedia-Programmierung 4
M [JAVA 3D] Position des Objektes verändern Spiele- und Multimedia-Programmierung 16
B Position der ViewingPlatform und Visueller Objekte setzen Spiele- und Multimedia-Programmierung 3
W "Kamera"-Position Spiele- und Multimedia-Programmierung 24
M Exakte Position auf Kugel mit Maus picken , Java3d Spiele- und Multimedia-Programmierung 14
T Maus-Cursor-Position manipulieren Spiele- und Multimedia-Programmierung 3
M Position der ViewingPlatform als Point3d-Objekt? Spiele- und Multimedia-Programmierung 12
F Position eines Objektes auslesen. Spiele- und Multimedia-Programmierung 7
G Wie kann ich die Kamera / View Position ausgeben? Spiele- und Multimedia-Programmierung 3
X Bild auf aktueller position drehen Spiele- und Multimedia-Programmierung 2
D mehrere Graphiken erstellen und ihre Position definieren Spiele- und Multimedia-Programmierung 4
TheSorm Kollisionsreaktion 2er Kugeln im 2D Raum Spiele- und Multimedia-Programmierung 4
C Würfel erstellen und als Raum nutzen Spiele- und Multimedia-Programmierung 6
D [JOGL] Freibewegliche Lichtquelle im Raum Spiele- und Multimedia-Programmierung 4
T Grundlagenwissen für den 3D Raum Spiele- und Multimedia-Programmierung 6
L Lwjgl Darstellung eines Kreises im Raum Spiele- und Multimedia-Programmierung 3
A Java 3D Raum Spiele- und Multimedia-Programmierung 3
S Wegberechnung im 2D-Raum Spiele- und Multimedia-Programmierung 6
A Bild im Raum darstellen (Texture2D) Spiele- und Multimedia-Programmierung 4
G 3D Raum zeichnen Spiele- und Multimedia-Programmierung 7
D Positionen im 3D Raum Spiele- und Multimedia-Programmierung 23
L Punkt im 3D-Raum Spiele- und Multimedia-Programmierung 2
F GpsBereich bestimmen Spiele- und Multimedia-Programmierung 1
F Schussrichtigung bestimmen Spiele- und Multimedia-Programmierung 2
B j3d Koordinaten bestimmen Spiele- und Multimedia-Programmierung 16
aze Wie Transform3D für PosPathInterpolator bestimmen Spiele- und Multimedia-Programmierung 8
jemandzehage JOGL 3D-Koordinaten des Klicks bestimmen Spiele- und Multimedia-Programmierung 2
S Koordinaten bestimmen und setzen Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben