Pull to refresh

Comments 18

Когда писали игрушку для айфона, тоже сначала юзали 3DS, но потом перешли к PVR. 3DS-библиотека (lib3ds) оказалась немного глючной (не совсем корректно считались нормали), пришлось самим дописывать код, который корректировал нормали, чтобы на модельке не было артефактов. C PVR вроде таких проблем не было.
К счастью, я не использую lib3ds. :)
Добавил вычисление нормалей по группам сглаживания.
Вычисление нормали путем усреднения прилежащих нормалей является в корне не верным способом,
для это есть чанк CHUNK_SMOOTHG и алгоритм восстановления нормалей для рендера там намного сложнее
Да, я знаю, я сразу так и написал в самом начале, что не использую это. А вот заглушка для этого чанка у меня таки есть, если поделитесь кодом для неё — буду благодарен.
1) В документации 3smax сдк есть пример того как вычислять нормали docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-SDK-Programmer-Guide/
2) Также надо не забывать что некоторые рендер вертексы будут дублироваться из за того, что у одного и того же вертекса может быть больше одной нормали — соответственно надо будет еще и индекс буфер менять

По сути, у меня как раз получается складывание, взвешенное по площади (второй приём): суммирую-то я ненормализованные вектора, а векторное произведение двух рёбер как раз даст направление, умноженное на площадь треугольника.
Насколько я вижу по коду то вы просто складываете нормализованные вектора
и это не похоже на второй способ так как потом эта площадь используется для веса (или я не нашел у вас это в коде)

Второй вариант дает артефакты в случае «банального куба».
Там складываются НЕнормализованные вектора, а потом уже сумма нормализуется.
Про куб-то всё понятно, но всё равно мне не хотелось увеличивать количество вершин: телефону и так тяжко. :)
Спасибо за ссылки.
Собственно, именно из-за пункта 2 я всё это и не делал.
Добавил код восстановления нормалей в соответствии с группами сглаживания.
Статья хорошая, претензий нет. Хочется только добавить, что для промышленных целей лучше использовать формат, который можно целиком скопировать в видео-память (GL vertex buffer). К чему все эти парсинги выполнять каждый раз бедному ARM процессору, если можно подготовить данные заранее? :)
Конечно. Но меня просили выложить код загрузки .3ds, и я его выложил. А раз просили — значит, это кому-нибудь нужно.
Да уж, зачем засовывать в мобильное приложение файл с кучей лишней информации? :) Лучше написать плагин под используемый 3д пакет, который вытащет и запишет только то, что нужно.
Само собой. Просто, вот прямо сейчас у меня нет под рукой ни одного 3D-пакета, а файл — есть, и мне надо было его использовать в приложении. Да и лишних данных в том файле — совсем немного. Ну а сам загрузчик получился достаточно эффективным, чтобы не бояться недостатка производительности.
Sign up to leave a comment.

Articles