2016-04-10 18 views
1

三角形を回転させたいが、いくつか問題がある。 三角形の回転で変形が発生する

そのデフォルト形式: enter image description here

私は、矢印キーでそれを回転させていますが、それは三角形の形状にいくつかの変形を持っているあなたが見るように:

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); 
} 
:ここ enter image description here

が私のコードです

何人か考えてみませんか?

答えて

3

どこから数式を取得したのか分かりませんが、間違っています。 2Dベクトルを角度xを中心に反時計回りに回転させるには、回転行列[cos(x)、-sin(x); sin(x)、cos(x)](これは簡単にexp(i*x) = cos(x) + i*sin(x)で証明できます)。回転行列[150 * cos(x) - 108 * sin(x)、150 * sin(x)+ 108]を乗算するとベクトル[150、108]と[150、92] (x)+ 92 * cos(x)]となるように、(x *これは、このようなコードに翻訳

:男を助けるため

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

おかげで、私はこのようにそれを変更している私のコースのインストラクター:)から数式を取った: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);それは完全に働いています。 –