@ctx26

Как изменять координаты объектов OpenGL?

Есть код, следующий код
#include
#include
#include
using namespace std;

class Circle
{
public:
float x, y, r, alpha;
Circle(float _x=0.0, float _y=0.0, float _r=0.0):x(_x), y(_y), r(_r), alpha(1.0){};
void draw();
};

void Circle::draw()
{
glColor4f(1.0, 1.0, 0.0, this->alpha);
glBegin(GL_LINE_LOOP);
for(float i=0.0; i<2*3.14; i+=3.14/18)
{
glVertex2f(this->x+this->r*sin(i), this->y+this->r*cos(i));
}
glEnd();
}

vector circ;

float WinWid=400.0;
float WinHei=400.0;

float X=0.0, Y=0.0;

void Draw()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_ALPHA);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
vector::iterator i=circ.begin();
while(i!=circ.end())
{
i->draw();
if(i->alpha<=0.05f)
i=circ.erase(i);
else
++i;
}
glDisable(GL_BLEND);
glDisable(GL_ALPHA);
glutSwapBuffers();
}

void Timer(int value)
{
for(vector::iterator i=circ.begin(); i!=circ.end(); i++)
{
i->r++;
i->alpha/=1.05;
}
glutPostRedisplay();
glutTimerFunc(50, Timer, 0);
}

void Timer2(int)
{
Circle c(rand() % int(WinWid) - WinWid/2, 0 ,0);
circ.push_back(c);
glutPostRedisplay();
glutTimerFunc(200, Timer2, 0);
}
void Initialize()
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-WinWid/2, WinWid/2, WinHei/2, -WinHei/2, -200.0, 200.0);
glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(WinWid, WinHei);
glutInitWindowPosition(100, 200);
glutCreateWindow("Lesson 08");
glutDisplayFunc(Draw);
glutTimerFunc(0, Timer, 0);
glutTimerFunc(0, Timer2, 0);
Initialize();
glutMainLoop();
return 0;
}

Теперь необходимо сделать так, чтобы появляющиеся круги двигались строго вверх по y от нуля и их радиус зависел от это координаты. Т.е. например в координаты y=200 радиус круга был наибольшим.
По достижению этого радиуса круг исчезал.
Подскажите, как это сделать ?
  • Вопрос задан
  • 2513 просмотров
Пригласить эксперта
Ответы на вопрос 2
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.

glColor4f(1.0, 1.0, 0.0, this->alpha);
glBegin(GL_LINE_LOOP);
for(float i=0.0; i<2*3.14; i+=3.14/18)
{
glVertex2f(this->x+this->r*sin(i), this->y+this->r*cos(i));
}
glEnd();

шел 2015 год...

Рекомендую ознакомится с https://code.google.com/p/gl33lessons/ без воды и все по делу
Ответ написан
SHVV
@SHVV
У вас же итак функция отрисовки окружности может рендерить их в произвольных координатах, так что достаточно двигать их в первом таймере и там же удалять:
for(vector::iterator i=circ.begin(); i!=circ.end(); i++) {
  i->r++; // Увеличивается радиус
  i->alpha/=1.05; // Уменьшается прозрачность
  i->y += 10; // Двигаем вверх по y (может придётся поменять на - , если будут двигаться не в ту сторону)
  if (i->y >= 200) {
    i = circ.erase(i);
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы