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

Delphi Sources



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

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

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
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
Кстати о квадратах и кубиках
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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, время: 09:12.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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