Как объединить два файла.obj после процесса наложения текстуры?

После наложения текстуры на трехмерную сетку создаются три файла (в том числе.obj, .mtl и файл атласа). Я наложил текстуры на 2 объекта, и теперь я хочу объединить эти объекты вместе, но я не знаю, как объединить их файлы. Есть какой-нибудь метод (не несвободный инструмент)?

2 ответа

Решение

Простое объединение файлов для obj-файлов wavefront с одним объектом относительно просто:

  1. читать первые файлы в память

    запомнить количество записей каждой таблицы

  2. добавить второй файл в память (кроме лиц)

  3. добавить грани второго файла в память

    Это единственное, что нужно немного изменить. Все индексы из 1 поэтому вам нужно добавить размер каждой таблицы из предыдущего файла. Например, если первый obj получил 10 строк, начинающихся с v это означает, что после добавления второй объект начнет ссылаться на свои пункты из 11 вместо. поэтому возьмите каждый индекс вершины и добавьте к нему размер.

    То же самое относится и к любой информации, которую вы получили, например, к нормали, текстурным координатам или чему-либо еще

  4. сохранить все как один файл obj

Извините, я не использую расширения материала, поэтому я не знаю формат и, если какие-либо изменения необходимы внутри файла MTL (но я так не думаю).

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

Просто чтобы быть здесь, небольшой пример...

File1:

v -1.0 -1.0 -1.0 
v +1.0 -1.0 -1.0 
v +1.0 +1.0 -1.0 
v -1.0 +1.0 -1.0 
v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

File2:

v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 
v -2.0 -2.0 +2.0 
v +2.0 -2.0 +2.0 
v +2.0 +2.0 +2.0 
v -2.0 +2.0 +2.0 

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

Объединять:

v -1.0 -1.0 -1.0 
v +1.0 -1.0 -1.0 
v +1.0 +1.0 -1.0 
v -1.0 +1.0 -1.0 
v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 

v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 
v -2.0 -2.0 +2.0 
v +2.0 -2.0 +2.0 
v +2.0 +2.0 +2.0 
v -2.0 +2.0 +2.0 

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

f  9 10 11 12 
f 13 14 15 16 
f  9 10 14 13 
f 10 11 15 14 
f 11 12 16 15 
f 12  9 13 16

Файл1 имеет 8 вершины, так что каждый индекс вершины в f из File2 увеличивается на 8, Я сделал весь пример вручную (включая File1,2), так что надеюсь, что я не сделал глупой ошибки, но предварительный просмотр в порядке, так что похоже, что это не так.

предварительный просмотр

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

Большое спасибо Spektre, Ваше решение было применимо. Для Mtl-файлов мы можем интегрировать построчные Mtl-файлы в уникальный Mtl-файл и печатать название каждого материала перед записью его лица. Для анализа файлов Obj может быть полезна библиотека libobj. Подходящее учебное пособие также объясняет пошаговый процесс вашего решения.

Другие вопросы по тегам