2016-02-05 6 views
0

Итак, я искал это из wazoo и просматривал всевозможные ресурсы - тексты, лекции и т. Д. - но я либо что-то пропустил, либо просто не понял его правильно. Для класса в OpenGL нам нужно разработать игру с астероидами, которая кажется простой концепцией, но мне очень трудно получить движение моего корабля прямо. Я знаю, что нам нужно перевести наш корабль в начало, выполнить поворот и перевести его обратно в соответствующее положение - проблема, с которой я столкнулась, - это понимание ее выполнения. Код у меня есть для рисования корабля это до сих пор:OpenGL - Вращение двумерного астероида

void 
drawShip(Ship *s) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 


    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glPushMatrix(); 
    myTranslate2D(s->x, s->y); 
    float x = s->x, y = s->y; 
    myRotate2D(s->phi); 
    glBegin(GL_LINE_LOOP); 
    glVertex2f(s->x + s->dx, s->y + s->dy + 3); 
    glVertex2f(s->x + s->dx-2, s->y + s->dy - 3); 
    glVertex2f(s->x + s->dx, s->y + s->dy -1.5); 
    glVertex2f(s->x + s->dx + 2, s->y + s->dy - 3); 
    glEnd(); 
    myTranslate2D(s->x - x, s->y - y); 
    glPopMatrix(); 
} 

При вращении и движении определяется следующим переменными, которые правильно измененными в функции клавиатуры:

if (left == 1) 
    { 
     ship.phi -= 0.3; 
    } 
    if (right == 1) 
    { 
     ship.phi += 0.3; 
    } 
    if (up == 1) 
    { 
     ship.dx += -2.0*sin(ship.phi); 
     ship.dy += 2.0*cos(ship.phi); 
    } 
    if (down == 1) 
    { 
     ship.dx += 2.0*sin(ship.phi); 
     ship.dy += -2.0*cos(ship.phi); 
    } 
    drawShip(&ship); 

После того, как я получаю вращение вниз, я уверен, что я смогу выполнить все остальное. Как бы то ни было, приведенный выше код позволит моему объекту либо вращаться в начале, либо вокруг него, но он не будет вращаться на месте, если он не находится непосредственно в начале координат. Само судно было инициализировано точками (0,0), (25, 25) и (50, 50), и для моих целей происхождение экрана (0,0) является нижним левым углом.

Может кто-нибудь помочь мне понять, почему мой корабль не будет вращаться на месте, и только о происхождении? Я ожидаю, что это имеет какое-то отношение к тому, как я выполняю свои переводы и ротацию, но я не понимаю, что.

+0

Похож на C. Не добавляйте тег C++ для вопросов C, это разные языки! – Olaf

ответ

1

Ваша функция розыгрыша кажется неправильной. Ваш дизайн корабля не должен зависеть от его положения. Это означает, что координаты вершин всегда должны быть одинаковыми. Затем используйте GlTranslate и Rotate, чтобы попасть в правильное положение. Вы также выполняете перевод после того, как вы нарисуете и перед тем, как вы поместите матрицу. Это ничего не делает, потому что изменения матрицы применяются только к вершинам, определенным после изменения матрицы.

Структура должна быть чем-то вроде этого:

// Make sure the origin is in the 0, 0 of your space. 
GlPushMatrix(); // Save this setup 
GlTranslate(ship.x, ship.y); // Location of the ship. 
GlRotate(ship.phi); // Or whatever is the name of the angle of the ship. 

DrawShip(); // Draws the sprite/wireframe/object you want. 
GlPopMatrix(); // Return to the original setup. 
+0

Спасибо, это на самом деле указывало мне на правильный путь! То, что вы показывали, было фактически тем, что я делал, но с оговоркой, что я делаю странные модификации внутри линии. Большое спасибо! – JonMcDev

1

Хорошо, я на самом деле понял это с какой-то тыкать. Проблема заключалась в том, что я делал изменения скорости непосредственно из ничьей, вместо того, чтобы вычислять новую позицию на основе скорости и переводить как таковую. Вот фиксированный код:

glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glPushMatrix(); 
    float newX = s->x + s->dx, newY = s->y + s->dy; 
    myTranslate2D(newX, newY); 
    myRotate2D(s->phi); 
    glBegin(GL_LINE_LOOP); 
    glVertex2f(s->x, s->y + 3); 
    glVertex2f(s->x - 2, s->y - 3); 
    glVertex2f(s->x, s->y - 1.5); 
    glVertex2f(s->x + 2, s->y - 3); 
    glEnd(); 
    glPopMatrix(); 
Смежные вопросы