PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java & OpenGL] Kamerasteuerung


Silpion
2005-12-18, 04:55:24
Hallo,

ich bin dabei ein kleines Programm zu schreiben, dessen Steuerung der eines typischen Shooters nachgeahmt ist.

Das Bewegen mit den Pfeiltasten/WASD funktioniert, das Umherschauen leider nicht ganz:

Wenn ich die Blickwinkelsteuerung mit mouseDragged realisiere, klappt es hervorragend, dummerweise muss der Benutzer dazu auf das Frame klicken und die Taste gedrückt halten.
Wenn ich mouseMoved nehme, entfällt das Klicken, allerdings wird das Event nicht mehr ausgelöst, wenn die Maus das Frame verlässt.

Und genau dafür habe ich noch keine Lösung gefunden. Gibt es eine Möglichkeit, die Maus zu "fangen", d.h. wie in einem Shooter unsichtbar machen und die rel. Änderung der Koordinaten in einem Event zu verarbeiten? Oder ist es irgendwie möglich, die Maus an eine bestimmte Position zu setzen? Dann könnte ich die Maus ständig in den Mittelpunkt des Frames zurücksetzen.

Für jede hilfreiche Idee dankbar,
Silpion

Nachtrag:
Falls jemand weiß, wie man die Anschlagverzögerung der Tastatur ausschaltet, wäre das auch sehr praktisch. Momentan hakt es noch kurz nach dem ersten Schritt, bis die KeyEvents regelmäßig ausgelöst werden.

Monger
2005-12-18, 10:50:30
Du sagst, Java und OpenGL?

Setzt du da direkt auf OpenGL auf, oder verwendest du Java3D?

Ich sag das deshalb, weil ich glaube bei Java3D Klassen gesehen zu haben die dir helfen könnten.

Ansonsten: das Problem ist ja, dass du bei Fokus deines Fensters sämtliche Windows Events ignorieren, und deinen eigenen Maus Listener umsetzen musst.

Ziemlich interessantes Problem. Wenn du eine Lösung hast, würde die mich auch interessieren.

AlSvartr
2005-12-18, 11:47:14
Nachtrag:
Falls jemand weiß, wie man die Anschlagverzögerung der Tastatur ausschaltet, wäre das auch sehr praktisch. Momentan hakt es noch kurz nach dem ersten Schritt, bis die KeyEvents regelmäßig ausgelöst werden.
Oehm..versteh ich dich richtig, dass du es so gemacht hast, dass nur bei keyPressed gelaufen wird? Machs doch so, dass du bei keyPressed loslaeufst und bei keyReleased wieder stehenbleibst. Dann sparste dir solche Basteleien.

Btw.: "Neben" Java3D gibs auch noch JOGL, was wohl ziemlich gut sein soll und angeblich (keine Ahnung, ob das wirklich stimmt) soll es evtl. in zukuenftigen Java-Versionen fest integriert werden, was ich absolut begrueßen wuerde :)

darph
2005-12-18, 12:54:59
Btw.: "Neben" Java3D gibs auch noch JOGL, was wohl ziemlich gut sein soll und angeblich (keine Ahnung, ob das wirklich stimmt) soll es evtl. in zukuenftigen Java-Versionen fest integriert werden, was ich absolut begrueßen wuerde :)
JOGL ist zwar ganz schön aber momentan irgendwie alles andere als ordentlich verwendbar.

Versionsänderung drei Stellen hinter dem letzt Punkt - zu nichts mehr kompatibel ;(

Silpion
2005-12-18, 14:06:59
@ Monger:
Ich nutze JOGL und das VecMath Package aus Java3D. Im Unterschied zu Java3D bietet einem JOGL Bindings zu den ursprünglichen OpenGL-C-Funktionen. Wenn man ein 3D-Programm schreiben will, ist Java3D klasse, aber wenn man OpenGL lernen will, muss man JOGL verwenden.
MouseListener und ähnliches habe ich schon umgesetzt, es funktioniert auch alles, bis auf die Tatsache, dass der Benutzer einfach mit der Maus über das Fenster ziehen kann, anstatt dass ich die Maus fange und der Benutzer durchgehend eine Maussteurung hat.

@ darph:
JOGL ist ordentlich verwendbar. Es gab nur im Oktober eine inkompatible Umstellung von v1.1.1 hin zu JSR-231. Aufgrund der Vorgaben meiner Uni muss ich dieses Semester noch das Alte verwenden, aber die Programme lassen sich mit wenigen Änderungen umschreiben. Das Problem ist dabei nur, dass man erstmal rausfinden muss, was man ändern muss.

@ AlSvartr:
Gute Idee, danke! Das werde ich gleich umsetzen. :)

Abnaxos
2005-12-18, 17:56:06
Gibt es eine Möglichkeit, die Maus zu "fangen", d.h. wie in einem Shooter unsichtbar machen und die rel. Änderung der Koordinaten in einem Event zu verarbeiten?

Den Mauszeiger unsichtbar zu machen ist einfach: Einfach einen komplett transparenten Cursor setzen. Die Maus "einzufangen" ist mit AWT nicht möglich. Was du versuchen kannst, ist den Fullscreen-Mode vorauszusetzen, dann brauchst du die Maus nicht mehr einzufangen -- solange nur ein Bildschirm vorhanden ist. Ausserdem funktioniert der Fullscreen-Mode je nach Betriebsystem nicht richtig.

Oder ist es irgendwie möglich, die Maus an eine bestimmte Position zu setzen? Dann könnte ich die Maus ständig in den Mittelpunkt des Frames zurücksetzen.

Das wäre mit java.awt.Robot theoretisch möglich. Das Versetzen des Mauszeigers ist jedoch zumindest unter Linux derartig langsam (es wird jedesmal ein externes Executable gestartet), dass es nicht praktikabel ist.

Was du natürlich auch tun kannst, ist die Library zu wechseln: Wenn du auf sdljava (http://sdljava.sourceforge.net/) setzt, kannst du alles, was das Herz begehrt: Fullscreen, Video-Mode setzen, Maus grabben, Maus performant versetzen, etc. sdljava ist jedoch momentan die einzige Java-Anbindung an SDL, die auch OpenGL unterstützt und ich habe keine Ahnung, wie fortgeschritten dieses Projekt ist.

Nachtrag:
Falls jemand weiß, wie man die Anschlagverzögerung der Tastatur ausschaltet, wäre das auch sehr praktisch. Momentan hakt es noch kurz nach dem ersten Schritt, bis die KeyEvents regelmäßig ausgelöst werden.

Einfach auf keyPressed und keyReleased hören, dann müsste das schon gut kommen. :) Möglich, dass keyPressed dann in der Wiederholrate nochmal kommt, aber die weiteren keyPressed-Events kannst du ja ignorieren, bis ein keyReleased gekommen ist.

Mit SDL sollte auch das einfacher gehen, da SDL ja auf die Spiele-Programmierung ausgerichtet ist.

Silpion
2005-12-18, 23:56:38
Flüssige Bewegung und Drehen mit Click&Drag klappt nun problemlos.

Die Klasse Robot kann ich nicht verwenden kann, wenn es unter Linux zu Problemen kommt, da das Programm im Januar auf einem Linux-System bewertet wird. Zusätzliche Bibliotheken darf ich dort leider auch nicht einbinden, aber ich werde mir SDL für private Projekte merken. :)

Prinzipiell reicht diese Steuerung für das Programm aus, ich werde mich nun um den Aufbau der Szene kümmern (eine Mini-Engine um alles darzustellen habe ich bereits fertig).

EgonOlsen
2005-12-19, 22:30:09
aber wenn man OpenGL lernen will, muss man JOGL verwenden.Muss man nicht, man kann auch LWJGL (http://www.lwjgl.org) verwenden. Das kann zusammen mit AWT verwendet werden, womit du dann wohl dasselbe Problem hättest, aber auch in ein natives Fenster rendern. Und damit ist dein Mausproblem in einer Zeile erledigt: Mouse.setGrabbed(true);