首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旋转粒子系统

旋转粒子系统
EN

Stack Overflow用户
提问于 2012-03-05 08:51:18
回答 1查看 902关注 0票数 1

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

好吧,事情是这样的。

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

火焰当前移动的方向纯粹是基于我的代码中正在发生的其他事情(我假设)。

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

我尝试过x,y,z的glRotate,但是我不能让它正常工作。

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

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

尽管最不相关,但这里有一张图片(大小写)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-05 09:35:02

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

代码语言:javascript
复制
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();
}

不过,这可能对你有用,也可能不起作用,这取决于你所做的事情。如果粒子向各个方向扩散,应该没有问题,但如果火焰基本上是平坦的,就会有其他问题。所要做的就是旋转每个粒子,使其面向屏幕。如果你只是旋转相机,它会工作得很好。如果你移动相机,你必须围绕火焰的中心点旋转所有的点。但这确实给了你需要的旋转,通过求逆旋转矩阵,这只是一个你应用了多少次变换的问题。(我添加了一个注释,其中您将应用另一个旋转来旋转粒子的整个身体)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9560396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档