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

09.04.2010, 12:45

Probleme mit der Rotation

So nachdem meine Mathe Klassen so weit fertig sind, wollte ich die mal an ein rotierenden Dreieck ausprobieren... Das Dreieck verändert zwar seine Position aber nur einmal und bewegt sich danach nicht mehr... Ich hab das so gemacht das ich am Anfang der Nachrichtenschleife mir die Zeit hole wie lange der Computer gestartet ist und nachdem ich die Render und Move Funktion aufgerufen habe in einer zweiten Variable nochmal die Zeit speicher, dann zieh ich die zweite Zeit von der ersten ab und teile sie durch 1000 und speicher sie dann in eine float Variable



Hier ist nochmal der Codeausschnitt

Die Nachrichtenschleife

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DWORD dwTime1, dwTime2; 
float fTime = 0.0f; 
while(TRUE) 
{ 
    dwTime1 = timeGetTime(); 
    while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
    } 
    if(msg.message == WM_QUIT) 
       break; 
    else 
    { 
       Render(); 
       Move(fTime); 
       dwTime2 = timeGetTime(); 
       fTime = (float)(dwTime2 - dwTime2) / 1000.0f; 
    }
}




und die Movefunktion

C-/C++-Quelltext

1
2
3
4
void Move(float fTime) 
{ 
     g_fTime += fTime; 
}


Das Dreieck ist dann nur einmal gedreht, so dass die Spitze nach unten zeigt, aber bewegen tut es sich nicht... Wenn ich die Sachen mit der Zeit weglasse und dann und g_fTime bei jeden Funktionsaufruf um 0.05f erhöhe dann rotiert das Dreieck zwar, aber es bewegt sich dann zu schnell

Vielen Dank im voraus

Mfg Male

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Male« (09.04.2010, 12:50)


TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

09.04.2010, 12:53

der relevante code ist move() und render(), weil dort die transformationen drin stehen. zeig die mal her da wird sich sicher der fehler finden.
ansonsten lass erstmal die zeitspanne weg und rechne mit einem festen wert, um den du drehst, unabhängig von der vergangenen zeit, deine methode klingt etwas wirr ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

3

09.04.2010, 12:57

dwTime2 - dwTime2

das ergibt immer null. kann also gar nicht funktionieren.
"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?

4

09.04.2010, 13:09

Ach da hat sich ein Tippfehler eingeschlischen *Schäm* Sollte natürlich dwTime2 - dwTime1 heißen... Es rotiert er zwar aber ziemlich ungleichmäßig, der wird nach der Zeit immer schneller

Die Renderfunktion sieht so aus

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
void Render() 
{ 
    Math::CMatrix4x4 mRotation; 
    Math::CMatrix4x4 mTranslation; 
    Math::CMatrix4x4 mWorld; 

    mRotation = Math::RotationZ(Math::Winkel(g_fTime * 90.0f)); // Funktion Winkel berechnet die übergegebnen Werte in Grad um 
    mTranslation = Math::Translation(Math::CVector3(0.0f, 0.0f, 1.0f)); // Die Z-Achse um 1 erhöhen 
    mWorld = mRotation * mTranslation; // Rotation und Translation miteindaner multiplizieren

    D3DMATRIX m; 
    m = mWorld.GetD3DMatrix(); // Die Klasse CMatrix4x4 in ein D3DMATRIX umwandeln

    pD3DDevice->SetTransform(D3DTS_WORLD, &m); // Worldmatrix setzen 

    pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    pD3DDevice->BeginScene();

    pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, vertices, sizeof(Vertex));

    pD3DDevice->EndScene();

    pD3DDevice->Present(NULL, NULL, NULL, NULL); 
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

5

09.04.2010, 13:13

du benutzt ja auch die programmzeit und nicht die framezeit.
"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?

6

09.04.2010, 13:16

Aber die Framzeit lässt sich mit hilfe der Programmzeit erechnen?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

09.04.2010, 13:20

ja natürlich.
neue programmzeit minus programmzeit des letzten frames.
"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?

8

09.04.2010, 13:22

Ok vielen Dank, ich werde mich mal dann dran setzen und versuchen die Framzeit auszurechnen

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

9

09.04.2010, 13:35

Das machst du doch schon:

C-/C++-Quelltext

1
fTime = (float)(dwTime2 - dwTime2) / 1000.0f;

fTime ist doch die Zeit für eine Einzelbild...
Signaturen werden überbewertet

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

09.04.2010, 13:37

C-/C++-Quelltext

1
2
3
4
void Move(float fTime) 
{ 
     g_fTime += fTime; 
}


hier steckt der fehler ^^
"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