|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Загрузка объекта из 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
|
||||
|
||||
Попробуй построить в 3dmax куб с известными тебе координатами, потом сравниш.
Дл построения куба или чегото более сложного я использовал gl_triangles И не забудь про textcoord для правильного наложения тени. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
Спасибо за ответ.. только..
ЭЭм... Про куб с известными координатами - честно, не понял к чему ты это..)) Поясни... gl_triangles - это да.. Но это немого отдельная тема.. |
#4
|
|||
|
|||
Просто для того чтобы строить объект в виде gl_triangels, исходный dxf-файл должен иметь немного другую структуру. Там должно быть общее количество вершин кратно трем (если я правильно понимаю ситуацию). В моем же файле количество вершин кратно четырем. Использовать построение связанными треугольниками не получицца...
|
#5
|
||||
|
||||
Я имел в виду в 3д максе строиш куб (или чтото с несколькими гранями)к примеру х1=1 х2=2 х3=3 у1=4 у2=5 у3=6 (к примеру), открыв файл увидиш значения, они то тебе и нужны.
Может я плохо объясняю, скажу проще: параллелипипед ширина=5 длина=10 глубина=15 начальные координаты x=2 y=4 z=6 — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#6
|
|||
|
|||
Если кто знает как в 3Dmax'e разбить объект на треугольники, чтобы он в dxf экспортировался через "3DFACE", а не "VERTEX", То это тоже альтернативный вариант решения проблемы, в принципе... У меня MAX 3 и 9)) Но всетки с кодом было бы предпочтительней, т.к. рано или поздно все-равно в это упрусь...
|
#7
|
|||
|
|||
Цитата:
Координаты мне интак извсетны - они ж в dxf файле (так что о 3д максе забудим). Я не знаю как их использовать чтобы квадратиками построить объект. в каком порядке их соединять, так сказать..?... Как определить динамически эту последовательность..? p.s. Я наверно тоже может как-то коряво спрашиваю.. И непонятно становицца что мне нужно.. |
#8
|
||||
|
||||
Извини, неправильно понял.
Когда я изучал построение в трехмерном пространстве, нашел метод построения 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
|
|||
|
|||
Значит так... Разобрался я во всем...
Вообщем в дхф-файле классическом (старых версий) помимо вершин приводится и их комбинация (по 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 Создаем отдельный массив под вершины, отдельный под фэйсы, считываем все туда, рисуем стандартным способом и идем пить висски со льдом. А вообще dxf-формат, ИМХО, отстой. и для этих целей мало годицца. Убил на него часов 7 пока разобрался что к чему... Да и размер, да и возможности предоставляемые им... Есть другой более крутой выход из моей ситуация и почитать о нем можно здесь - http://www.delphikingdom.com/asp/vie...?catalogid=363 . 2 M.A.D.M.A.N. - То что ты написал, скачал но еще не смотрел. Однако спасибо, что хоть чем-то пытался помочь!!) |