GLUT просто нарисуйте игру «Корабль для астероидов», но не можете правильно перемещать и вращать корабль - PullRequest
1 голос
/ 26 сентября 2019

Примитив Ship Asteroid:

img

просто нарисуйте игру Ship for Asteroid, но не можете правильно двигаться и вращать корабль

  1. Проблема: Не могу найти какиспользуйте переменную Angle для правильного вращения корабля по центру;
  2. Проблема: Не могу найти, как использовать угол с положением, чтобы получить правильное направление для перемещения корабля

Посмотрите мой код и, если возможно, помогите мне:

typedef struct {float x; float y; float z; float angle;} point2D;

class player    //player class is ship
{
protected:

public:

    point2D position, angle;

    player()
    {
        position.x = 0.0; 
        position.y = 0.0;
        angle.z = 0.0;
    }

    void set_position(float x, float y) //Set position of player
    { 
        position.x=x;
        position.y=y;
    }
    void draw_ship()
        {

                glPushMatrix();
                glTranslatef(position.x,position.y,0);
                glRotatef(angle.z, 0.,0.,0.1);     
                glScalef(0.10,0.075,0.10);
                glBegin(GL_LINE_LOOP);
                                            glColor3ub(redc, greenc, bluec);                        
                    glVertex2f( 1.0f, 2.0f);                
                    glVertex2f( 1.4f, 0.4f);                
                    glVertex2f( 1.2f, 0.6f);    
                    glVertex2f( 0.8f, 0.6f);    
                    glVertex2f( 0.6f, 0.4f);
                glEnd();

                glPopMatrix();
    }


};
 player ship;

void display() {
   glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
   glClear(GL_COLOR_BUFFER_BIT);// Clear the color buffer (background

   glEnable( GL_TEXTURE_2D );

   background();
   gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   glDisable( GL_TEXTURE_2D );

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity(); 

   ship.draw_ship();

   glutSwapBuffers();   // Double buffered - swap the front and back buffers
}

* Callback handler for special-key event */
void specialKeys(int key, int x, int y) {
    switch (key) {

       case GLUT_KEY_RIGHT:    
         ship.angle.z -= 10.0f;
       break; 

       case GLUT_KEY_LEFT:   
         ship.angle.z += 10.0f;
       break;            
       case GLUT_KEY_UP: 
         ship.position.x = ship.position.x + sin(ship.angle.z) * 0.02;
         ship.position.y = ship.position.y + cos(ship.angle.z) * 0.02;

         printf("posx is: %f",  ship.position.x);
         printf("posy is: %f", ship.position.y);

      break;       

   }

}

1 Ответ

0 голосов
/ 28 сентября 2019

Ваша проблема в том, что glRotate всегда вращается вокруг (0,0,0) ... поэтому, чтобы сделать ваше правое преобразование, сначала поверните идентичность, а затем переведите.Но есть небольшая проблема, потому что glTranslate будет использовать локальные координаты, и вам нужны глобальные ... к счастью, вы можете установить источник матрицы напрямую.Как комментарии, где вам не хватает вот как это будет выглядеть:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();                   // unit matrix
glRotatef(angle.z,0.0,0.0,1.0);     // rotate around (0,0,0) and z axis
double m[16];
glGetDoublev(GL_MODELVIEW_MATRIX,m);// get actual matrix into CPU side memory/code
m[12]=position.x;                   // change the global position
m[13]=position.y;
m[14]=0.0;
glLoadMatrix(m);                    // update GL matrix with the changed one
glScalef(0.10,0.075,0.10);          // scale ship

Если ваша позиция в уже масштабированных координатах, то шкала будет идти сразу после поворота.

ОстерегайтесьЯ написал это прямо в редакторе ответов, поэтому возможны незначительные синтаксические ошибки ...

кстати, вы можете использовать m также для движения в направлении корабля m[0,1,2] это x направление оси и m[4,5,6]это y ось.не уверен, в какой точке указана модель вашего корабля.Вы просто добавляете этот forward вектор, умноженный на speed/deltatime к вашей позиции в некотором таймере.

Для получения дополнительной информации о матрицах см .: Понимание матриц однородного преобразования 4x4

...