Как объединить два файла.obj после процесса наложения текстуры?
После наложения текстуры на трехмерную сетку создаются три файла (в том числе.obj, .mtl и файл атласа). Я наложил текстуры на 2 объекта, и теперь я хочу объединить эти объекты вместе, но я не знаю, как объединить их файлы. Есть какой-нибудь метод (не несвободный инструмент)?
2 ответа
Простое объединение файлов для obj-файлов wavefront с одним объектом относительно просто:
читать первые файлы в память
запомнить количество записей каждой таблицы
добавить второй файл в память (кроме лиц)
добавить грани второго файла в память
Это единственное, что нужно немного изменить. Все индексы из
1
поэтому вам нужно добавить размер каждой таблицы из предыдущего файла. Например, если первый obj получил 10 строк, начинающихся сv
это означает, что после добавления второй объект начнет ссылаться на свои пункты из11
вместо. поэтому возьмите каждый индекс вершины и добавьте к нему размер.То же самое относится и к любой информации, которую вы получили, например, к нормали, текстурным координатам или чему-либо еще
сохранить все как один файл 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. Подходящее учебное пособие также объясняет пошаговый процесс вашего решения.