Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.09.2009, 15:05

Kamera mit TriBase

Hallo, ich programmiere zur Zeit ein Spiel mit der TriBase engine. Das ganze ist auch schon recht weit, allerdings funktioniert die Kamera noch nicht so wie ich das gerne möchte. Es geht um die Rotation der Kamera. Da es sich um ein Strategiespiel handelt, brauche ich eine Kamera die sich um eine bestimmte Achse drehen soll. Die Achse ist quasi der Punkt auf den die Kamera schaut (vCameraLookAt). Die Kamera soll also beim Drehen weiterhin auf diesen Punkt gerichtet sein während sie sich um diesen Punkt dreht.

Bisher habe ich das so gemacht:

C-/C++-Quelltext

1
2
tbMatrix mRotationY(tbMatrixRotationY(TB_DEG_TO_RAD(-5.0f)));
vCameraPos = tbVector3TransformCoords(vCameraPos,mRotationY);


Dabei wird allerdings um dem Mittelpunkt des Weltkoordinatensystems gedreht.

Kann mir jemand sagen, wie ich das nun um einen konkreten Punkt machen kann?

Danke.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

21.09.2009, 19:12

Verschieb die Kamera bevor du sie rotierst um die Differenz von der Kamera und dem Punkt, wo sie hinschaut, dann rotierst du und dann schiebst du die Kamera wieder um den gleichen Betrag richtung den Punkt, auf den du schaust.

Das sollte eigentlich in etwa so gehen.

3

21.09.2009, 20:22

hm aber ich müsste beim zurück schieben ja dann auch wissen an welchen punkt ich schieben muss. der abstand wäre klar aber die kamera bewegt sich ja quasi auf ner kreisbahn.

edit:
Hm, ich denke ich muss ja nur auf der Achse der Kamera wieder zurück schieben. Dann sollte man ja am richtigen Punkt sein oder?


Und das rotieren müsste dann auch um die Achse der Kamera geschehen richtig?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

21.09.2009, 20:27

Du musst in die Richtung, die du schaust schieben.

Rotieren tust du ja um den Mittelpunkt (also 0,0,0). Und da du aber die Kamera zuerst verschiebst (also Rückwärts) drehst du dich um den Mittelpunkt. Dann hast du ja mal die korrekte Drehung gemacht. Und dann musst du nur noch wieder die Position anpassen. (Du gehst also wieder nach vorne).

5

21.09.2009, 20:40

hm ich steig da noch nicht so ganz hinter. Meinst du ich schiebe die Kamera zum Mittelpunkt des Weltkoordinatensystems? Mit dem Abstand von Kamera Position und Kamera Blickpunkt?

habs jetzt mal so versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
vCameraPos.z = -(vCameraPos.z-vCameraLookAt.z);
vCameraPos.x = -(vCameraPos.x-vCameraLookAt.x);

tbMatrix mRotationY(tbMatrixRotationY(TB_DEG_TO_RAD(5.0f)));
vCameraPos = tbVector3TransformCoords(vCameraPos,mRotationY);

vCameraPos.z = vCameraPos.z-vCameraLookAt.z;
vCameraPos.x = vCameraPos.x-vCameraLookAt.x;


Funktioniert aber so nicht.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

21.09.2009, 21:04

LookAt wird kaum eine wirkliche Position beinhalten. Den Punkt musst du zuerst ausrechen. Sprich du hast eine Position und eine Richtung.

Dann musst du mal berechnen, wo du eigentlich hinschaust. Sprich einfach die Dinstanz wo du bist bis dort, wo dein Blickpunkt ist. (Du hast zum Beispiel eine Einheit angewählt und möchtest genau um diese rotieren (wenn der Screen zentriert ist). Dann nimmst du sozusagen die Entfernung (x,y) zu dieser Einheit. Diese Differenz gehst du nach hinten und dann rotierst du um die Z-Achse (oder was halt nach oben zeigt). Dann nach dem rotieren gehst du um die gleiche Differenz wieder nach vorne. (respektive in die Richtung, in die die am Anfange geschaut hast, weil du ja versetzt bist).

Vielleicht hilft dir das hier ein wenig:

(Link)

7

21.09.2009, 21:15

Hm wie meinst du das mit dem LookAt hat keine Position? Das ist doch die Koordinate die angibt auf welchen Punkt die Kamera blickt und das ist doch ein Vektor.

Zum Anderen weiß ich immernoch nicht um was da rotiert wird.

C-/C++-Quelltext

1
2
tbMatrix mRotationY(tbMatrixRotationY(TB_DEG_TO_RAD(5.0f)));
vCameraPos= tbVector3TransformCoords(vCameraPos,mRotationY);


So drehe ich ja, aber diese Drehung erfolgt um den Nullpunkt des Weltkoord.systems.

Hm, ich stehe wohl aufm Schlauch.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

21.09.2009, 21:33

Ja, aber üblicherweise ein Rictungsvektor.
Nehmen wir an du stehst am Ursprung eines Koordinatensystems (Boden ist x,y) und rauf gehts in die z-Richtung. Nach rechts gehts in die x-Richtung und nach vorne in die y-Richtung

Wenn du nach oben schaust, dann hat LookAt genau (0,0,1). Also komplett in die z-Richtung. Wenn du nach vorne schaust, dann ist LookAt genau (0,1,0). Und jetzt kannst du dir denken, wies ausschaut, wenn du nach rechts schaust. ;)
Nun kannst du aber nicht sagen, dass du auf den Punkt (0,0,1) schaust, sondenr lediglich, dass du in diese Richtung schaust. Wenn du einen Punkt in deiner Blickrichtung haben willst, dann addierst du zu deiner Position einfach ein vielfaches von der Richtung, in die du schaust.

C-/C++-Quelltext

1
vPointInDistance = vCameraPosition + vLookAt * 100.0f;

vPointInDistance ist genau der Punkt, auf den du in 100.0f Einheiten Entfernung schaust.

Werbeanzeige