Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помощь с opengl (пример для OpenGL на Дельфи)  (Прочитано 5600 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Paul
Участник

ru
Offline Offline
Пол: Мужской

« : 20-12-2008 10:44 » 

Нужно нарисовать график с помощью opengl в Delphi.
График я нарисовал и даже поворачиваю его, теперь осталось сделать смещение по осям x и y. С чем у меня собственно и возникли трудности.
Вот процедура FormPaint:

Код:
<удалено>

Проблема в том, что когда я повернул на угол fi, то и оси повернулись на такой же угол, и соответственно при изменении x0,y0 график перемещается не по вертикали/горизотали, а по наколнной линии. Пробовал реализовать через матрицы. Чё-то не получилось.
« Последнее редактирование: 09-01-2009 09:03 от Алексей1153++ » Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 22-12-2008 01:53 » new

Paul, перед поворотом вызови glPushMatrix, а после glPopMatrix...
Или:
1) Повернул +f
2) Нарисовал
3) Повернул -f
4) Сдвинул
« Последнее редактирование: 22-12-2008 08:21 от sss » Записан

while (8==8)
Paul
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 08-01-2009 16:31 » 

Вот что получилось. Здесь функции для создания opengl окна на static'е, и отрисовка графика функции с сеткой.
Код:
procedure SetDCPixelFormat (hdc : HDC);

var

 pfd : TPixelFormatDescriptor;
 nPixelFormat : Integer;
 Begin
 With pfd do begin
  nSize := sizeof (TPixelFormatDescriptor);
  nVersion := 1;
  dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL;
  iPixelType := PFD_TYPE_RGBA;
  cColorBits := 16;
  cRedBits := 0;
  cRedShift := 0;
  cGreenBits := 0;
  cGreenShift := 0;
  cBlueBits := 0;
  cBlueShift := 0;
  cAlphaBits := 0;
  cAlphaShift := 0;
  cAccumBits := 0;
  cAccumRedBits := 0;
  cAccumGreenBits := 0;
  cAccumBlueBits := 0;
  cAccumAlphaBits := 0;
  cDepthBits := 32;
  cStencilBits := 0;
  cAuxBuffers := 0;
  iLayerType := PFD_MAIN_PLANE;
  bReserved := 0;
  dwLayerMask := 0;
  dwVisibleMask := 0;
  dwDamageMask := 0;
 end;
 PixelFormat := ChoosePixelFormat (hdc, @pfd);
 SetPixelFormat (hdc, nPixelFormat, @pfd);
End;

procedure TForm1.FormCreate(Sender: TObject);
var
  defstyle:dWord;
begin
  stat:=CreateWindowEx(WS_EX_CLIENTEDGE,'static','',WS_CHILD or WS_VISIBLE,232,
                       30,440,440,Form1.Handle,HMENU(0),hInstance,nil);
  dc:=GetDC(stat);
  SetDCPixelFormat(dc);
  hrc := wglCreateContext(dc);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  t:Gldouble;
begin
  t:=0;
  BeginPaint (stat, MyPaint);
  wglMakeCurrent (dc, hrc);
  glClearColor (0.85, 0.75, 0.5, 1.0);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor(1.0,0.0,0.0,0.0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glRenderMode(GL_SELECT);
  glLineWidth(1);
  gluOrtho2D(-1, 1, -1, 1);
  if is_grid=true then
  begin
    glLineWidth(1);
    glBegin (GL_LINES);
      glColor3d(0,0,1);
      glVertex2f(0,1);
      glVertex2f(0,-1);
      glVertex2f(1,0);
      glVertex2f(-1,0);
      glVertex2f(0.5,1);
      glVertex2f(0.5,-1);
      glVertex2f(-0.5,1);
      glVertex2f(-0.5,-1);
      glVertex2f(1,0.5);
      glVertex2f(-1,0.5);
      glVertex2f(1,-0.5);
      glVertex2f(-1,-0.5);
    glEnd();
  end;
  glTranslatef(x0/100,y0/100,0);
  glScalef(m, m, 0);
  glRotatef(fi, 0.0, 0.0, 1.0);
  glLineWidth(2);
  glBegin (GL_LINE_STRIP);
    glColor3d(1,0,0);
    while(t<2*pi) do
    begin
      glVertex2f(x(t),y(t));
      t:=t+2*pi/3000;
    end;
  glEnd();
  SwapBuffers(dc);
  wglMakeCurrent (dc, 0);
  EndPaint (stat, MyPaint);
end;
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines