# Kamera "am Rande einer Kugel bewegen"



## Mika (16. Jan 2015)

Hallo Community,

Eines vorweg: Falls das Thema nicht in dieses Unterforum passt, bitte verschieben!
Wie schaffe ich es, eine Kamera so zu bewegen, dass sich sich "um" ein Objekt dreht und die ganze Zeit daraufschaut? Man kann sich das so verstellen: Ein bestimmtes Objekt ist der Mittelpunkt einer Kugel, an deren Rande sich eine Kamera bewegt. Diese muss IMMER auf dieses Objekt schauen. Gegeben sind folgende Werte:
- Ausgangskameraposition
- Ausgangskamera-"Look"-Vektor (bzw. Rotation)
- Mittelpunkt, um den sich die Kamera drehen soll
-> Radius der Kugel errechnet sich aus der Kameraposition und dem Mittelpunkt, da die Kamera sich ja am "Rande" entlang bewegen soll.
- Winkel, um die sich die Kamera drehen soll

Hier ein Bild zur Veranschaulichung:


Gibt es dazu vielleicht ein Tutorial bzw. kennt sich damit jemand aus?


----------



## Androbin (17. Jan 2015)

Ganz einfach:
Du nimmst den Richtungsvektor und ziehst ein Vielfaches davon von der Position des Objektes ab.


----------



## Mika (18. Jan 2015)

Danke für deine Antwort! Ich habe bereits einen Code geschrieben, der allerdings nur ansatzweise funktioniert (nur auf einer Ebene):


```
// Abstand zwischen der Rotationsachse und der Kamera
Vector3d vecDistance = new Vector3d(targetXPos, targetYPos, targetZPos).subtract(camera.getPositionVec);
// Dieser Vektor wird jetzt gedreht (mit Hilfe einer Rotationsmatrix)
vecDistance = vecDistance.multiplyMatrix(Matrix.getRotationMatrixX(alpha)).multiplyMatrix(Matrix.getRotationMatrixY(beta));
// Das Ergebnis ist die Summe aus "vecDistance" und der Rotationsachse
Vector3d result = new Vector3d(targetXPos, targetYPos, targetZPos).add(vecDistance);
// Setze die Kamera zur neuen Position
camera.setPosition(result);

// Jetzt wird die Kamera noch so rotiert, dass sie zum Zielobjekt bzw. zur Rotationsachse schaut:
Vector3d v = camera.getPosition().subtract(targetXPos, targetYPos, targetZPos).normalize();
double distance = Math.sqrt(v.x * v.x + v.y * v.y);
double xRot = distance == 0 ? 0.0 : Math.asin(v.y / distance);
double yRot = Math.atan2(v.x, v.z);

camera.xRot = Math.toDegrees(-xRot);
camera.yRot = Math.toDegrees(-yRot);
```

So, diesen Code benutze ich bis jetzt (ich hoffe man kann anhand der Variablennamen und Methodennamen gut erkennen, was ich berechne). Wenn ich die Kamera jetzt allerdings um den Winkel α und um den Winkel β um ein Objekt drehen möchte, dann flimmert der Bildschirm bzw. die Kamera springt ganz schnell von z.B -9 zu +9. 
Rotiere ich die Kamera aber nur um die y-Achse, funktioniert der Code perfekt. Es scheint irgendetwas mit der x-Rotation nicht zu stimmen, aber ich komme einfach nicht drauf.
Hat irgendjemand eine Idee, an was das liegen könnte?

PS: Die Vektor bzw. Matrixmethoden funktionieren perfekt.


----------



## Androbin (18. Jan 2015)

Ohne mir jetzt deinen Code genauer angesehen zuhaben:
Müsste es nicht funktionieren, wenn du "xRot" so berechnest, wie "yRot"?

```
double xRot = Math.atan2( v.y, v.z );
double yRot = Math.atan2( v.x, v.z );
```


----------



## Mika (18. Jan 2015)

Ich habe es jetzt. Du hast Recht xRot wird ebenfalls mit der atan2-Funktion der Math-Klasse berechnet - Man darf sich niemals auf irgendwelche Posts verlassen xD). Und ich hatte noch einen Fehler (nur falls es jemanden interessiert):
Man muss *von* der Kameraposition die Rotationsachsenposition abziehen, nicht andersherum (in meinem Code Zeile 3).

Trotzdem danke für deine Hilfe!


----------

