Hi,
Ich arbeite gerade an einem Programm, in dem man ein 3D-Objekt von allen Seiten betrachten soll.
Meine Bewegungen dafür realisiere ich über Behavior Klasse. Das Bewegen mit den Tasten funktioniert
soweit einwandfrei, nur bei der Realisierung der Mausbewegung hapert es noch. Folgendes Problem:
Ich habe mir zunächst einen einfachen Würfel darstellen lassen, auf den ich frontal drauf schaue.
Wenn ich jetzt nur nach Oben und Unten schau oder nur nach Rechts und Links geht es wunderbar,
nur wenn ich beide Bewegungen kombiniere tritt ein Fehler auf den ich nicht wegbekomme. Rotiere
ich die Maus z.B. im Uhrzeigersinn rotiert der Würfel gegen ihn und umgekehr. Das sollte er nicht
machen, da ich ja nur wie in einem FPS herumschauen möchte.
Hoffe mir kann jemand Helfen.
Ich arbeite gerade an einem Programm, in dem man ein 3D-Objekt von allen Seiten betrachten soll.
Meine Bewegungen dafür realisiere ich über Behavior Klasse. Das Bewegen mit den Tasten funktioniert
soweit einwandfrei, nur bei der Realisierung der Mausbewegung hapert es noch. Folgendes Problem:
Ich habe mir zunächst einen einfachen Würfel darstellen lassen, auf den ich frontal drauf schaue.
Wenn ich jetzt nur nach Oben und Unten schau oder nur nach Rechts und Links geht es wunderbar,
nur wenn ich beide Bewegungen kombiniere tritt ein Fehler auf den ich nicht wegbekomme. Rotiere
ich die Maus z.B. im Uhrzeigersinn rotiert der Würfel gegen ihn und umgekehr. Das sollte er nicht
machen, da ich ja nur wie in einem FPS herumschauen möchte.
Hoffe mir kann jemand Helfen.
Java:
public class UserControl extends ViewPlatformBehavior {
private static final double MOUSE_SPEED = 50;
private static final double MOVE_STEP = 0.2;
private static final int MOVE_SPEED = 25;
private static final Vector3d FWD = new Vector3d(0, 0, -MOVE_STEP);
private static final Vector3d BACK = new Vector3d(0, 0, MOVE_STEP);
private static final Vector3d LEFT = new Vector3d(-MOVE_STEP, 0, 0);
private static final Vector3d RIGHT = new Vector3d(MOVE_STEP, 0, 0);
private int forwardKey = KeyEvent.VK_W;
private int backKey = KeyEvent.VK_S;
private int leftKey = KeyEvent.VK_A;
private int rightKey = KeyEvent.VK_D;
private int enableMouse = KeyEvent.VK_ESCAPE;
private WakeupCondition wakeCon;
private PanelMain main;
private Robot robot;
private int posX = 0;
private int posY = 0;
private Transform3D t3d = new Transform3D();
private Transform3D toMove = new Transform3D();
private Transform3D rotationY = new Transform3D();
private Transform3D rotationX = new Transform3D();
private boolean forward = false;
private boolean backward = false;
private boolean left = false;
private boolean right = false;
private boolean mouse = true;
private boolean mouseFirstTime = true;
public UserControl(PanelMain main, TransformGroup steerTG) {
this.main = main;
initViewPosition(steerTG);
}
private void initViewPosition(TransformGroup steerTG)
{
Vector3d startPosn = new Vector3d(0, 0, 0);
steerTG.getTransform(t3d);
t3d.setTranslation(startPosn);
steerTG.setTransform(t3d);
}
public void initialize() {
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
WakeupCriterion[] crits = new WakeupCriterion[4];
crits[0] = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
crits[1] = new WakeupOnAWTEvent(KeyEvent.KEY_RELEASED);
crits[2] = new WakeupOnElapsedTime(MOVE_SPEED);
crits[3] = new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED);
wakeCon = new WakeupOr(crits);
wakeupOn(wakeCon);
}
public void processStimulus(Enumeration criteria)
{
WakeupCriterion wakeup;
AWTEvent[] event;
while (criteria.hasMoreElements()) {
wakeup = (WakeupCriterion) criteria.nextElement();
if (wakeup instanceof WakeupOnAWTEvent) {
event = ((WakeupOnAWTEvent) wakeup).getAWTEvent();
for (int i = 0; i < event.length; i++) {
if (event[i].getID() == KeyEvent.KEY_PRESSED)
processKeyEvent((KeyEvent) event[i], true);
if (event[i].getID() == KeyEvent.KEY_RELEASED)
processKeyEvent((KeyEvent) event[i], false);
if (event[i].getID() == MouseEvent.MOUSE_MOVED)
processMouseEvent((MouseEvent) event[i], true);
}
}
}
calculateMovement();
wakeupOn(wakeCon);
}
private void processKeyEvent(KeyEvent eventKey, boolean activate) {
int keyCode = eventKey.getKeyCode();
if (activate) activateKey(keyCode);
else deactivateKey(keyCode);
}
private void processMouseEvent(MouseEvent eventMouse, boolean look){
if(look) look(eventMouse);
System.out.println("moved");
System.out.println("Rotation X " + rotationX);
System.out.println("Rotation Y " + rotationY);
}
private void look(MouseEvent eventMouse){
if (mouse){
if(mouseFirstTime){
repositionMouse(eventMouse);
mouseFirstTime = false;
}
else{
rotateX(-(eventMouse.getY()-posY)/MOUSE_SPEED);
rotateY(-(eventMouse.getX()-posX)/MOUSE_SPEED);
repositionMouse(eventMouse);
}
}
}
private void rotateX(double angel){
targetTG.getTransform(t3d);
rotationX.rotX((Math.PI/180)*angel);
t3d.mul(rotationX);
targetTG.setTransform(t3d);
}
private void rotateY(double angel){
targetTG.getTransform(t3d);
rotationY.rotY((Math.PI/180)*angel);
t3d.mul(rotationY);
targetTG.setTransform(t3d);
}
private void repositionMouse(MouseEvent eventMouse){
int cx = eventMouse.getComponent().getWidth()/2;
int cy = eventMouse.getComponent().getHeight()/2;
Point p = new Point(cx,cy);
SwingUtilities.convertPointToScreen(p, eventMouse.getComponent());
robot.mouseMove(p.x, p.y);
posX = cx;
posY = cy;
}
private void activateKey(int keycode){
if (keycode == forwardKey)
forward = true;
else if (keycode == backKey)
backward = true;
else if (keycode == leftKey)
left = true;
else if (keycode == rightKey)
right = true;
else if (keycode == enableMouse){
if (mouse) mouse = false;
else mouse = true;
}
}
private void deactivateKey(int keycode){
if (keycode == forwardKey)
forward = false;
else if (keycode == backKey)
backward = false;
else if (keycode == leftKey)
left = false;
else if (keycode == rightKey)
right = false;
}
private void doMove(Vector3d theMove){
targetTG.getTransform(t3d);
toMove.setTranslation(theMove);
t3d.mul(toMove);
targetTG.setTransform(t3d);
}
private void calculateMovement(){
if(backward) doMove(BACK);
if(forward) doMove(FWD);
if(left) doMove(LEFT);
if(right) doMove(RIGHT);
}
}
Zuletzt bearbeitet: