Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.04.2008, 06:05
Ramon Ramon вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 8
Репутация: 10
По умолчанию Загрузка объекта из dxf-файла

Есть тектовый файл dxf (например экспортированный из 3dmax'a). В разделе ENTITIES перечислен список вершин, вот пример одной из них (блока):

Код:
VERTEX
8
П-ПИПЕД01
10
-5.294490
20
6.821329
30
11.765603
70
192
0

(Под 10кой - координата Х, под 20 - Y, под 30 - Z, соответственно) Вершины читаются из файла и загоняются в список.

Мне нужно построить и воспроизвести в своей программе объект, хранящийся этом файле.
Например, если объект представляет собой кубик, то там будет 8 значащих вершин. Для того чтобы этот кубить отобразить нужно построить, соответственно 6 граней.

И вот тут я затупил...

Как его строить? В виде GL_QUADS или GL_QUAD_STRIP? Думаю что, по логике вещей, второй подход будет более правильным. Но я не пойму по какому принципу там перебираются вершины? В результате - то вылетаю за пределы массива вершин и ошибка, то на экране полный ..асясяй , но уж точно не кубик. Если строить с помощью GL_QUADS - то тоже не понятно, как из 8 вершин составить 6 комбинаций для соединения..?
Вообщем, надеюсь проблема ясна. Я искал примеры подобных алгоритмов, но ничего путного не нашел....

Заранее огромное спасибо за помощь!

Последний раз редактировалось Ramon, 08.04.2008 в 06:07.
Ответить с цитированием
  #2  
Старый 08.04.2008, 06:15
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Попробуй построить в 3dmax куб с известными тебе координатами, потом сравниш.
Дл построения куба или чегото более сложного я использовал gl_triangles
И не забудь про textcoord для правильного наложения тени.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 08.04.2008, 09:53
Ramon Ramon вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 8
Репутация: 10
По умолчанию

Спасибо за ответ.. только..
ЭЭм... Про куб с известными координатами - честно, не понял к чему ты это..)) Поясни...

gl_triangles - это да.. Но это немого отдельная тема..
Ответить с цитированием
  #4  
Старый 08.04.2008, 10:04
Ramon Ramon вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 8
Репутация: 10
По умолчанию

Просто для того чтобы строить объект в виде gl_triangels, исходный dxf-файл должен иметь немного другую структуру. Там должно быть общее количество вершин кратно трем (если я правильно понимаю ситуацию). В моем же файле количество вершин кратно четырем. Использовать построение связанными треугольниками не получицца...
Ответить с цитированием
  #5  
Старый 08.04.2008, 10:07
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Я имел в виду в 3д максе строиш куб (или чтото с несколькими гранями)к примеру х1=1 х2=2 х3=3 у1=4 у2=5 у3=6 (к примеру), открыв файл увидиш значения, они то тебе и нужны.
Может я плохо объясняю, скажу проще: параллелипипед ширина=5 длина=10 глубина=15 начальные координаты x=2 y=4 z=6
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 08.04.2008, 10:22
Ramon Ramon вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 8
Репутация: 10
По умолчанию

Если кто знает как в 3Dmax'e разбить объект на треугольники, чтобы он в dxf экспортировался через "3DFACE", а не "VERTEX", То это тоже альтернативный вариант решения проблемы, в принципе... У меня MAX 3 и 9)) Но всетки с кодом было бы предпочтительней, т.к. рано или поздно все-равно в это упрусь...
Ответить с цитированием
  #7  
Старый 08.04.2008, 14:06
Ramon Ramon вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Я имел в виду в 3д максе строиш куб (или чтото с несколькими гранями)к примеру х1=1 х2=2 х3=3 у1=4 у2=5 у3=6 (к примеру), открыв файл увидиш значения, они то тебе и нужны.
Может я плохо объясняю, скажу проще: параллелипипед ширина=5 длина=10 глубина=15 начальные координаты x=2 y=4 z=6

Координаты мне интак извсетны - они ж в dxf файле (так что о 3д максе забудим). Я не знаю как их использовать чтобы квадратиками построить объект. в каком порядке их соединять, так сказать..?... Как определить динамически эту последовательность..?
p.s. Я наверно тоже может как-то коряво спрашиваю.. И непонятно становицца что мне нужно..
Ответить с цитированием
  #8  
Старый 08.04.2008, 15:34
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Извини, неправильно понял.
Когда я изучал построение в трехмерном пространстве, нашел метод построения OBJ файлов.
Может когданибудь пригодится.
Вот ссылка: http://narod.ru/disk/65986000/ShaderLoader.pas
Кстати о квадратах и кубиках
Код:
rocedure TObjectConstructor.Quadrangle(x1,y1,z1,
                            x2,y2,z2,
                            x3,y3,z3,
                            x4,y4,z4:Single);
begin
  glTexCoord2f(0,0);
  glVertex3f(x1,y1,z1);
  glTexCoord2f(0,1);
  glVertex3f(x2,y2,z2);
  glTexCoord2f(1,0);
  glVertex3f(x3,y3,z3);
  glTexCoord2f(1,1);
  glVertex3f(x4,y4,z4);
end;

procedure TObjectConstructor.DrawBox(x,y,z,xWidth,yWidth,zWidth:Single);
begin 
  glBegin(GL_QUADS);
    glNormal3f(-1,0,0);
    Quadrangle(x,y,z+zWidth,x,y+yWidth,z+zWidth,x,y+yWidth,z,x,y,z);
    glNormal3f(1,0,0);
    Quadrangle(x+xWidth,y,z+zWidth,x+xWidth,y+yWidth,z+zWidth,
               x+xWidth,y+yWidth,z,x+xWidth,y,z);
    glNormal3f(0,0,-1);
    Quadrangle(x,y,z,x,y+yWidth,z,x+xWidth,y+yWidth,z,x+xWidth,y,z);
    glNormal3f(0,0,1);
    Quadrangle(x,y,z+zWidth,x,y+yWidth,z+zWidth,x+xWidth,y+yWidth,
               z+zWidth,x+xWidth,y,z+zWidth);
    glNormal3f(0,-1,0);
    Quadrangle(x,y,z,x,y,z+zWidth,x+xWidth,y,z+zWidth,x+xWidth,y,z);
    glNormal3f(0,1,0);
    Quadrangle(x,y+yWidth,z,x,y+yWidth,z+zWidth,x+xWidth,y+yWidth,
               z+zWidth,x+xWidth,y+yWidth,z);
  glEnd;
end;
procedure TObjectConstructor.DrawGrids(GridAmp:integer;a,b,c:Boolean);
var
  i:Integer;
begin
  if a then
  begin
    for i:=-GridAmp to GridAmp do
    begin
      if i<>0 then
        glColor3f(0.7,0.7,0.7)
      else
        glColor3f(1,0,0);
      glBegin(GL_LINES);
      glVertex3f(-GridAmp,i,0);
      glVertex3f(GridAmp,i,0);
      glEnd;
      if i<>0 then
        glColor3f(0.7,0.7,0.7)
      else
        glColor3f(0,1,0);
      glBegin(GL_LINES);
      glVertex3f(i,-GridAmp,0);
      glVertex3f(i,GridAmp,0);
      glEnd;
    end;
  end;

  if b then
  begin
    for i:=-GridAmp to GridAmp do
    begin
      if i<>0 then
        glColor3f(0.7,0.7,0.7)
      else
        glColor3f(0,1,0);
      glBegin(GL_LINES);
      glVertex3f(0,-GridAmp,i);
      glVertex3f(0,GridAmp,i);
      glEnd;
      if i<>0 then
        glColor3f(0.7,0.7,0.7)
      else
        glColor3f(0,0,1);
      glBegin(GL_LINES);
      glVertex3f(0,i,-GridAmp);
      glVertex3f(0,i,GridAmp);
      glEnd;
    end;
  end;

  if c then
  begin
    glBegin(GL_LINES);
    for i:=-GridAmp to GridAmp do
    begin
      if i<>0 then
        glColor3f(0.7,0.7,0.7)
      else
        glColor3f(1,0,0);
      glBegin(GL_LINES);
      glVertex3f(-GridAmp,0,i);
      glVertex3f(GridAmp,0,i);
      glEnd;
      if i<>0 then
        glColor3f(0.7,0.7,0.7)
      else
        glColor3f(0,0,1);
      glBegin(GL_LINES);
      glVertex3f(i,0,-GridAmp);
      glVertex3f(i,0,GridAmp);
      glEnd;
    end;
  end;
end;

procedure TObjectConstructor.DrawAxis(GridAmp:integer;a,b,c:Boolean);
begin
  if a then
  begin
    glColor3f(1,0,0);
    glBegin(GL_LINES);
      glVertex3f(-GridAmp,0,0);
      glVertex3f(GridAmp,0,0);
    glEnd;
  end;

  if b then
  begin
    glColor3f(0,1,0);
    glBegin(GL_LINES);
      glVertex3f(0,-GridAmp,0);
      glVertex3f(0,GridAmp,0);
    glEnd;
  end;

  if c then
  begin
    glColor3f(0,0,1);
    glBegin(GL_LINES);
      glVertex3f(0,0,-GridAmp);
      glVertex3f(0,0,GridAmp);
    glEnd;
  end;
end;
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 08.04.2008 в 15:45.
Ответить с цитированием
  #9  
Старый 09.04.2008, 14:12
Ramon Ramon вне форума
Прохожий
 
Регистрация: 29.03.2008
Сообщения: 8
Репутация: 10
По умолчанию

Значит так... Разобрался я во всем...
Вообщем в дхф-файле классическом (старых версий) помимо вершин приводится и их комбинация (по 3 шт). Т.е. строится все через GL_TRIANGELS без излишних вопросов.
Секция разбиения вершин по фэйсам отдельно не обозначается, но ее можно узнать по тому что группы "10", "20", "30" имеют значение 0:
Код:
VERTEX
8
П-ПИПЕД01
10
0
20
0
30
0
70
128
71
5
72
6
73
-8
0
А номера вервшин соответствуют группам 71, 72 и 73. Почему правда последняя отрицательная я так и не допетрил, но это не проблема вообще. Главное |модуль| верный. Т.е. иными словами если изначально читать файл и последовательно загонять вершины в массив, то в приведенном куске файла описывается треугольники с вершинами в точках c номерами в массиве 4, 5 и 8 (нумерация массивов с нуля - так что единицу отнимаем от данных, считанных из файла).

Создаем отдельный массив под вершины, отдельный под фэйсы, считываем все туда, рисуем стандартным способом и идем пить висски со льдом.

А вообще dxf-формат, ИМХО, отстой. и для этих целей мало годицца. Убил на него часов 7 пока разобрался что к чему... Да и размер, да и возможности предоставляемые им...
Есть другой более крутой выход из моей ситуация и почитать о нем можно здесь - http://www.delphikingdom.com/asp/vie...?catalogid=363 .

2 M.A.D.M.A.N. - То что ты написал, скачал но еще не смотрел. Однако спасибо, что хоть чем-то пытался помочь!!)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:22.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter