# Kamera nur um x und y, nicht um z achse rotieren



## Tr3kk3r (11. Mai 2007)

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:


```
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.....


----------



## Tr3kk3r (12. Mai 2007)

ok, hab es selber hingekriegt.. zwar nicht so, wie erst gedacht war, aber der Horizont bleibt jetzt immer parallel zur unteren Bildschirmseite..

hier mal der code:


```
private WakeupCriterion	criterion;
	
	private TransformGroup	transformGroup;
	
	private Transform3D		trans	= new Transform3D();
	
	private Transform3D		transY = new Transform3D();
	private Transform3D		transX = new Transform3D();
	
	private Transform3D		backX = new Transform3D();
	private Transform3D		backY = new Transform3D();
	
	private Transform3D		recoverX = new Transform3D();
	private Transform3D		recoverY = new Transform3D();
	
	private Point lastPoint = null;	
	double xges=0,yges=0;
	
        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);
				//transformGroup.getLocalToVworld(trans);
				
				
				transY.setIdentity();
				transX.setIdentity();
				
				backX.setIdentity();
				backY.setIdentity();
				
				recoverX.setIdentity();
				recoverY.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));
				
				backX.rotX(Math.toRadians(xges));
				backY.rotY(Math.toRadians(yges));
								
				transY.rotY(-Math.toRadians(yy));				
				recoverY.rotY(-Math.toRadians(yges));
				
				transX.rotX(-Math.toRadians(xx));
				recoverX.rotX(-Math.toRadians(xges));
				
				trans.mul(backX);
				trans.mul(backY);
				
				trans.mul(transY);
				trans.mul(recoverY);
				
				trans.mul(transX);				
				trans.mul(recoverX);
				
				trans.normalize();				
				transformGroup.setTransform(trans);		
				
				xges += xx;
				yges += yy;
				
				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);
		}
```


----------



## merlin2 (12. Mai 2007)

Abhaken!


----------

