2016-04-10 4 views
1

Ich möchte mein Dreieck drehen, aber es gibt einige Probleme.Dreieck Drehung verursacht Verformung

Die Standardform: enter image description here

ich es mit meinen Pfeiltasten am rotierenden aber wie Sie sehen es einige Verformungen auf Form des Dreiecks hat: enter image description here

Hier ist mein Code:

typedef struct { 
point_t pos; // position of the triangle 
float angle; // view angle 
float r; 
} weapon_t; 


void drawPlayer(weapon_t tw) { 

glBegin(GL_TRIANGLES); 
glColor3f(0.1, 0.2, 0.3); 
glVertex2f(tw.pos.x, tw.pos.y); 
glVertex2f(tw.pos.x + 150 * cos(tw.angle * D2R), tw.pos.y + 100 * sin(tw.angle * D2R) + 8); 
glVertex2f(tw.pos.x + 150 * cos(tw.angle * D2R), tw.pos.y + 100 * sin(tw.angle * D2R) - 8); 
glEnd(); 
} 

void onTimer(int v) { 

glutTimerFunc(TIMER_PERIOD, onTimer, 0); 

if (right) { 
    if (weapon.angle != -45) 
     turnWeapon(&weapon, -3); 
} 
if (left) { 
    if (weapon.angle != 45) 
     turnWeapon(&weapon, 3); 
} 

Irgendwelche Idee Leute?

Antwort

3

Ich weiß nicht, woher Sie Ihre Formeln haben, aber sie sind falsch. Um einen 2D-Vektor gegen den Uhrzeigersinn um den Winkel x zu drehen, können Sie die Rotationsmatrix [cos (x), -sin (x); sin (x), cos (x)] (das können Sie leicht mit exp(i*x) = cos(x) + i*sin(x) beweisen). Sie möchten die Vektoren [150, 108] und [150, 92] drehen, wenn Sie diese mit der Rotationsmatrix multiplizieren, erhalten Sie [150 * cos (x) - 108 * sin (x), 150 * sin (x) + 108 * cos (x)] und [150 * cos (x) - 92 * sin (x), 150 * sin (x) + 92 * cos (x)].

in Code übersetzt dies wie folgt aussieht:

float c = cos(tw.angle * D2R); 
float s = sin(tw.angle * D2R); 
glVertex2f(tw.pos.x + 150*c - 108*s, tw.pos.y + 150*s + 108*c); 
glVertex2f(tw.pos.x + 150*c - 92*s, tw.pos.y + 150*s + 92*c); 
+0

Vielen Dank für Geck helfen, ich die Formeln nahm von meinem Kursleiter :) Ich habe es wie folgt geändert: glVertex2f (tw.pos.x + 150 * c - 8 * s, tw.pos.y + 150 * s + 8 * c); \t glVertex2f (tw.pos.x + 150 * c + 8 * s, tw.pos.y + 150 * s - 8 * c); und es funktioniert total. –