Nabend.
Beim arbeiten mit Java3D stehe ich vor einem folgenschweren problem:
Ich habe mir eine eigene Klasse geschrieben, die von der Klasse Behavior abgeleitet ist und das Interface MouseListener implementiert.
Dieser MouseListener wird nun dem Canvas3D hinzugefügt, auf dem ich mein universe zeichnne.
Die rotation um die x und die y - achse funktionieren prima, man kann nach oben/unten und links/rechts schauen(gehen mit wasd, dafür hab ich ne andere klasse)
leider stellt sich nach kurzer zeit aufgrund der kamerarotition um beide achsen der effect ein, dass die Ränder des Monitors nicht mehr horizontal bzw vertikal zum boden verlaufen, sondern der boden "schief" durch den monitor läuft.
Der code sieht wie folgt aus:
wie schaffe ich es nun, meine kamera dazu zu kriegen, immr parallel zum horizont zu bleiben, um so eine realistische simulation einer durch meine szene gehenden figur im first-person mode hinzukriegen???
eine idee von mir war, mir die z-rotation auszugeben und um die z-rotation *-1 zu rotieren, aber eine solche methode gibts mal wieder nicht.....
Beim arbeiten mit Java3D stehe ich vor einem folgenschweren problem:
Ich habe mir eine eigene Klasse geschrieben, die von der Klasse Behavior abgeleitet ist und das Interface MouseListener implementiert.
Dieser MouseListener wird nun dem Canvas3D hinzugefügt, auf dem ich mein universe zeichnne.
Die rotation um die x und die y - achse funktionieren prima, man kann nach oben/unten und links/rechts schauen(gehen mit wasd, dafür hab ich ne andere klasse)
leider stellt sich nach kurzer zeit aufgrund der kamerarotition um beide achsen der effect ein, dass die Ränder des Monitors nicht mehr horizontal bzw vertikal zum boden verlaufen, sondern der boden "schief" durch den monitor läuft.
Der code sieht wie folgt aus:
Code:
private WakeupCriterion criterion;
private TransformGroup transformGroup;
private Transform3D trans = new Transform3D();
private Transform3D tempTransX = new Transform3D();
private Transform3D tempTransY = new Transform3D();
private Point lastPoint = null;
boolean proove = true;
private double xges,yges;
@Override
public void initialize()
{
criterion = new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED);
wakeupOn(criterion);
}
@Override
public void processStimulus(Enumeration criteria)
{
WakeupOnAWTEvent ev;
AWTEvent awtevent[];
while (criteria.hasMoreElements())
{
ev = (WakeupOnAWTEvent) criteria.nextElement();
awtevent = ev.getAWTEvent();
for (int i = 0; i < awtevent.length; i++)
{
MouseEvent mouseE = (MouseEvent)awtevent[i];
transformGroup.getTransform(trans);
tempTransX.setIdentity();
tempTransY.setIdentity();
if(lastPoint == null)
{
lastPoint = mouseE.getPoint();
}
int x = mouseE.getPoint().x - lastPoint.x;
int y = mouseE.getPoint().y - lastPoint.y;
double xx = (180D * (y/1024D));
double yy = (360D * (x/1280D));
xges += xx;
yges += yy;
tempTransY.rotX(-Math.toRadians(xx));
tempTransX.rotY(-Math.toRadians(yy));
trans.mul(tempTransY);
trans.mul(tempTransX);
trans.normalize();
transformGroup.setTransform(trans);
Robot r = null;
try
{
r = new Robot();
}
catch (AWTException e)
{
e.printStackTrace();
}
int newX, newY;
if(mouseE.getPoint().x > 1260)
{
newX = 9;
}
else if(mouseE.getPoint().x < 5)
{
newX = 1259;
}
else
{
newX = mouseE.getPoint().x;
}
newY = mouseE.getPoint().y;
if(newX != mouseE.getPoint().x /*|| newY != mouseE.getPoint().y*/)
r.mouseMove(newX,newY);
lastPoint = new Point(newX,newY);
}
wakeupOn(criterion);
}
}
wie schaffe ich es nun, meine kamera dazu zu kriegen, immr parallel zum horizont zu bleiben, um so eine realistische simulation einer durch meine szene gehenden figur im first-person mode hinzukriegen???
eine idee von mir war, mir die z-rotation auszugeben und um die z-rotation *-1 zu rotieren, aber eine solche methode gibts mal wieder nicht.....