Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > OpenGL программка


Автор: welt 27.3.2008, 00:17
Возникала такая проблема. 
Экспортировал .STL файл в код на с++. В коде по точкам построен объект на OpenGL.
Перевел код в делфи.
Вставил в проект. Вот что вышло. 
Привожу код экспортикованного в файл обекта и далее куда я его вставил.

Код


procedure gra_function;
label m0,m1,start;

var
  quadObj: GLUquadricObj;

const
  data1: array [0..3] of double =
  (+1.000000000e+000,+1.000000000e+000,+1.000000000e+000,+1.000000000e+000);
  data2: array [0..3] of double =
  (+1.000000000e+000,+1.000000000e+000,+1.000000000e+000,+1.000000000e+000);
  data3: array [0..3] of double =
  (+1.000000000e+000,+1.000000000e+000,+1.000000000e+000,+1.000000000e+000);

begin
quadObj := gluNewQuadric;
goto start;
m0:
    glNewList(1, GL_COMPILE);
    glScalef(+1.772968844e-002, +1.772968844e-002, +1.772968844e-002);
    glTranslatef(-1.119659424e+000, -7.942279816e+000, -3.500000000e+001);
    glBegin(GL_TRIANGLES);
    glNormal3f(-4.200000000e+003, -9.100000000e+003, -7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(-8.400000000e+003, +4.550000000e+003, -3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(+4.200000000e+003, +9.100000000e+003, -7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(+4.200000000e+003, +9.100000000e+003, -7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(+8.400000000e+003, -4.550000000e+003, -3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(-4.200000000e+003, -9.100000000e+003, -7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(-8.400000000e+003, -4.550000000e+003, +7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(+4.200000000e+003, -9.100000000e+003, +3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(+8.400000000e+003, +4.550000000e+003, +7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(+8.400000000e+003, +4.550000000e+003, +7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(-4.200000000e+003, +9.100000000e+003, +3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(-8.400000000e+003, -4.550000000e+003, +7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(-4.200000000e+003, -9.100000000e+003, -7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(+8.400000000e+003, -4.550000000e+003, -3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(+4.200000000e+003, -9.100000000e+003, +3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(+4.200000000e+003, -9.100000000e+003, +3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(-8.400000000e+003, -4.550000000e+003, +7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(-4.200000000e+003, -9.100000000e+003, -7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(+8.400000000e+003, -4.550000000e+003, -3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(+4.200000000e+003, +9.100000000e+003, -7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(+8.400000000e+003, +4.550000000e+003, +7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(+8.400000000e+003, +4.550000000e+003, +7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(+4.200000000e+003, -9.100000000e+003, +3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(+8.400000000e+003, -4.550000000e+003, -3.900000000e+003);
    glVertex3f(+3.361965942e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(+4.200000000e+003, +9.100000000e+003, -7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(-8.400000000e+003, +4.550000000e+003, -3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(-4.200000000e+003, +9.100000000e+003, +3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(-4.200000000e+003, +9.100000000e+003, +3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(+8.400000000e+003, +4.550000000e+003, +7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(+4.200000000e+003, +9.100000000e+003, -7.800000000e+003);
    glVertex3f(+3.361965942e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(-8.400000000e+003, +4.550000000e+003, -3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +0.000000000e+000);
    glNormal3f(-4.200000000e+003, -9.100000000e+003, -7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +0.000000000e+000);
    glNormal3f(-8.400000000e+003, -4.550000000e+003, +7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(-8.400000000e+003, -4.550000000e+003, +7.800000000e+003);
    glVertex3f(-3.138034058e+001, -2.205772018e+001, +7.000000000e+001);
    glNormal3f(-4.200000000e+003, +9.100000000e+003, +3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +7.000000000e+001);
    glNormal3f(-8.400000000e+003, +4.550000000e+003, -3.900000000e+003);
    glVertex3f(-3.138034058e+001, +3.794227982e+001, +0.000000000e+000);
    glEnd();
    glEndList();
    nextStart:=1;
m1:
    glClear(GL_COLOR_BUFFER_BIT);
    glClear(GL_DEPTH_BUFFER_BIT);
    glEnable(GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST);
//    float data[] = {+1.000000000e+000f,+1.000000000e+000f,+1.000000000e+000f,+1.000000000e+000f};
        glLightfv(GL_LIGHT1, GL_AMBIENT, @data1);

//    float data[] = {+1.000000000e+000f,+1.000000000e+000f,+1.000000000e+000f,+1.000000000e+000f};
        glLightfv(GL_LIGHT1, GL_DIFFUSE, @data2);

//    float data[] = {+1.000000000e+000f,+1.000000000e+000f,+1.000000000e+000f,+1.000000000e+000f};
        glLightfv(GL_LIGHT1, GL_SPECULAR, @data3);

    glEnable(GL_LIGHT1);
    glEnable(GL_LIGHTING);
    glPushMatrix();
    glCallList(1);
    glPopMatrix();

start:
    case nextStart of
     0: goto m0;
     1: goto m1;
  end;
end;


На форму кинул кнопку, вот обработчик кнопки 

Код

....
hrc: HGLRC;
dc : HDC;
....

procedure TForm1.Button1Click(Sender: TObject);
var
 ps : TPaintStruct;
begin
 BeginPaint (Panel1.Handle, ps);
 wglMakeCurrent(dc, hrc);
 glViewPort (0, 0, Panel1.ClientWidth, Panel1.ClientHeight);
 glClearColor (0.75, 0.75, 0.5, 1.0);
 glClear (GL_COLOR_BUFFER_BIT);

 glBegin (GL_QUADS);
   gra_function;
 glEnd;

 SwapBuffers(Panel1.Handle);
 wglMakeCurrent(0, 0);
 EndPaint (Panel1.Handle, ps);
end;


Также есть инициализация

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
 dc := GetDC (Panel1.Handle);
 SetDCPixelFormat(dc);
 hrc := wglCreateContext(dc);
end;
 

После компиляции компбютер зависает так, что сделать ничего нельзя, даже сдвинуть мышь.
Буду рад. если кто подскажет, как откомпилировать нормально

Автор: Graf_h 27.3.2008, 10:32
Если честно, то сразу трудно сказать в чем проблема! Я бы на твоем месте пошагово компилировал бы прогу и нашел в каком именно месте зависает! smile 

Автор: Alexeis 27.3.2008, 11:29
welt, просто ужас тихий. Какие GoTo в мирное время? Цикл получился сильно разветвленным и труднопредсказуемым, это раз.
Второе  SwapBuffers это та функция, которая сбросит картинку в видеопамять. Она должна вызываться после окончания формирования каждого кадра. И три, чтобы программа реагировала на действия пользователя нужно обрабатывать очередь сообщений smile , а тут в бесконечном цикле ни разу не передается управление в основной цикл обработки сообщений, попросту говоря не вызывается applicatin.processmessges;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)