2016-06-09 19 views
1

Ich experimentiere mit LWJGL2 und ich möchte in der Lage sein zu sagen, ob die Kamera in der Lage ist, einen bestimmten Punkt in 3D-Raum zu sehen. Ich habe mich selbst versucht, um zu sehen, ob ich es schaffen könnte, und bin mit etwas fertig geworden, das irgendwie funktioniert und nur für die Rotation auf der Y-Achse.Berechnung von Punkten Sichtbarkeit im 3D-Raum

Dieser Code funktioniert, aber nicht in beiden Achsen. Ich bin mir nicht sicher, ob dies auch der richtige Weg ist.

public boolean isInFrame(float x, float y, float z){ //The z isn't used 

    float camera = rotation.y; //The cameras y rotation 
    double object = Math.atan2(y, x)*(180/Math.PI); 

    object += (180 - camera); 
    if (object <0) object += 360; 
    if (object >360) object -= 360; 

    return 270>object&&90<object; //set to 180˚ for test 


} 

Für den Code gehe ich davon aus, dass die Kamera um 0,0,0 zentriert ist.

Ich möchte nur wissen, wie ich das ändern könnte, so dass es für x und y-Drehung der Kamera funktioniert. Zum Beispiel könnte es mir sagen, wenn ein Punkt unabhängig von der Rotation der Kamera sichtbar ist.

HINWEIS: Ich mache mir keine Sorgen über irgendetwas, das die Sicht auf den Punkt behindert.

Vielen Dank für die Hilfe im Voraus.

Antwort

1

Wenn Sie die Ansichts- und Projektionsmatrizen der Kamera haben (nennen wir sie V, P), können Sie einfach die Transformationen auf Ihren Punkt anwenden und prüfen, ob das Ergebnis innerhalb des Clip-Volumens der Kamera liegt.

Sagen Sie, Ihr Punkt ist um (x, y, z). Konstruieren eines Vektors p = (x, y, z, 1) und wenden die Kamera, um es umzuwandeln:

q = P * V * p 

Die Ansicht Transformation V die Umwandlung der Welt relativ zu der Kamera bezieht, auf der Grundlage der Kameraposition und -orientierung. Dann wird der Vorsprung P verformt sich die Sichtstumpfs der Kamera (dh die sichtbare Raum der Kamera) in einen Einheitswürfel, wie folgt aus:

enter image description here
(Bildquelle: Song Ho Ahn)

ab, um zu lesen,

r = q/q.w 

Nun werden die Komponenten r.x, r.y,: die Koordinatenwerte des resultierenden Punkt, müssen wir zunächst durch Division durch seine w Komponente de-homogenisierenIhnen sagen, ob der Punkt innerhalb des sichtbaren Bereichs der Kamera liegt:

  • Wenn r.x < -1 liegt der Punkt über den linken Rand des Bildschirms.
  • Wenn r.x > 1, der Punkt liegt jenseits der rechten Grenze des Bildschirms.
  • Wenn r.y < -1, liegt der Punkt hinter dem unteren Rand des Bildschirms.
  • Wenn r.y > 1, der Punkt liegt jenseits der oberen Grenze des Bildschirms.
  • Wenn r.z < -1, liegt der Punkt hinter der nahen Ebene der Kamera, d. H. Der Punkt ist hinter der Kamera oder zu nah für die Kamera zu sehen.
  • Wenn r.z > 1, liegt der Punkt hinter der fernen Ebene der Kamera, d. H. Der Punkt ist zu weit entfernt, um von der Kamera gesehen zu werden.
  • Ansonsten befindet sich der Punkt im sichtbaren Bereich der Kamera.
+0

wow, das vereinfacht alles, was ich tat, vielen Dank! –

+0

Ich verstehe, was du hier sagst, aber ich bin mir nicht sicher, ob ich weiß, wie man die Ansichts- und Projektionsmatrizen von LWJGL2 bekommt. In LWJGL2 definieren Sie es nur so: 'glMatrixMode (GL_PROJECTION); gluPerspective ((float) 100, 640f/480f, 0.01f, 100); ' Wie bekomme ich die rohe Matrix daraus? –

+0

Ich bin nicht besonders mit LWJGL vertraut. In einfachem OpenGL ist der Zustand des Matrixstapels über z.B. 'glGetFloatv (GL_MODELVIEW_MATRIX, ...)' und 'glGetFloatv (GL_PROJECTION_MATRIX, ...)', die Arrays von 16 Floats zurückgeben. – jsb