PMG
http://forum.pmg.org.ru/

Загрузка 3Ds в OpenGL
http://forum.pmg.org.ru/viewtopic.php?f=1&t=175
Страница 1 из 2

Автор:  eNrix [ 06 дек 2005 11:53 ]
Заголовок сообщения:  Загрузка 3Ds в OpenGL

Вот недавно скачал с http://www.ultimategameprogramming.com/ пример с загрузкой этого формата 7 страница про OpenGL. Так вот когда я его откомпили выводиться ошибка(я скопировал для примера файлик .3ds в папку Debug). Когда я посмотрел то увидел, что одня из функции пытается выделить слишком много памяти. Поидеи количество вершин под которые нужно выделить память должно считываться с файла модели. Как устранить эту ошибку?

P.S. Хочу попросить скачать этот пример и у себя откомпилить и проверить на работоспособность.

Автор:  MagicWolf [ 06 дек 2005 15:49 ]
Заголовок сообщения: 

У меня тоже не работает.

Дело в том, что в формате 3ds нельзя заранее сказать сколько будет вершин, это определяется при загрузке. Один и способов решения этой проблемы это вначале пройтись по файлу и посмотреть сколько чего там есть, выделить память, а потом уже читать вершины, треугольники. Можно просто динамически формировать массив как в книге Premier Press - Focus On 3D Models.pdf.rar

Автор:  eNrix [ 06 дек 2005 16:15 ]
Заголовок сообщения: 

Ну а как решить это в примере на том сайте ? Просто меньше взять размер выделения памяти или дописать что бы оно еще пробежалось по вершинам. Прошу посмотреть пример о котором я выше писал.

Автор:  BAPBAP [ 07 дек 2005 14:02 ]
Заголовок сообщения: 

eNrix писал(а):
Ну а как решить это в примере на том сайте ? Просто меньше взять размер выделения памяти или дописать что бы оно еще пробежалось по вершинам. Прошу посмотреть пример о котором я выше писал.
Я тоже попробовал:
-в режиме DEBUG у меня всё загрузилось и всё прекрасно работает
-в режиме RELEASE ничего не загрузилось и прога подвисла ;/

Вопросик такой к eNrix: тебе нужно чтоб именно из файла .3ds загружался обьект или нет. Я например пользуюсь программой Deep Exploration, которая конвертирует ОЧЕНЬ много форматов в другие форматы и там есть возможность создать код C++ объекта для OpenGL . Т.е., программа, например, из файла .3ds сделает список отображения glNewList () со всеми текстурами, освещением и др. :/. Ты подключишь этот файл к своей проге и будешь использовать как хочешь :type:

Автор:  MagicWolf [ 07 дек 2005 16:13 ]
Заголовок сообщения: 

Лучше размещать вершины динамически как это сделано в Premier Press - Focus On 3D Models.pdf.rar

Автор:  ypp [ 09 дек 2005 15:06 ]
Заголовок сообщения: 

Я что-то не пойму суть вопроса. В 3ds-ках в начале каждого chunk-а есть хедер (специальный chunk), в котором есть размер. Из этого размера легко определить сколько вершин в этом chunk-е. Есть 2 способа прочитать:

1) "Некрасивый".

Код:
// ... здесь читаем размер и определяем количество вершин
Vertex *vlist = new Vertex[ vcount ];
// ... еще код ...
// В конце не забыть:
delete vlist;


2) Намного лучше.

Код:
// здесь читаем размер и определяем количество вершин
std::vector< Vertex > vlist;
Vertex v;
for (int i = 0; i < vcount; ++i ) {
    // Читаем очередную вершину в v
    vlist.push_back( v );
}
// И здесь ничего освобождать не нужно  =)


или так

Код:
// Здесь читаем размер и определяем количество вершин
std::vector< Vertex > vlist( vcount );
for (int i = 0; i < vcount; ++i ) {
    // Читаем очередную вершину в v[ i ]
}
// И здесь ничего освобождать не нужно  =)

Автор:  MagicWolf [ 12 дек 2005 17:25 ]
Заголовок сообщения: 

chunk может быть несколько.

Автор:  ypp [ 12 дек 2005 19:55 ]
Заголовок сообщения: 

MagicWolf писал(а):
chunk может быть несколько.


На сколько мне извесно, chunk-ов с вершинами есть только по 1 на каждый мэш. Потому написаное выше будеть работать при считывании каждого мэша в отдельный объект. Если есть желание "слить" все мэши в один, то std::vector здесь подходить не нуже, если использовать вариант 2.а)

Автор:  MagicWolf [ 14 дек 2005 15:34 ]
Заголовок сообщения: 

ypp писал(а):
На сколько мне извесно, chunk-ов с вершинами есть только по 1 на каждый мэш.


Это не очевидно, и может так и не быть, кроме этого количество мешей тоже не задается.

Код:
Before you worry about reading in this data, you need a place to store
it. That is where the S3dsMesh structure comes in. Each S3dsMesh structure
holds one triangular mesh. Because the file does not reveal how
many meshes there are total, you can call on the power of STL and
std::vector to create a place to store any number of meshes.


А вот про вершины:

Код:
The rest of the data is contained in sub-chunks of the 0x4100 chunk.
(Yes, you can have sub-chunks of sub-chunks!) Because you do not
know how many vertices, faces, or materials there will be, you may want
to use a std::vector. This is essentially a resizable array. Using
std::vectors, you can add as many objects to your array as you like
without allocating or resizing it. If you aren’t sure about how to use
std::vectors, I suggest you skip to Appendix B.


Во всяком случае я исходил из этого. Хотя я видел код, в котором считается что 0x4100 chunk один на меш. Но подумал, что это может быть в общем случае и не верно.

Для программиста вообще лучше перебдеть, чем не добдеть :joke: .

Автор:  ypp [ 14 дек 2005 17:09 ]
Заголовок сообщения: 

Да, я это читал. О том и говорю, что std::vector (и STL вобщем) - рулит. :rock:

З.Ы. В моем коде вообще вообще нет подобных предположений. Все прямолинейно и просто - встретил chunk, идентифицировал, вытянул из него данные и добавил куда нужно.

Автор:  KerLaede [ 27 мар 2006 11:19 ]
Заголовок сообщения: 

Если зашла тема про загрузку 3D моделей, то какой фомат более эффективен 3ds или ASE? Большая ли разница какой использовать?

Автор:  ypp [ 27 мар 2006 13:16 ]
Заголовок сообщения: 

А эффективность как считается - скорость загрузки, объем памяти или что-то еще?

Потенциально 3ds-ки можно загружать намного быстрее (т.к. формат бинарный, в отличии от текстового ASE), но это уже зависит от "прямости" рук программиста :D

Автор:  MagicWolf [ 30 мар 2006 08:54 ]
Заголовок сообщения: 

Мне кажется 3ds лучше - бинарник, места меньше жрет на диске.

Автор:  Weise [ 17 окт 2006 22:26 ]
Заголовок сообщения: 

Цитата:
Дело в том, что в формате 3ds нельзя заранее сказать сколько будет вершин, это определяется при загрузке. Один и способов решения этой проблемы это вначале пройтись по файлу и посмотреть сколько чего там есть, выделить память, а потом уже читать вершины, треугольники. Можно просто динамически формировать массив как в книге Premier Press - Focus On 3D Models.pdf.rar


Я очень часто вижу, что люди сначала пытаются все сделать на динамических массивах. Это правильно. Но когда суть проблемы заключается в том, что число объектов неизвестно, чтобы не читать файл целиком несколько раз или не проходить по нему несколько раз надо использовать динамческие списки (в вашем случае однонаправленного хватит). Но ели придется часто перескакивать более чем через 2 структуры, то немного падет производительность относительно массивов(поиск объектов).

Я часто своим ученикам говорю, что многомерные списки зачастую являются более легким решением сложных проблем (например, в интерпретаторах), и что их не надо бояться - они очень просты в понимании, вероятность ошибки уменьшается.

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/