3D-сцена с прокруткой — OpenGL

Я пытаюсь нарисовать облака в окне и анимировать их по направлению к камере. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу делать это непрерывно, без резкой перерисовки чего-либо. Может кто-нибудь сказать мне, что мне здесь не хватает?

Вот код:

#include <gl/glut.h>

int width = 800, height = 600;
float theta = 0, distance1 = -600, distance2 = -600;
void drawCloud()
{
glPushMatrix();
glTranslated(1,0,-2);
glutSolidSphere(4,10,10);
glTranslated(-2,0,-5);
glutSolidSphere(4,10,10);
glTranslated(-1,0,3);
glutSolidSphere(4,10,10);
glPopMatrix();

}

void drawCloudFormation()
{
glPushMatrix();
glTranslated(-60,30,-300);
drawCloud();
glPopMatrix();

glPushMatrix();
glTranslated(15,3,-150);
drawCloud();
glPopMatrix();

glPushMatrix();
glTranslated(50,30,-200);
drawCloud();
glPopMatrix();

glPushMatrix();
glTranslated(-15,-15,-250);
drawCloud();
glPopMatrix();

glPushMatrix();
glTranslated(25,-25,-100);
drawCloud();
glPopMatrix();

glPushMatrix();
glTranslated(-30,0,-50);
drawCloud();
glPopMatrix();
}

void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glPushMatrix();
glTranslated(0,0,distance1);
drawCloudFormation();
glPopMatrix();

glPushMatrix();
glTranslated(0,0,distance1-200);
glScaled(-1,1,1);
drawCloudFormation();
glPopMatrix();

glPushMatrix();
glTranslated(0,0,distance2-400);
glScaled(1,1,-1);
drawCloudFormation();
glPopMatrix();

glPushMatrix();
glTranslated(0,0,distance2-600);
glScaled(-1,1,1);
glScaled(1,1,-1);
drawCloudFormation();
glPopMatrix();

glutSwapBuffers();
}

void idle()
{
theta += 0.2;
if (theta == 360) theta = 360;

distance1 += 1;
if (distance1 > 200) distance1 = -600;

distance2 += 1;
if (distance2 > 600) distance2 = -600;

glutPostRedisplay();
}

void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(width, height);
glutInitWindowPosition(100, 200);
glutCreateWindow("Space Ship");
glClearColor(0, 0, 1, 1);


glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(120, 1, 0.1, 600);
//glOrtho(-2, 2, -2, 2, 0.1, 200);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//gluLookAt(0, 0, -200, 0, 0, -600, 0, 1, 0);

glutDisplayFunc(display);
glutIdleFunc(idle);

glutMainLoop();
}

person Gabriel Ortega    schedule 22.08.2012    source источник
comment
Что происходит/какие ошибки вы получаете, чем это отличается от того, что вы хотите, что вы пытались исправить? Мы не можем просто исправить ваш код, не зная о проблеме, особенно в графике.   -  person ssube    schedule 22.08.2012
comment
Я хочу, чтобы один набор облаков непрерывно рисовался одно за другим. Изначально у меня была одна переменная расстояния для всех 4 облачных образований. Это не сработает, потому что первая формация не будет перерисовываться в фоновом режиме, пока четвертая формация не преодолеет определенное расстояние. Итак, теперь у меня есть 2 переменные расстояния в надежде, что как только первая группа облачных образований преодолеет определенное расстояние, она будет перерисована в фоновом режиме, в то время как второе облачное образование все еще движется к камере.   -  person Gabriel Ortega    schedule 22.08.2012
comment
Прямо сейчас происходит то, что некоторые облачные образования будут резко перерисовываться в середине их анимации (всплывать, всплывать).   -  person Gabriel Ortega    schedule 22.08.2012


Ответы (1)


Посмотрите на системы частиц.

По сути, вам нужен прямоугольный излучатель на дальней стороне вашей сцены, извергающий облака (частицы) с фиксированной скоростью по направлению к камере. Когда облака движутся за камерой, отметьте их как неактивные, и система частиц создаст новые обратно у эмиттера.

person genpfault    schedule 22.08.2012
comment
Большое спасибо .. Это помогает узнать, что вы ищете. - person Gabriel Ortega; 22.08.2012