PMG

Форумы по созданию игр
Текущее время: 15 июл 2026 21:24

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Загрузка 3Ds в OpenGL
СообщениеДобавлено: 06 дек 2005 11:53 
Не в сети
Опытный
Аватара пользователя

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

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

_________________
С уважением, Владислав


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 06 дек 2005 15:49 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
У меня тоже не работает.

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

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 06 дек 2005 16:15 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 дек 2004 22:33
Сообщения: 112
Откуда: Ханты-Мансийск
Ну а как решить это в примере на том сайте ? Просто меньше взять размер выделения памяти или дописать что бы оно еще пробежалось по вершинам. Прошу посмотреть пример о котором я выше писал.

_________________
С уважением, Владислав


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 дек 2005 14:02 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 30 ноя 2005 13:07
Сообщения: 24
Откуда: Украина, Краматорск
eNrix писал(а):
Ну а как решить это в примере на том сайте ? Просто меньше взять размер выделения памяти или дописать что бы оно еще пробежалось по вершинам. Прошу посмотреть пример о котором я выше писал.
Я тоже попробовал:
-в режиме DEBUG у меня всё загрузилось и всё прекрасно работает
-в режиме RELEASE ничего не загрузилось и прога подвисла ;/

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

_________________
Ученье свет, а не ученье - чуть свет и на работу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 дек 2005 16:13 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Лучше размещать вершины динамически как это сделано в Premier Press - Focus On 3D Models.pdf.rar

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 09 дек 2005 15:06 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 13 ноя 2004 13:09
Сообщения: 113
Я что-то не пойму суть вопроса. В 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 ]
}
// И здесь ничего освобождать не нужно  =)

_________________
"I just don't give a f..." Eminem


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 дек 2005 17:25 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
chunk может быть несколько.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 дек 2005 19:55 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 13 ноя 2004 13:09
Сообщения: 113
MagicWolf писал(а):
chunk может быть несколько.


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

_________________
"I just don't give a f..." Eminem


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 14 дек 2005 15:34 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
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: .

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 14 дек 2005 17:09 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 13 ноя 2004 13:09
Сообщения: 113
Да, я это читал. О том и говорю, что std::vector (и STL вобщем) - рулит. :rock:

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

_________________
"I just don't give a f..." Eminem


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 мар 2006 11:19 
Не в сети
Любитель

Зарегистрирован: 12 янв 2006 11:05
Сообщения: 21
Если зашла тема про загрузку 3D моделей, то какой фомат более эффективен 3ds или ASE? Большая ли разница какой использовать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 мар 2006 13:16 
Не в сети
Опытный
Аватара пользователя

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

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

_________________
"I just don't give a f..." Eminem


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 мар 2006 08:54 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Мне кажется 3ds лучше - бинарник, места меньше жрет на диске.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 окт 2006 22:26 
Не в сети
Постоянный

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


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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB