Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2010, 20:58   #1
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию OpenGL. Независимое движение объектов.

Доброе время суток, уважаемые форумчане! Ранее была похожая тема от моего имени по такой задаче: внутри прозрачного куба летают и отталкиваются от его граней 2 объекта, сфера и тор. Собственно вопрос 1): как добиться того, чтобы они летали независимо друг от друга? Есть ли смысл использовать потоки? И вопрос 2) Как задать в начале движения каждой из фигур рандомный вектор полета ? Спасибо заранее, поверьте, очень надо)
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 13.04.2010, 22:29   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

1) храните для каждого объекта, скажем, скорость, положение, матрицу. И отображайте и перемещайте их согласно этим данным.
2) Собственно, задавайте вектор направление для вышеупомянутой структуры данных, а по таймеру или что у вас там перемещайтесь по этому векторую...
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 14.04.2010, 09:01   #3
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Selestis Посмотреть сообщение
1) храните для каждого объекта, скажем, скорость, положение, матрицу. И отображайте и перемещайте их согласно этим данным.
2) Собственно, задавайте вектор направление для вышеупомянутой структуры данных, а по таймеру или что у вас там перемещайтесь по этому векторую...
Матрица для каждого объекта своя, скорости тоже указаны разные. Они должны начинать движение из центра куба, с одинаковыми скоростями но с разными векторами движения. Вопрос как задать этот вектор движения?

Код:
procedure TForm1.FormPaint(Sender: TObject);
var
 ps:TPaintStruct;
begin

  glEnable (GL_NORMALIZE);
  glEnable (GL_LIGHTING);
  glEnable (GL_LIGHT0);
  glEnable (GL_AUTO_NORMAL);
  glEnable(GL_COLOR_MATERIAL);
  glEnable(GL_DEPTH_TEST);
    glLightModelf (GL_LIGHT_MODEL_TWO_SIDE,1);
    Position [0] := 0;
    Position [1] := 0;
    Position [2] := 0.2;
    Position [3] := 1;
    glLightfv (GL_LIGHT0, GL_POSITION, @position);

  glPushMatrix;

  glscalef(4.0,4.0,1.0);

  glEnable(GL_FOG);
  glFogi(GL_FOG_MODE,GL_EXP2);
  glEnable(gl_Blend);
  glFogfv(GL_FOG_COLOR,@FogColor);

  BeginPaint(panel1.Handle, ps);
  glClearColor(0.1,0.3, 0.1, 0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glRotated(45, 0, 0, 0);

  glRotated(RX,1,0,0);
  glRotated(RY,0,1,0);
  glRotated(RZ,0,0,1);

     glPushMatrix; //отрисовка сферы 

       draws;
       glEnable(GL_TEXTURE_2D);
       glTexImage2D(gl_texture_2d,0,3,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,textures[1]);
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
       glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,@back_color);
       glCallList(1);

     glPopMatrix;

     glPushMatrix; // отрисовка тора

          drawt;
          auxSolidTorus(0.02,radT);

     glPopMatrix;


     glPushMatrix; // отрисовка куба, в котором "летают" эти фигуры

  glBegin(GL_QUADS);
   glColor4f(0.0, 1.0, 0.0, 0.25);
   glVertex3f(0.25, 0.25, -0.25);
   glVertex3f(0.25, 0.25, 0.25);
   glVertex3f(0.25, -0.25, 0.25);
   glVertex3f(0.25, -0.25, -0.25);
  glEnd;

  glBegin(GL_QUADS);
   glColor4f(0.0, 0.0, 1.0, 0.25);
   glVertex3f(0.25, -0.25, 0.25);
   glVertex3f(0.25, -0.25, -0.25);
   glVertex3f(-0.25, -0.25, -0.25);
   glVertex3f(-0.25, -0.25, 0.25);
  glEnd;

  glBegin(GL_QUADS);
   glColor4f(1.0, 0.0, 0.0, 0.25);
   glVertex3f(-0.25, -0.25, -0.25);
   glVertex3f(-0.25, -0.25, 0.25);
   glVertex3f(-0.25, 0.25, 0.25);
   glVertex3f(-0.25, 0.25, -0.25);
  glEnd;

  glBegin(GL_QUADS);
   glColor4f(0.25, 1.0, 0.5, 0.25);
   glVertex3f(-0.25, 0.25, 0.25);
   glVertex3f(-0.25, 0.25, -0.25);
   glVertex3f(0.25, 0.25, -0.25);
   glVertex3f(0.25, 0.25, 0.25);
  glEnd;

  glBegin(GL_QUADS);
   glColor4f(0.5, 1.0, 0.25, 0.25);
   glVertex3f(0.25, 0.25, 0.25);
   glVertex3f(0.25, -0.25, 0.25);
   glVertex3f(-0.25, -0.25, 0.25);
   glVertex3f(-0.25, 0.25, 0.25);
  glEnd;

  glBegin(GL_QUADS);
   glColor4f(0.0, 0.25, 0.5, 0.25);
   glVertex3f(0.25, 0.25, -0.25);
   glVertex3f(0.25, -0.25, -0.25);
   glVertex3f(-0.25, -0.25, -0.25);
   glVertex3f(-0.25, 0.25, -0.25);
  glEnd;

         glPopMatrix;
   glPopMatrix;

  glDisable(GL_DEPTH_TEST);
  glFlush();
  swapBuffers(DC);
  endPaint(panel1.Handle,ps);
end;
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 20.04.2010, 21:00   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

в твоём примере ты задаёшь движение объекту так:
Код:
 gltranslatef(px,py,pz);
 gltranslatef(sx,sy,sz);
это те, что в Draws и DrawT.


так вот... чтобы задать движение просто организуй массив, введи туда значения какой-нить функции,то есть допустим

Код:
type t=record
x,y,z:real;
end;
var
 m:array:[0..499] of t
i:integer;

........
begin
for i :=0 to 499 do
begin
m[i].x:=i/1000;
m[i].y:=sin(i mod 360);
m[i].z:=0;
end;
.....

end;
далее делаешь какую то переменную-счётчик , допустим "К",
в FormCreate ей присваиваешь нуль и в FormPaint делаешь так:

Код:
.........
 gltranslatef(m[k].x,m[k].y,m[k].z);
 gltranslatef(m[k].x,m[k].y,m[k].z);
if k<499 then inc(k) else dec(k);
if k<0 then inc(k);
........
либо
gltranslatef(m[k].x-m[k-1].x,m[k].y-m[k-1].y,m[k].z-m[k-1].z);
gltranslatef(m[k].x-m[k-1].x,m[k].y-m[k-1].y,m[k].z-m[k-1].z);
я просто не всматривался в код)))
ну и в таком духе. То есть просто нужно задать какую то функцию и записать всё это в массив.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 20.04.2010 в 21:08.
Rin вне форума Ответить с цитированием
Старый 21.04.2010, 08:07   #5
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Благодарю, попробую)
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 22.04.2010, 03:40   #6
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

да, не за что=). получилось ?
спасиб кстати за небольшое пояснение про сферу.
правда я так её и не сделал))))
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 22.04.2010, 08:03   #7
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Вчера на ДР был, пока не пробовал)) А что именно со сферой не ясно?)
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 24.04.2010, 21:37   #8
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Всем спасибо, сам разобрался, сам дурак)
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
движение графических объектов elka Общие вопросы C/C++ 9 25.04.2012 17:24
OpenGL движение обьектов Krechet Мультимедиа в Delphi 8 31.01.2010 21:10
Движение обьекта в OpenGL Delphi Krechet Помощь студентам 0 24.01.2010 14:22
Движение 2-x объектов (Delphi) VadEr Помощь студентам 2 06.06.2009 17:19
Помогите сделать движение объектов в Pascal Ivanich Помощь студентам 44 11.12.2007 20:33