c++ - 旋转粒子系统

标签 c++ opengl rotation glut particles

使用的语言/库:C++、OpenGL、GLUT

好的,这就是交易。

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

火焰当前移动的方向完全基于我的代码中发生的其他事情(我假设)。

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

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

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

如有任何关于如何使用相机旋转火焰方向的建议,我们将不胜感激。

虽然最不相关,但这是一张图片(以防万一) http://i.imgur.com/YhV4w.png

最佳答案

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

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

这可能对您有用,也可能不适合您,具体取决于您在做什么。如果颗粒向各个方向扩散应该没问题,但如果火焰基本上是平的,你就会遇到其他问题。所有这一切都是旋转每个粒子,使其面向屏幕。如果你只是旋转相机,它会工作正常。如果移动相机,则必须围绕火焰的中心点旋转所有点。但这确实通过反转旋转矩阵为您提供了所需的旋转,这只是您应用变换多少次的问题。 (我添加了一条评论,您可以在其中应用另一个旋转来旋转整个粒子体)

关于c++ - 旋转粒子系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9560396/

相关文章:

java 两个旋转矩形之间的碰撞检测

Android动画无限旋转,不停顿

c++ - 一生运行一次的代码

c++ - std::vector 的表达式模板运算符重载问题

c++ - 为什么 const 变量是可修改的?

c++ - glsl 顶点着色器统一变量未激活

c++ - 使用面向对象的方法加载着色器

java swing - JLabel不旋转

c++ - 如何将 json 数据从 Poco c++ json 转换为 XML?

c++ - OpenGL 3.x Assimp 实现 phong 着色(法线?)