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

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

1

21.10.2010, 09:51

Mit der Maus die Kamera rotieren

Hallo Leute.
habe folgendes Anliegen....

In einer 3D Scene stelle ich einen Boden und einen darauf befindlichen Würfel dar.
Der Würfel symboliesiert die Spielfigur. Meine Kamera befindet sich in etwas abstand hinter dem Würfel.
Ich möchte nun mit der Maus die Kamera um den würfel rotieren.

Bisher habe ich das folgendermassen gemacht:

Ich habe geprüft ob die Maus sich bewegt hat.
Dann habe ich geguckt in welche Richtung sie sich von der mitte des Fensters bewegt hat und den Abstand von der mitte zur neuen position eben mit einem beliebigen faktor auf die rotation der Kamera gerechnet.
Anschliessend habe ich am Ende der Renderschleife die Maus wieder in die Mitte des fensters gesetzt.

Und das zurücksetzen ist mein sorge.
Ich empfinde dieses zurück setzen als besonders böse weil dadurch viele Mausevents ausgelöst werden.
Das Programm reagiert aber fehelerfrei.

Ich wollte einfach mal wissen wir ihr das so regelt oder ob ihr andere Möglichkeiten habt wie man mit der Maus die Kamera bewegen kann ohne ein Taste zu drücken. Oder ob meine Variante vieleicht ganz normal ist.

2

21.10.2010, 12:23

Du meinst sowas wie eine Orbiter-Kamera?

Ich würde den Cursor ausblenden, weil's irritiert.

Ansonsten, in deiner Move- oder Update-Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    // Eingabe holen
    Input->poll(); // deine Funktion, via DInput oä.

    // Rauf, runter (dt = deltatime)
    if( Input->keyDown(DIK_W) )  
        CameraHeight   += 25.0f * dt;
    if( Input->keyDown(DIK_S) )  
        CameraHeight   -= 25.0f * dt;

    // Mausposition
    CameraRotationY += Input->mouseDX() / 100.0f; // Dividieren, um ruckartige Bewegungen abzudämpfen
    CameraRadius    += Input->mouseDY() / 25.0f;

    // Wenn Rotation > 360°, zurücksetzen 
    if( fabsf(CameraRotationY) >= 2.0f * D3DX_PI ) 
        CameraRotationY = 0.0f;

    // Limit prüfen (wie nah darf die Kamera ans Objekt)
    if( CameraRadius < 5.0f )
        CameraRadius = 5.0f;

   // Viewmatrix aktualisieren
    float x = CameraRadius * cosf(CameraRotationY);
    float z = CameraRadius * sinf(CameraRotationY);
    D3DXVECTOR3 pos(x, CameraHeight, z);
    D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
    D3DXMatrixLookAtLH(&mView, &pos, &target, &up);

    // Viewmatrix setzen
fka tm

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

3

21.10.2010, 12:53

Ich mach das auch mal so, daß ich einfach die Mausposition direkt als Blickwinkel benutze GetCursorPos() (siehe unten) - geht auch ganz gut und man muß nicht unnötig viele Mouseevents abarbeiten, sondern kann sich an der Refreshrate orientieren. Manche Libs wie Glut für OpenGL bieten z.B. auch noch kompfortable Mousefunktionen als Callback-Funktionen an, wie glutMotionFunc(), glutSpaceballMotionFunc(), glutSpaceballRotateFunc(), glutTabletMotionFunc().

C-/C++-Quelltext

1
2
3
4
    POINT p;
    GetCursorPos(&p);
    glRotatef(p.x%360,0,1,0);
    glRotatef(p.y%360,0,0,1);

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

4

21.10.2010, 13:11

Ich hätte vieleicht erwähnen sollen das ich unter c# mit forms arbeite und ein OpenGl control nutze

5

21.10.2010, 15:22

Ja allerdings. ;)
Die Logik bleibt aber eigentlich dieselbe.
fka tm

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

6

21.10.2010, 21:37

Ich hätte einfach den Cursor ausgeblendet und in der Mitte des Fensters ein Cursor-Sprite gerendert.

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

7

16.11.2010, 08:43

So ists angedacht. Problem is eben nur das ich den Cursor aktuell in der Mitte festnagel.
Und das löst ja immer die neuen Events aus.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

16.11.2010, 12:02

Ich löse das normal über folgendes Kugelkoordinatensystem:

(Link)


D.h. meine Kamera hat die 3 Parameter phi (Rotation um die y-Achse), theta (Höhenwinkel) und Radius r. Wenn die Maus sich bewegt dann berechne ich mir die Differenz zur letzten Mausposition. Entsprechend der Differenz in x Richtung inkrementiere bzw. dekrementiere ich dann den Winkel phi und entsprechend der y Differenz den Winkel theta. Zoomen geschieht über den Radius r.
Die Kameraposition bekommt man dann einfach indem man die Kugelkoordinaten in kartesische Koordinaten umrechnet. Ich sehe jedenfalls keinen Grund den Cursor festzunageln!?

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

9

17.11.2010, 10:51

Und was machst du wenn die Maus am linken Rand ist und du dich aber weiter nach links drehen willst?
Beispiel du willst dich 3 mal nach links um die eigene Achse drehen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

17.11.2010, 11:01

Ich versteh nicht ganz, wo wäre da das Problem!?

Werbeanzeige