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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2015, 16:43   #1
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию OpenGL ошибка

занимаюсь моделированием движения объектов по действием гравитации. нашёл простенький 3d openGL движок. за основу взял туториал. вот он
Код:
program ex_demo;
//////////////////////////////
// Демонстрация работы движка
//////////////////////////////
uses
  Windows, OpenGL, eXgine in '..\eXgine.pas';
  
// для компиляции всего приложения в один exe (не использовать eXgine.dll)
// объявите EX_STATIC в cfg.pas

var
  obj   : GLUquadricObj;
  Angle : Single;

procedure Init;
begin
// Инициализация ресурсов
  obj := gluNewQuadric;
  gluQuadricNormals(obj, GL_FLAT);
  glEnable(GL_CULL_FACE);
  ogl.Light.Enable(0);
// Установка полноэкранного режима
  wnd.Mode(True, 1024, 768, 32, 85);
end;

procedure Free;
begin
  gluDeleteQuadric(obj);
end;

procedure Update;
begin
// Изменение угла поворота
  Angle := Angle + 0.01;
// Выход по нажатии Escape (код клавиши 27)
  if inp.Down(27) then eX.Quit;
end;

procedure Render;
var
  i : Integer;
begin
  ogl.Clear(True, True);
  ogl.Set3D(45, 0.1, 512);
// Отрисовка
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);

  ogl.Blend(BT_ADD);
  glTranslatef(0, 0, -16);
  glRotatef(Angle * rad2deg, sin(Angle), cos(Angle), sin(Angle));
  for i := 0 to 4 do
  begin
    glColor3f(sin(Angle), i/16, cos(Angle));
    gluSphere(obj, 1 + i, 4, 2);
  end;

// Вывод статистики
  ogl.Set2D(0, 0, wnd.Width, wnd.Height);
  glColor3f(1, 0, 0);
  ogl.TextOut(0, 8, 16, PChar('FPS: ' + IntToStr(ogl.FPS)));
end;

begin
  wnd.Create(PChar(eX.Version + ' demo'), False);
  eX.SetProc(PROC_UPDATE, @Update);
  eX.SetProc(PROC_RENDER, @Render);
  eX.SetProc(PROC_INIT, @Init);
  eX.SetProc(PROC_FREE, @Free);
// Вход в главный цикл
  eX.MainLoop(50);
end.
вот мой переделанный код:
Код:
program ex_demo;
//////////////////////////////

//////////////////////////////
uses
  Windows, OpenGL, eXgine in '..\eXgine.pas';


const NUM_OF_PARTICLES=2;

  type
  Tparticle=class
  Fx,Fy,Fz,x,y,z,x0,y0,z0,vx,vy,vz,v0x,v0y,voz:real;
  R:array[1..NUM_OF_PARTICLES] of real;
  obj3d:GLUquadricObj;
  end;
var
  obj,obj2   : GLUquadricObj;
  p_arr:array[1..NUM_OF_PARTICLES] of Tparticle; 
  Angle : Single;
  dF:real;
  test:integer;
//////////////////////////////////////////////////////
procedure draw_obj(i:integer;x,y,z:double);
begin
  glPushMatrix();
  glTranslated(x,y,z);
  gluSphere(p_arr[i].obj3d,  1, 10, 10);
  glPopMatrix();
end;
//////////////////////////////////////////////////////

//////////////////////////////////////////////////////
procedure Init;
var i:integer;

begin



obj:=gluNewQuadric;
for i:=1 to NUM_OF_PARTICLES do begin

     p_arr[i].obj3d := gluNewQuadric;
     gluQuadricNormals(p_arr[i].obj3d, GL_FLAT);
     end;


  glEnable(GL_CULL_FACE);
  ogl.Light.Enable(0);

  wnd.Mode(True, 1024, 768, 32, 85);
end;

procedure Free;
begin
  gluDeleteQuadric(p_arr[1].obj3d);
end;

procedure Update;
begin

//  Angle := Angle + 0.01;

  if inp.Down(27) then eX.Quit;
  if inp.LastKey=65 then angle:=angle+0.1;
  if inp.LastKey=68 then angle:=angle-0.1;
end;

procedure Render;
var
  i : Integer;
begin glLoadIdentity ();
  ogl.Clear(True, True);
  ogl.Set3D(45, 0.1, 512);

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);

  ogl.Blend(BT_ADD);
  glTranslatef(0, 0, -16);

    glColor3f(sin(Angle), 1/16, cos(Angle));
 for i:=1 to NUM_OF_PARTICLES do begin
    draw_obj(i,p_arr[i].x,p_arr[i].y,p_arr[i].z);
    end;
    gluSphere(p_arr[1].obj3d,  1, 10, 10);

  glTranslated(-2,0,0);
  gluSphere(p_arr[2].obj3d,  1, 10, 10);
    glTranslated(-2,0,0);
  gluSphere(p_arr[2].obj3d,  1, 10, 10);


  ogl.Set2D(0, 0, wnd.Width, wnd.Height);
  glColor3f(1, 0, 0);

  ogl.TextOut(0, 8, 16, PChar('FPS: ' + IntToStr(ogl.FPS)));
end;

begin
  wnd.Create(PChar(eX.Version + ' demo'), False);
  eX.SetProc(PROC_UPDATE, @Update);
  eX.SetProc(PROC_RENDER, @Render);
  eX.SetProc(PROC_INIT, @Init);
  eX.SetProc(PROC_FREE, @Free);

  eX.MainLoop(50);
end.
как видно я в коде ничего принципиально не поменял, только реорганизовал переменные(переменную obj типа GLUquadricObj запихнул в класс Tparticle ). до какого-то момента всё работало-рисовалось.
после очередного апгрейда кода стала вылетать рантайм ошибка "Project ex_demo.exe raised exception class Tobject with message ''. Process stopped. Use Step or Run to continue" на строчке p_arr[i].obj3d := gluNewQuadric; процедуры init. откат изменений (Ctrl+Z) ничего не изменил. как я понимаю ошибка кроется в массиве, потому как 2мя строчками ранее gluNewQuadric(это ф-я в dllке движка) успешно применяется на переменной obj.
есть мысли где ошибка\как её исправить?
varich вне форума Ответить с цитированием
Старый 27.08.2015, 19:28   #2
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию

ахаха проблема решена. сток просмотров и никто носом не ткнул я ж не создал объекты класса Tparticle
Код:
p_arr[i]:=tparticle.Create;
varich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[OpenGL] Ошибка в auxInitWindow KrL^^ Помощь студентам 4 02.09.2015 11:54
OpenGl ошибка в наложение текстуры sidvishes Помощь студентам 1 20.05.2014 23:55
Qt+OpenGL. Qt "не видит" функции OpenGL EnterFix Qt и кроссплатформенное программирование С/С++ 4 29.01.2013 18:59
Visual C++ 2005 и OpenGL постоянная ошибка! pufystyj Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 06.07.2011 16:29
Использование OpenGL. Ошибка. IgorKr Общие вопросы Delphi 2 11.04.2008 23:11