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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2009, 23:08   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Движение объекта по точкам(OpenGl).Подскажите.

Всем привет. У меня возникла проблема, может кто то подскажет:
рисую, например, квадрат при помощи OpenGL и мене необходимо по заданным точка(вводятся пользователем, допустим 5 точек) прорисовать движение квадрата по этим точка. Вопрос, как это сделать?

Вот сделал я движение квадрата, но здесь я просто увеличиваю координаты X и Y одной точки. Подскажите пожалуйста как реализовать движение,например, по 5 точкам или если не тяжело скажите что мене надо исправить в своем коде.


P.S. OpenGL начал учить недавно. Так что не ругайтесь если че не так.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    DC: HDC;
    hrc: HGLRC;
    procedure PixelFormat;
    procedure Paint(x,y:real);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ox,oy:real;
implementation

{$R *.dfm}

procedure TForm1.Paint(x,y:real);
var
 ps:TPaintStruct;
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity( ); 
if width <= height then
  glOrtho (-2, 2, -2*height/width, 2*height/width, -10.0, 10.0)
 else
  glOrtho (-2*width/height, 2*width/height, -2, 2, -10.0, 10.0);
glViewport(0, 0, width, height);

  BeginPaint(Handle,ps);

  glEnable(GL_DEPTH_TEST);

 glClearColor(1,0.5,0.5,1);
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glColor3f (0.0, 1.0, 0.0);

 glTranslatef(x,y,0.0);//Вот это выполняет движение квадрата.

 glBegin(GL_QUAD_STRIP);
  glVertex3f(0.3,0.3,0.3);
  glVertex3f(0.3,-0.3,0.3);
  glVertex3f(-0.3,0.3,0);
  glVertex3f(-0.3,-0.3,0);
 glEnd;
 glDisable(GL_DEPTH_TEST);

 glFlush();
 swapBuffers(dc);
 EndPaint(Handle,ps);
end;


procedure TForm1.PixelFormat;
var
 nPixelFormat:Integer;
 pfd:TPixelFormatDescriptor;
begin
 FillChar(pfd,Sizeof(pfd),0);
pfd.nSize:=sizeof(pfd); 
pfd.nVersion:=1;
 pfd.dwFlags:=PFD_DOUBLEBUFFER+PFD_SUPPORT_OPENGL+
      PFD_DRAW_TO_WINDOW; 
 pfd.iPixelType:=PFD_TYPE_RGBA;
 pfd.cColorBits:=24; 
 pfd.cAlphaBits:=64;
 pfd.cAccumBits:=64;
 pfd.cDepthBits:=32;
 pfd.cStencilBits:=64;
 pfd.iLayerType:=PFD_MAIN_PLANE; 
 nPixelFormat:=ChoosePixelFormat(DC,@pfd);
 if nPixelFormat<>0 then
  SetPixelFormat(DC,nPixelFormat,@pfd);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   DC:= GetDC(Handle);
   PixelFormat;
   hrc:= wglCreateContext(DC);
   wglMakeCurrent(DC,hrc);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
   Paint(ox,oy);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   wglMakeCurrent(0,0);
   wglDeleteContext(hrc);
   ReleaseDC(handle,DC);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   ox:= ox+0.2;
   oy:= oy+0.2;
   Paint(ox,oy);
end;

end.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 09.04.2009, 22:20   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Народ, ну может подскажите.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 09.04.2009, 22:57   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Вам даны точки, следовательно, вы можете передвигать квадрат по отрезку, их соединяющему. Делаете вектор и по чему-то вроде таймера берёте подходящее по длине значение. Потом glTranslatef(X,Y,Z) вашего нового положения перемещает объект. Что конкретно не выходит?
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 09.04.2009, 23:36   #4
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Конкретно не получается следующее :

ввожу я координаты X и Y для каждой точки (Z=0), как мене по очереди передать эти координаты в glTranslatef(X,Y,Z).
Если пишу подряд
Код:
glTranslatef(X1,Y1,0);
glTranslatef(X2,Y2,0);
glTranslatef(X3,Y3,0);
glTranslatef(X4,Y4,0);
glTranslatef(X5,Y5,0);
то квадрат не двигается по пяти точкам, только сдвигается на одну(первую) и останавливается.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 09.04.2009, 23:44   #5
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Каждый вызов glTranslatef домножает текущую матрицу на новую, => рисуете вы там, куда попали после всех преобразований. Последний пост(код) по очереди передвигает объект на все вектора Xn,Yn, не рисуя после каждого раза.
Задайте точки, потом при каждом OnTimer проверяйте текущее положение куба на близость к следующей и при малой дистанции подставляйте след. точку.
Код:
if Distance(CubePos, NextPoint) < EPSILON then begin
Inc(i);
 NextPoint:=Points[i];
end;
Pos:=VectorAdd(Pos,VectorScale(VectorSubtract(NextPoint,Pos),Koeff));
Если я вас правильно понял.
Изобретатель велосипедов

Последний раз редактировалось Selestis; 09.04.2009 в 23:47.
Selestis вне форума Ответить с цитированием
Старый 09.04.2009, 23:55   #6
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Может я вас не правильно понял, но я просто хочу ввести координаты 5 точек и передвинуть по ним квадрат. Только я не знаю как правильно и сколько раз вызвать glTranslatef(X,Y,0); чтобы квадрат передвинулся по этим 5 точкам. Вот в чем проблема. Он у меня только на одну точку передвигается.

P.S.А нету какого то попроще способа переместить этот квадрат по 5 точкам???
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 09.04.2009, 23:57   #7
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Что вы подразумеваете под "ввести координаты 5 точек и передвинуть по ним квадрат"? Фраза не совсем однозначная, согласитесь. Поточнее опишите необходимый процесс и тогда я скорее всего смогу помочь
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 10.04.2009, 00:06   #8
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Вот смотрите. Ввожу я координаты пяти точек: Point1(X1,Y1) ; Point2(X2,Y2) ; Point3(X3,Y3) ; Point4(X4,Y4) ; Point5(X5,Y5), то есть я ввожу X1,Y1 и так аж до X5,Y5. И мене необходимо прорисовать движение квадрата по этим пяти точкам. Вот, как это все сделать?

Но, когда я для движения пишу код
Код:
glTranslatef(X1,Y1,0);
glTranslatef(X2,Y2,0);
glTranslatef(X3,Y3,0);
glTranslatef(X4,Y4,0);
glTranslatef(X5,Y5,0);
то квадрат передвигается только на первую точку, то есть на Point1(X1,Y1), и то я этого движения не вижу.

Если вам не тяжело, напишите код самого этого движения квадрата по этим пяти точка.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 10.04.2009, 00:16   #9
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Код:
type TVector = array[0..3] of single;
var Pos,NextPoint: TVector;array[0..3] of single;
Points: array[0..4] of TVector;

procedure TForm1.Timer1Timer(Sender: TObject);//период таймера где-то 100мс
begin

if Distance(CubePos, NextPoint) < EPSILON then begin
Inc(i);
 NextPoint:=Points[i];
end;
Pos:=VectorAdd(Pos,VectorScale(VectorSubtract(Norm(NextPoint,Pos)),Koeff));//Koeff ~ 0.1 - коеффициент для нужной длины вектора
Paint();
end;

procedure TForm1.Paint();
var
 ps:TPaintStruct;
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity( ); 
if width <= height then
  glOrtho (-2, 2, -2*height/width, 2*height/width, -10.0, 10.0)
 else
  glOrtho (-2*width/height, 2*width/height, -2, 2, -10.0, 10.0);
glViewport(0, 0, width, height);

  BeginPaint(Handle,ps);

  glEnable(GL_DEPTH_TEST);

 glClearColor(1,0.5,0.5,1);
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glColor3f (0.0, 1.0, 0.0);

 glTranslatef(Pos[0],Pos[1],0);

 glBegin(GL_QUAD_STRIP);
  glVertex3f(0.3,0.3,0.3);
  glVertex3f(0.3,-0.3,0.3);
  glVertex3f(-0.3,0.3,0);
  glVertex3f(-0.3,-0.3,0);
 glEnd;
 glDisable(GL_DEPTH_TEST);

 glFlush();
 swapBuffers(dc);
 EndPaint(Handle,ps);
end;
Вроде бы так должно работать.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 10.04.2009, 01:01   #10
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Чето Делфи ругается на обработчик события таймера, мол не знает он что такое Distance, EPSILON, VectorAdd, VectorSubtract.

В чем может быть проблема?

З.Ы. Модуль OpenGL в Uses подключен.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Движение объекта на форме по щелчку мыши Dux Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 08.12.2008 06:35
Движение объекта по синусоиде? Roberto Помощь студентам 10 14.05.2008 17:00
Движение объекта по кругу Roberto Помощь студентам 2 06.05.2008 15:44
Движение объекта к точке frai Общие вопросы Delphi 3 10.01.2008 00:42