# 3D Ego-Perspektive (lwjgl)



## tdc (21. Jun 2011)

Hi,
Seit einigen Tagen beschäftige ich mich mit der 3D-Programmierung mit lwjgl. Jetzt wollte ich eine Kamera aus der Ego-Perspektive programmieren. Als Anleitung dazu habe ich DAS verwendet. Die Klasse "FPCameraController" habe ich von dort nahezu 1:1 übernommen, allerdings musste ich die Methode "lookThrough" verändern, da die Kamera sich sonst nach Aufruf einer der Bewegungsmethoden die ganze Zeit rotierte. (ich musste nur die Positionen und Rotationen wieder auf 0 setzten)

Original:

```
public void lookThrough()
    {
        //roatate the pitch around the X axis
        GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
        //roatate the yaw around the Y axis
        GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
        //translate to the position vector's location
        GL11.glTranslatef(position.x, position.y, position.z);
    }
```

Verändert:

```
public void lookThrough()
    {
        GL11.glTranslatef(position.x, position.y, position.z);
        GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
        GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
        position.x = 0;
        position.y = 0;
        position.z = 0;
        pitch = 0;
        yaw = 0;
    }
```

Die Bewegung funktioniert jetzt (nahezu) einwandfrei, mein Problem ist allerdings die, durch die Maus gesteuerte Rotation der Kamera. Dabei treten zwei Probleme auf:
(1. die Rotation ruckelt ziemlich stark) <-- siehe Edit
2. wenn man nur die Rotation um eine Achse betrachtet und die Maus nur in eine Richtung bewegt rotiert die Kamera erst in diese Richtung, zwischendurch wechselt die Rotationsrichtung dann plötzlich und die Kamera rotiert in die entgegengesetzte Richtung.

Die Kamera-Klasse verwende ich (für die Rotation) folgendermaßen:


```
while (!Display.isCloseRequested())
		{
			int delta = getDelta();
			
			update(delta);
			camera.lookThrough();
                        ...
```


```
public void update(int delta)
	{
		float mousedx = Mouse.getDX();
		float mousedy = Mouse.getDY();
		if(mousedx != 0)
		{
			camera.yaw(mousedy);
		}
		if(mousedy != 0)
		{
			camera.pitch(mousedx);
		}
                ...
```
Hab ich das so richtig gemacht? Und wie kann ich die Probleme lösen?

mfg, tdc

edit: ich habe die Abfrage if(Mouse.isInsideWindow) herausgenommen und jetzt scheint es nicht mehr zu ruckeln...
Problem 2 besteht noch.


----------



## Kr0e (22. Jun 2011)

Kann gut sein, dass "isMouseInside" derart lange bracuht, dass dein Programm ins Stottern kommt.
Um das zu testen, miss mal mit System.currentTimeMillies() wie lange der aufruf von isMouseInside dauert. Eigentlich sollte  dieser Aufruf nichtmal ne MS dauern ... Wenn das so ist, gibt es Probleme mit den installierten Treibern. Alte/falsche Treiber können derarte Probleme bewirken...

2. Problem ka, hab grad jkeine Zeit das Programm laufen zu lassen...


----------



## tdc (22. Jun 2011)

Die Abfrage war sowieso unnötig, da ich gleichzeitig die Maus mit Mouse.setGrabbed(true) ans Fenster gebunden habe. Gleichzeitig habe ich noch ein paar andere kleine Dinge verändert, kann auch sein dass es daran lag aber das ist mir jetzt eigentlich auch egal. 

Jetzt habe ich nur noch das Problem, dass die Kamera spontan ihre Richtung ändert und nicht immer in die Richtung rotiert, in die man die Maus bewegt.


----------



## tdc (23. Jun 2011)

Problem gelöst...

Wenn man sich schon mit 3D-Programmierung befasst sollte man wenigstens x und y nicht mehr vertauschen. 


```
float mousedx = Mouse.getDX();
		float mousedy = Mouse.getDY();
		if(mousedx != 0)
		{
			camera.yaw(mousedx);
		}
		if(mousedy != 0)
		{
			camera.pitch(-mousedy);
		}
```

Jetzt wundere ich mich aber warum der Würfel, der zu Beginn vor der Kamera ist, seitlich rotiert wenn ich die Maus nur in kleinen Kreisen bewege...


----------

