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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2016, 11:27   #1
basjaka
 
Аватар для basjaka
 
Регистрация: 07.12.2010
Сообщений: 8
По умолчанию Не отображается модель (Delphi + OpenGL)

Всем доброго времени суток!
Решил написать небольшой модуль для загрузки и отрисовки моделей в формате obj. Код писал согласно документации к формату.
Но при запуске приложения модель не видна. Что не так- не могу понять.
Файл модуля и модель прикрепил к теме в архиве.
Прошу помощи у знающих людей!
Вложения
Тип файла: rar lobj.rar (289.4 Кб, 18 просмотров)
basjaka вне форума Ответить с цитированием
Старый 04.08.2016, 10:07   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Без кода проекта и кода корректных вызовов Ваших самописных подпрограмм, очень сложно просто даже запустить, чтобы увидеть в чём проблема. Взял opengl_min проект из книги Краснова для пробы, вставил вызов LoadModel в начало программы и RenderModel в главный цикл, при запуске программы не вижу ничего, но и не знаю загрузилось ли чего вообще. В отладку не хочется лезть, лучше Вы скиньте тестовый проект в архиве, а не только модуль.
phomm вне форума Ответить с цитированием
Старый 07.08.2016, 17:19   #3
basjaka
 
Аватар для basjaka
 
Регистрация: 07.12.2010
Сообщений: 8
По умолчанию

Это мой первый опыт работы с трехмерной графикой. Так, что мой проект почти ничем не отличается от минимального приложения.
Намекните, хоть в какую сторону рыть то))
Вложения
Тип файла: rar GLProject.rar (89.4 Кб, 8 просмотров)
basjaka вне форума Ответить с цитированием
Старый 07.08.2016, 23:27   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

basjaka
Рыть в сторону нормального видео учебника/туторила.

В функции SetDCPixelFormat мы должны сообщить о том что будем использовать OpenGl делается это следующим образом надо выставить флаг PFD_SUPPORT_OPENGL. Если не указать то ChoosePixelFormat вернёт неправильное значение и ничего далее работать не будет.
PFD_DRAW_TO_WINDOW тоже надо указать иначе может включиться программный рендер, а не аппаратный.

Код:
procedure SetDCPixelFormat (hdc: hDC);
var
  pfd: TPixelFormatDescriptor;
  nPixelFormat: Integer;
begin
  FillChar (pfd, SizeOf(pfd), 0);
  pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  nPixelFormat := ChoosePixelFormat (hdc, @pfd);
  SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
Отрисовка модели. Очевидно раз мы написали Begin то должны написать End.
Выносим из цикла, в цикле рисуется сразу несколько треугольников подряд.
Каждые 3 вызова glVertex создают новый треугольник. Модель должна быть изначально разбита на треугольники, а непросто на многоугольники.

Код:
procedure RenderModel; // отрисовка модели
var
  i : Integer;
begin
  glBegin(GL_TRIANGLES);
  For i := 0 to length(vindex) - 1 do
   begin
    glNormal3fv(@Normal[nindex[i]]);
    glVertex3fv(@Vertex[vindex[i]]);
   end;
  glEnd;

end;
В ходе тестирования пришлось отладить программу устранил ряд ошибок и опечаток.
Код:
function GetCoords(s : String) : TCoord; // парсер координат вершин и нормалей
var
v:tcoord;
sx,sy,sz: string;
begin
  delete(s,1,pos(' ',s));      // [Была ошибка лишнее удаляли, да там в описании толи неверно толи плохо описано ]
  s := StringReplace(s, '.', DecimalSeparator, [rfReplaceAll]);

  sx:=Copy(s,1,pos(' ',s)-1);
      delete(s,1,length(sx)+1);  // [Была ошибка, заменил '-' на '+']
  sy:=Copy(s,1,pos(' ',s)-1);
      delete(s,1,length(sy)+1);  // [Была ошибка, заменил '-' на '+']
  sz:=Copy(s,1, length(s));      // [Была ошибка, заменил 'sy' на 's']


v.x:=strtofloat(sx);
v.y:=strtofloat(sy);
v.z:=strtofloat(sz);

result:=v;
end;
Далее берём Blender грузим вашу модель. Затем смотрим где она располагается и подбираем параметры камеры, так чтобы автомат попадал в поле зрения камеры.
Затем я переписал эти параметры в код на Delphi.
Код:
procedure LoadCam;
begin
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(-30, 30, -30, 30, 0.1, 100); // Ортогональная проекция, как при черчении в школе.
  glTranslatef(0.0, 0.0, 0.0); // В данном случае перенос не требуется и так камера попадет можно отодвинуть по z 
  glMatrixMode(GL_MODELVIEW);
end;
Чтобы результат больше походило на тот что в Blender'е добавил.
Код:
procedure TForm1.FormResize(Sender: TObject);
begin
  glViewport( 0, 0, ClientWidth, ClientHeight);
end;
Для учебных примеров предпочитаю использовать таймер, который вызывает основной цикл.
Код:
procedure TForm1.MainLoop;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity; 
  // Тут можно по вращать объект чтобы его было лучше видно.
  glColor3f (1, 0.6, 0.6);
  rendermodel;
  SwapBuffers(DC);
end;
В более серьезных проектах там цикл сложнее делается.

Тут надо бы рассказать про матрицы и работы с камерой. Но мне лень

Есть разные способы и режимы работы с камерой.
Можно выделить 3 абстракции.
1) Корабль стоит на месте а двигатель двигает вселенную.
2) Вселенная стоит на месте двигатель двигатель корабль.
3) Двигатель двигает камеру.
В зависимости от выбранной абстракции используются разные операции, разные функции. Ну как разные? Названия одни, а то что они делают отличается, в зависимости от выбранной абстракции.
Вложения
Тип файла: zip GLProject1.zip (301.9 Кб, 13 просмотров)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 07.08.2016 в 23:29.
Pavia вне форума Ответить с цитированием
Старый 03.11.2016, 15:06   #5
basjaka
 
Аватар для basjaka
 
Регистрация: 07.12.2010
Сообщений: 8
По умолчанию

Спасибо огромное)
А посоветуйте "нормальную литературу"...
Читал Краснова Михаила, но на его книги масса нареканий в сети.
basjaka вне форума Ответить с цитированием
Старый 03.11.2016, 19:05   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Советую изучить этот цикл статей:
http://esate.ru/uroki/OpenGL/uroki-OpenGL-c-sharp/
Жалко, что не дельфи. Но рассмотрено много важных моментов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Opengl C++ модель солнечной системы Shade2015 Помощь студентам 3 08.05.2015 21:09
Не удаётся сгладить модель/Не работает GL_SMOOTH (OpenGL) saggy Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 03.05.2014 23:20
3D модель системного блока в OpenGL Chester751 Общие вопросы C/C++ 0 17.04.2014 22:32
сделать программу на C++, которая переводит цветовую модель RGB в модель HSV Kabahol Помощь студентам 5 14.03.2014 19:05
OpenGL - анимированная модель (.*gms) Vova777 Мультимедиа в Delphi 0 05.08.2011 20:28