Поворот системы частиц - PullRequest
1 голос
/ 05 марта 2012

Используемые языки / библиотеки: C ++, OpenGL, GLUT

Хорошо, вот сделка.

У меня есть система частиц, которая стреляет из альфа-смешанных текстур для создания пламени. Система отслеживает только самые базовые вещи, такие как время жизни, жизнь, xyz и распространение.

Направление, в котором в настоящее время движется пламя, основано исключительно на том, что происходит в моем коде (я полагаю).

Моя цель, однако, состоит в том, чтобы прикрепить пламя к камере (СДЕЛАНО) и направить пламя в направлении, куда смотрит моя камера (НЕ РАБОТАЕТ).

Я пробовал glRotate для x, y, z и не могу заставить его работать должным образом.

В настоящее время я использую gluLookAt, чтобы переместить камеру и заставить пламя следовать XYZ камеры, вызывая glTranslatef (camX, camY - offset, camZ);

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

Хотя это и не имеет значения, вот изображение (в случае) http://i.imgur.com/YhV4w.png

1 Ответ

1 голос
/ 05 марта 2012

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

static void inverseRotMatrix(const GLfloat in[4][4], GLfloat out[4][4])
{
    out[0][0] = in[0][0];
    out[0][1] = in[1][0];
    out[0][2] = in[2][0];
    out[0][3] = 0.0f;
    out[1][0] = in[0][1];
    out[1][1] = in[1][1];
    out[1][2] = in[2][1];
    out[1][3] = 0.0f;
    out[2][0] = in[0][2];
    out[2][1] = in[1][2];
    out[2][2] = in[2][2];
    out[2][3] = 0.0f;
    out[3][0] = 0.0f;
    out[3][1] = 0.0f;
    out[3][2] = 0.0f;
    out[3][3] = 1.0f;
}

void RenderFlame() 
{
    GLfloat matrix[4][4];
    GLfloat invMatrix[4][4];
    glGetFloatv(GL_MODELVIEW_MATRIX, matrix[0]);

    inverseRotMatrix(matrix, invMatrix);

    glPushMatrix();

    // glMultMatrixf(invMatrix[0]); If you want to rotate the entire body of particles

    for ... each particle
        ...
        glTranslatef(particleX, particleY, particleZ);
        glMultMatrixf(invMatrix[0]);

        DrawParticle();

        ...

     glPopMatrix();
}

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

...