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

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

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

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

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

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

Доброе время суток) В опенгл есть 3-х мерный куб, он прозрачный. Внутри куба обьект (например сфера). Надо реализовать возможность перемещения сферы внутри куба по таймеру, желательно, чтоб она отражалась от его внутренних граней) Каким боком повернуться к реализации? С опенГЛ столкнулся впервые...
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 28.01.2010, 19:51   #2
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

ничего сложного там нет, тоже самое что обычная 2х мерная графика. меняй координаты и все.
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 28.01.2010, 19:58   #3
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Вот код:


Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
  private
   hrc: HGLRC;
   DC: HDC;
   RX,RY,RZ:real;
   prim:GLUQuadricObj;
   procedure PixelFormat;
  public
   px:real;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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(Panel1.Handle);
 PixelFormat;
 hrc:=wglCreateContext(DC);
 wglMakeCurrent(DC, hrc);
 px:=0;
 RX:=0;
 RY:=0;
 RZ:=0;
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 prim:=gluNewQuadric();

 glNewList(1, GL_COMPILE);
  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;
 glEndList;

 glNewList(2, GL_COMPILE);
   gluQuadricDrawStyle(prim, GLU_LINE);
   glColor3f(1,0,0);
   gluSphere(prim, 0.1, 100, 10);
 glEndList;
 end;

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

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

  glPushMatrix;
  glscalef(3.0,3.0,1.0);

  glEnable(gl_Blend);

  BeginPaint(panel1.Handle, ps);
  glClearColor(0, 0, 0, 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);

  glEnable(GL_DEPTH_TEST);

   glTranslatef(px,0,0);
   glCallList(2);



  glPopMatrix;

  glPushMatrix;

  glCallList(1);

  glPopMatrix;
  glDisable(GL_DEPTH_TEST);
  glFlush();
  swapBuffers(DC);
  endPaint(panel1.Handle,ps);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = VK_RIGHT then
   RY:=RY+2;
  if key = VK_LEFT then
   RY:=RY-2;
  if key = VK_UP then
   RX:=RX+2;
  if key = VK_DOWN then
   RX:=RX-2;

   FormPaint(nil);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  px:=px+0.01;
  refresh;
end;

end.
Если кубу задать увеличение, то он становиться каким-то параллелипипедом, хотя при том же значении, когда внутри PushMatrix находились оба обьекта, все было в норме... Но тогда при движении двигались оба обьекта
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 28.01.2010, 21:16   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

причем тут GL к движению?
Open Graphic Library.
она отвечает за прорисовку.
а вот столкновения и движения проверяйте сами по координатам. как и в 2Д
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.01.2010, 21:22   #5
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

у тебя параметры задаются при создании формы. изменять их при прорисовки сложно.
задавай параметры объектам лучше в onpaint
и там уже меняй их для создания движения. ща некогда заниматься этим. завтра гляну, подскажу ченить, если хочешь, поковыряйся тут:
opengl3.zip
думаю разберешься...
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 29.01.2010, 08:36   #6
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Да, спасибо за пример, ничего сложного там действительно нет)) Вот с организацией движения... перемещение по координатам заданным в опенгл, я осуществлял с помощью glTranlatef по-моему.. а как организовать движение ВНЕ опен гл, по координатам, заданным в опенгл?)
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 29.01.2010, 08:44   #7
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

А то что я создаю обьекты при создании формы.. Я создаю их в отдельные листы, типа процедур, думаю в OnPaint ими управлять будет проще. Раньше создавал в OnPaint, разницы не почуствовал...
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 31.01.2010, 17:19   #8
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

Цитата:
а как организовать движение ВНЕ опен гл, по координатам, заданным в опенгл?)
это как так?)
придется разбивать любую область экрана по координатам opengl наверное, в принципе там так же и делается
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 31.01.2010, 21:10   #9
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение обьекта в OpenGL Delphi Krechet Помощь студентам 0 24.01.2010 14:22
Движение ДВУХ ОБЬЕКТОВ Wi1D Помощь студентам 4 15.05.2009 08:57
Движение объекта по точкам(OpenGl).Подскажите. spamer Общие вопросы Delphi 12 10.04.2009 17:06
Использование обьектов UberStas Помощь студентам 2 13.06.2008 18:55
Перетаскивание обьектов Witaliy Общие вопросы Delphi 6 27.04.2008 19:22