Пользователь
Регистрация: 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.
есть мысли где ошибка\как её исправить?
|