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

08.01.2008, 16:13

2d rotation prob

hi

Iwie bekomm ich das einfach net hin. Ich möchte einen 2d vektor per Hand um den bildschirmmittelpunkt rotieren.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ivec2 rotation(ivec2 vector, float direction)
{
//punkt verschieben so das der screen mittelpunkt 0,0  ist

vector.x-= 512.0f;
vector.y-= 384.0f;

// Winkel in rad umwandeln

direction=direction*3.1415f/180.0f;

// rotieren nach der formel aus dem buch

vector.x = vector.x*cos(direction)+vector.y*(-sin(direction));
vector.y = vector.x*sin(direction)+vector.y*  cos(direction); 


// zurück verschieben

vector.x+= 512.0f;
vector.y+= 384.0f;

return vector;
}


Iwas muss daran falsch sein. der punkt dreht sich nit im kreis sondern ändert seine entfehrnung zum screenmittelpunkt und dreht sich net gleichmäßig schnell.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

08.01.2008, 16:17

"ivec2" lässt vermuten, dass die Koordinaten x und y nur int sind.
Dann können deine Berechnungen natürlich nicht funktionieren.

3

08.01.2008, 16:20

hmm, stimmt, mal probieren hab mich auch schon gefragt was dieses i da bedeutet...

EDIT: Es macht keinen unterschied. Hab ivec2 mit vec2 getauscht.

4

08.01.2008, 16:28

hmm also mal davon abgesehen, dass das einer der wenigen Fälle ist, wo man ruhig die Funktionen selber schreiben kann (std::sin, std::cos usw.), weil diese für diesen Fall wahrscheinlich viel zu genau arbeiten und damit zu viel performance verheizen, sag mal, wie x und y von vec2 definiert sind ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

08.01.2008, 16:34

Zitat von »"Deviloper"«

hmm also mal davon abgesehen, dass das einer der wenigen Fälle ist, wo man ruhig die Funktionen selber schreiben kann (std::sin, std::cos usw.), weil diese für diesen Fall wahrscheinlich viel zu genau arbeiten und damit zu viel performance verheizen

sin und cos werden direkt auf die entsprechenden Maschinenbefehle (fsin, fcos) abgebildet. Ich denke nicht, dass du da heutzutage noch viel rausholen kannst. Selbst wenn du sin und cos mit Taylorreihen annäherst, musst du noch dafür sorgen, dass die Eingabe im richtigen Wertebereich liegt, was wohl ein recht teures Floating point-Modulo erfordern würde.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

6

08.01.2008, 16:36

C-/C++-Quelltext

1
2
3
// rotieren nach der formel aus dem buch 

vector.x = vector.x*cos(direction)+vector.y*(-sin(direction)); 
vector.y = vector.x*sin(direction)+vector.y*  cos(direction);


Dieser Code kann nicht funktionieren. Die Formel ist definiert als:

Quellcode

1
2
x_v' = x_v * cos(alpha) - y_v * sin(alpha);
y_v' = x_v * sin(alpha) + y_v * cos(alpha);


Wo da der Unerschied ist? Hinter dem Gleichheitszeichen steht keine Komponente von v'! nach der ersten Codezeile hat sich x_v bei dir bereits geändert, du brauchst aber für die neue Y-Koordinate nochmal die originale X-Koordinate. Korrigiert:

C-/C++-Quelltext

1
2
3
4
5
6
float fCos = cos(direction), fSin = sin(direction);
// rotieren nach der formel aus dem buch 

float x = vector.x * fCos - vector.y * fSin; 
float y = vector.x * fSin + vector.y * fCos;
// jetzt erst übernehmen

vector.x = x; vector.y = y;

7

08.01.2008, 17:14

Ah, danke, jetzt gehts :)

Werbeanzeige