旋转粒子系统

时间:2012-03-05 00:51:18

标签: c++ opengl rotation glut particles

正在使用的语言/库:C ++,OpenGL,GLUT

好的,这是交易。

我有一个粒子系统可以射出alpha混合纹理来产生火焰。 该系统只跟踪非常基本的事物,如时间,生命,xyz和传播。

火焰当前进入的方向纯粹基于我的代码中正在进行的其他事情(我假设)。

然而,我的目标是将火焰连接到相机(DONE)并使火焰指向我的相机所面向的方向(不工作)。

我已经为x,y,z尝试了glRotate,我无法让它正常工作。

我正在使用gluLookAt来移动相机,并通过调用glTranslatef(camX,camY - offset,camZ)让火焰跟随相机的XYZ;

有关如何使用相机旋转火焰方向的任何建议都将非常感激。

虽然最无关紧要,但这里是一张图片(包含) http://i.imgur.com/YhV4w.png

1 个答案:

答案 0 :(得分:1)

您需要知道相机的方向,以确定如何更改火焰粒子的方向。您需要基本上反转相机的旋转矩阵。如果我这样做,我会在本地保留一份转换副本,以便我可以快速访问摄像机旋转。另一种方法是读取变换矩阵并计算矩阵的反向旋转。

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();
}

根据您的工作情况,这可能适用于您,也可能不适合您。如果颗粒在所有方向上扩散,它应该没问题,但如果火焰基本上是扁平的,那么你会遇到其他问题。所有这一切都是旋转每个粒子,使其面向屏幕。如果你只是旋转相机它会工作正常。如果移动相机,则必须旋转所有点以及火焰的中心点。但这确实通过反转旋转矩阵为您提供所需的旋转,这仅仅是您应用变换的次数的问题。 (我添加了一个注释,您可以应用另一个旋转来旋转整个粒子体)