Я пытаюсь изменить этот образец Digiben, чтобы получить эффект частиц, которые генерируются из пятна (точки удара), и плавать вверх, подобно искрам огня. Образец имеет частицы, вращающиеся по кругу ... Я попытался удалить функции косинуса/синуса и заменить их нормальным glTranslate с увеличением значения Y, но я просто не могу получить никаких реальных результатов ... может кто-нибудь отметить где я должен добавить/изменить перевод в этом коде, чтобы получить этот результат?Частицы OpenGL, управление направлением управления
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;
}
}
На данный момент я добавление glPushMatrix(), glTranslate (х, у, г) в функции Run() выше, прямо перед циклом, с х, у, г как позиции противника для размещения их на вершине врага .... это лучшее место для этого?
Спасибо за любой ввод!
Можете ли вы также показать модифицированный код, который вы пытались использовать, который не использует sin и cos? – NickLH
Я понимаю, что на каждом проходе частица [i] .angle увеличивается, поэтому я заменил 'glTranslatef (xPos, yPos, PDEPTH);' с помощью 'glTranslatef (0, particle [i] .angle, PDEPTH); получить Y-апелляцию, но я получаю частицы, разбросанные по всему пространству во всех направлениях ..... – Alex
Если вы используете glTranslatef, постарайтесь не использовать glRotatef, так как это вызовет рассеяние. После того, как вы получите перевод, затем начните возвращать вращения и будьте осторожны с порядком, который вы делаете, перевод, за которым следует поворот, не совпадает с поворотом, за которым следует перевод. – NickLH