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

05.05.2010, 04:18

Kamera frei rotieren

Hallo zusammen,
ich hab ein Problem mit meinem Spiel, dass ich nicht gelöst kriege.
Und zwar will ich meine Kamera um ein Objekt rotieren. Um etwas genauer zu sein: Ich habe ein Objekt am Punkt (0,0,0) und eine Kamera, die sich wenn man die linke Maustaste drückt entsprechend um das Objekt bewegt. (der Abstand beleibt ja immer gleich)
Ich benutze die Irrlicht engine. Ich konnte weder bei google noch im Forum etwas finden.
Ich hoffe ihr könnt mir helfen.
Vielen Dank schonmal
Foaly

2

05.05.2010, 09:46

Ist eigentlich gar nicht schwer. Guck welche Angaben man in Irrlicht für die Kamera machen muss, mal dir auf was du haben willst und dann überlege, wie du aus dem, was du hast, das berechnen kannst, was du brauchst.
Beim "um ein Objekt rotieren" wird man sich vermutlich auf einer Kreisbahn um das Objekt herum bewegen wollen, mit sinus und cosinus kann man da also bestimmt was machen.

Für 3D Programmierung muss man eben Ahnung von Mathe haben, es hilft also nichts, sich jetzt hier eine fertige Formel sagen zu lassen, denn letztendlich ist das Problem so leicht, dass du es selbst lösen können solltest. Mach einfach eine Skizze, sag, wie du versuchst es auszurechnen und dann wird man dir hier sagen, was bisher noch falsch ist.
Lieber dumm fragen, als dumm bleiben!

3

06.05.2010, 20:33

Hmm du hast recht :D
Hat mich zwar nen bisschen Mühe gekostet, aber ich habs dann doch alleine hingekriegt. Jetzt funktioniert zwar alles wie ichs mir vorgestellt habt, allerdings bin ich auf ein weiteres Problem gestoßen. Jedes mal wenn ich die "Richtung" ändere (also die Maus erst nach rechts und dann nach links bewege), dann macht alles einen "Sprung" links (manchmal auch nach rechts). Meist so um 90 grad... Ich hab keine Ahnung woran das liegen könnte. Könnt ihr mir helfen?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(rv.leftMouseDown())
{
    if(rv.mouseX() - oldMouseX < 0)
    {
        cameraRotation.X = 10 * cos(wv * timer->getTime());
        cameraRotation.Z = 10 * sin(wv * timer->getTime());
    }

    if(rv.mouseX() - oldMouseX > 0)
    {
        cameraRotation.X = 10 * sin(wv * timer->getTime());
        cameraRotation.Z = 10 * cos(wv * timer->getTime());
    }

    camera->setPosition(core::vector3df(cameraRotation.X, cameraRotation.Y, cameraRotation.Z));
}

oldMouseX = rv.mouseX();

4

06.05.2010, 20:36

Überprüf doch mal die Werte mit dem Debugger, vielleicht hilft dir das ja weiter.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

5

06.05.2010, 21:05

hmm ich hab die vermutung das es am timer liegt, weil wenn ich die maus nicht drucke, dann laeift der ja weiter...
wie mach ich das, das man anstelle des Timer die maus benutzt?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

06.05.2010, 21:30

du musst den wert als grad bzw. bogenmaß speichern und mit hilfe des timers ändern.

kleiner tipp: else wäre in diesem fall viel schneller als ein weiteres if
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

7

06.05.2010, 21:37

vielen dank daran hab ich garnicht gedacht :D ich brauch das zweite if zwar (wenn mdie maus sich nciht bewegt soll die Kamera sich ja auch nciht bewegen) aber ich hab jetzt mal else if genommen.
das mit dem Speichern hab ich nicht verstaden. Was genau meinst du?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

06.05.2010, 21:45

ich glaub es passiert nicht so oft dass sie sich net bewegt.

du speicherst die position in grad, wenn der user die maus um 10pixel bewegt, addierst/subtrahierst du den wert 10 hinzu(sorg dafür dass der wert nicht kleiner als 0 oder größer als 360 wird). dann benutzt du die sinusfunktionen(die bogenmaß erwarten) um einen richtungsvektor zu bekommen, den du dann mit der entfernung multiplizierst und das ergebnis mit der position des objekts addierst.

was ist wv für eine variable? vllt ist das ja der winkel

edit: kleines edit wegen noch schlechterer formulierung als jetzt xD
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

06.05.2010, 21:57

oh Entschuldigung. hab ich vergessen zu schreiben.

Quellcode

1
f32 wv = (2 * PI) / 2000.00f;

wv ist die Winkelgeschwindigkeit.
meinst du dann also sowas in die richtung:
mouseDX = oldMouseX - mouseX + 10;
cameraRotation.X += sin(mouseDX) + 10; // die entfernung ist acuh 10 :D

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

06.05.2010, 22:15

so dreht mein objekt in der ebene um ein anderes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
RotationDregrees += oldMouseX - mouseX;
if(RotationDregrees >= 360) // bei ganzzahlen währe modulo hier übrigens schneller und kompakter
RotationDregrees -= 360;
else if(RotationDregrees < 0)
RotationDregrees += 360;

Position.X = sin(RotationDregrees*M_PI/180) * abstand + ObjektPosition.X; // ObjektPosition = position von dem objekt um das gedreht werden soll
Position.Y = cos(RotationDregrees*M_PI/180) * abstand + ObjektPosition.Y;

ich hoffe das ist verständlich^^
das prinzip sollte sich auch auf den raum anwenden lassen.

auch dir empfehle ich erstmal in der ebene zu arbeiten und dann auf 3d umzusteigen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige