Как нарисовать многоугольники со случайными номерами вершин и повернуть их? - PullRequest
1 голос
/ 02 ноября 2019

В 2D астероидной игре я пытаюсь нарисовать случайные многоугольники, которые будут вращаться с разной скоростью. Я подумал о генерации переменных "вершина", "ось", "яксис" и радиус с помощью функции rand (). Но проблема в том, что когда я их рисую и вращаю, кажется, что это происходит постоянно. как будто каждый раз при вращении он рисует новый многоугольник.

Вот так я рисую многоугольники, выбирая вершины по окружности воображаемого круга.

void spinAsteroid(bool zaxis, GLfloat rotation, GLfloat radius, GLfloat xpos, GLfloat ypos, bool multiplyMatrix, int speed)
{   

    GLfloat z;
    z = 0.0;
    int vertexRand = (rand() % 9) + 1;
    int vertex = vertexRand;

    if (zaxis)z = 1.0;

    if (!multiplyMatrix) {
        glLoadIdentity();
    }
    glTranslatef(xpos, ypos, 0);
    glRotatef(rotation, 0, 0, z);
    glTranslatef(-xpos, -ypos, 0);
    drawAsteroid(radius, vertex, xpos, ypos);
}

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    //glPushMatrix();
    if(value!=7){ translatePattern(); }

    //glPopMatrix();
    //glPushMatrix();
    int count = 0;
    while(count<11){
        int randIndex = rand() % 10;
        int vertexRand = (rand() % 9) + 1;
        spinAsteroid(true, angle, radius[randIndex], xaxis[randIndex], yaxis[randIndex], false, 2);
        count++;
    }

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

1 Ответ

0 голосов
/ 03 ноября 2019

Операции типа glTranslate и glRotate определяют матрицу преобразования и умножают текущую матрицу на новую матрицу.
Если вы выполняете умножение преобразований в строке,затем преобразования объединяются с предыдущими преобразованиями.

Для отдельных преобразований для каждого астероида необходимо сохранить текущую матрицу до применения преобразований для астероида и восстановить текущую матрицу после рисования астероида.
Поскольку Устаревшие матрицы OpenGL организованы в стеке, этого можно добиться, нажав и вытолкнув текущую матрицу (см. glPushMatrix / glPopMatrix).

Кроме того, вы должны установить массив случайных точек и радиусов, но вы должны нарисовать их в одном и том же порядке в каждом кадре.

например:

void spinAsteroid(GLfloat rotation, GLfloat radius, GLfloat xpos, GLfloat ypos, int vertex, int speed)
{   
    glPushMatrix();

    glTranslatef(xpos, ypos, 0);
    glRotatef(rotation, 0, 0, 1.0f);
    glTranslatef(-xpos, -ypos, 0);
    drawAsteroid(radius, vertex, xpos, ypos);

    glPopMatrix();
}
for(int i = 0; i < 10; ++i)
{
    spinAsteroid(angle, radius[i], xaxis[i], yaxis[i], i+1, 2);
}

...