我正在尝试修改此Digiben样本,以便获得从某个点(撞击点)生成并向上漂浮的粒子的效果,就像火的火花一样。样本中的粒子旋转了一圈...我尝试删除余弦/正弦函数,并用增加Y值的普通glTranslate替换它们,但我无法获得任何实际结果...任何人都可以指出我大致应该在此代码中添加/修改翻译以获得该结果的位置?

void ParticleMgr::init(){
    tex.Load("part.bmp");
    GLfloat angle = 0; // A particle's angle
    GLfloat speed = 0; // A particle's speed
    // Create all the particles
    for(int i = 0; i < P_MAX; i++)
    {
        speed = float(rand()%50 + 450); // Make a random speed
        // Init the particle with a random speed
        InitParticle(particle[i],speed,angle);
        angle += 360 / (float)P_MAX; // Increment the angle so when all the particles are
                                     // initialized they will be equally positioned in a
                                     // circular fashion
    }
}
void ParticleMgr::InitParticle(PARTICLE &particle, GLfloat sss, GLfloat aaa)
{
    particle.speed = sss; // Set the particle's speed
    particle.angle = aaa; // Set the particle's current angle of rotation
    // Randomly set the particles color
    particle.red = rand()%255;
    particle.green = rand()%255;
    particle.blue = rand()%255;
}
void ParticleMgr::DrawParticle(const PARTICLE &particle)
{
    tex.Use();
    // Calculate the current x any y positions of the particle based on the particle's
    // current angle -- This will make the particles move in a "circular pattern"
    GLfloat xPos = sinf(particle.angle);
    GLfloat yPos = cosf(particle.angle);
    // Translate to the x and y position and the #defined PDEPTH (particle depth)
    glTranslatef(xPos,yPos,PDEPTH);
    // Draw the first quad
    glBegin(GL_QUADS);
        glTexCoord2f(0,0);
        glVertex3f(-5, 5, 0);
        glTexCoord2f(1,0);
        glVertex3f(5, 5, 0);
        glTexCoord2f(1,1);
        glVertex3f(5, -5, 0);
        glTexCoord2f(0,1);
        glVertex3f(-5, -5, 0);
    glEnd(); // Done drawing quad
    // Draw the SECOND part of our particle
    tex.Use();
    glRotatef(particle.angle,0,0,1); // Rotate around the z-axis (depth axis)
    //glTranslatef(0, particle.angle, 0);
    // Draw the second quad
    glBegin(GL_QUADS);
        glTexCoord2f(0,0);
        glVertex3f(-4, 4, 0);
        glTexCoord2f(1,0);
        glVertex3f(4, 4, 0);
        glTexCoord2f(1,1);
        glVertex3f(4, -4, 0);
        glTexCoord2f(0,1);
        glVertex3f(-4, -4, 0);
    glEnd(); // Done drawing quad
    // Translate back to where we began
    glTranslatef(-xPos,-yPos,-PDEPTH);
}
void ParticleMgr::run(){
    for(int i = 0; i < P_MAX; i++)
    {
        DrawParticle(particle[i]);
        // Increment the particle's angle
        particle[i].angle += ANGLE_INC;
    }
}

现在,我在循环的前面run()函数的上方,在循环的前面添加了glPushMatrix(),glTranslate(x,y,z),并以x,y,z作为敌人的位置,将它们放置在敌人....那是最好的地方吗?

感谢您的输入!

最佳答案

那样使用glTranslate和glRotate实际上会降低程序的性能。 OpenGL并非场景图,因此矩阵处理函数直接影响绘图过程,即它们不设置“对象状态”。您遇到的问题是4×4矩阵-矩阵乘法涉及64个乘法和16个加法。因此,与直接更新顶点位置相比,您花费96倍的计算能力来移动粒子。

现在解决您的问题:正如我已经告诉您的,glTranslate在4个可选矩阵之一的(全局)矩阵状态下运行。效果会累积,即每个glTranslate将从上一个glTranslate离开的矩阵开始。 OpenGL提供了一个矩阵堆栈,可以在其中推送当前矩阵的一个副本以供处理,然后弹出以恢复到之前的状态。

但是:矩阵操作已从OpenGL-3核心中删除,后来又完全删除。 OpenGL矩阵处理从未得到过加速(除非在SGI于1996年左右制造的一个特定图形工作站上)。如今,它已经过时了,因为每个使用3D几何体的受人尊敬的程序都通过自己的实现或第3方库使用了更为复杂的矩阵操作。 OpenGL的矩阵堆栈只是多余的。因此,我强烈建议您忘记OpenGL的矩阵处理功能,并自行滚动。

关于c++ - OpenGL粒子,有助于控制方向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8160310/

10-17 02:47