C++ OpenGL粒子,帮助控制方向
我试图修改这个Digiben样本,以获得从一个点(撞击点)产生的粒子的效果,并像火的火花一样向上漂浮。样本中的粒子在一个圆圈中旋转。。。我尝试过删除余弦/正弦函数,并用一个增加Y值的普通glTranslate替换它们,但我无法得到任何实际结果。。。谁能大致指出我应该在代码中添加/修改翻译以获得该结果C++ OpenGL粒子,帮助控制方向,c++,opengl,particles,C++,Opengl,Particles,我试图修改这个Digiben样本,以获得从一个点(撞击点)产生的粒子的效果,并像火的火花一样向上漂浮。样本中的粒子在一个圆圈中旋转。。。我尝试过删除余弦/正弦函数,并用一个增加Y值的普通glTranslate替换它们,但我无法得到任何实际结果。。。谁能大致指出我应该在代码中添加/修改翻译以获得该结果 void ParticleMgr::init(){ tex.Load("part.bmp"); GLfloat angle = 0; // A particle's angle
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;
}
}
void ParticleMgr::init(){
tex.Load(“part.bmp”);
GLfloat angle=0;//粒子的角度
GLfloat speed=0;//粒子的速度
//创建所有粒子
对于(int i=0;i
现在,我在上面的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几何程序都通过自己的实现或第三方库使用更复杂的矩阵操作。OpenGL的矩阵堆栈只是多余的。因此,我强烈建议您忘记OpenGL的矩阵操作功能,自己动手吧。那样使用glTranslate和glRotate实际上会降低程序的性能。OpenGL不是场景图,因此矩阵操作函数直接影响绘图过程,即它们不设置“对象状态”。您遇到的问题是,4×4矩阵乘法涉及64次乘法和16次加法。因此,移动粒子的计算能力是直接更新顶点位置的96倍 现在来谈谈你的问题:正如我已经告诉过你的,glTranslate对4个可选矩阵之一的(全局)矩阵状态进行操作。并且效果会累积,即每个glTranslate将从上一个glTranslate左侧的矩阵开始。OpenGL提供了一个矩阵堆栈,用户可以在其中推送当前矩阵的副本,然后弹出以恢复到之前的状态 然而:矩阵操作已经从OpenGL-3核心中删除,后来完全删除。OpenGL矩阵操作从未加速过(SGI在1996年左右制造的一个特殊图形工作站除外)。今天,这是一个时代错误,因为每一个值得尊敬的3D几何程序都通过自己的实现或第三方库使用更复杂的矩阵操作。OpenGL的矩阵堆栈只是多余的。所以我选择了