Загрузка MTL цветов с помощью Assimp

Я пытался нагрузка Волновой фронт объект модель с ASSIMP. Тем не менее, я не могу заставить цвета материалов MTL работать (Kd rgb), Я знаю, как загрузить тогда, но я не знаю, как получить соответствующий цвет для каждой вершины.

usemtl material_11
f 7//1 8//1 9//2
f 10//1 11//1 12//2

Например, приведенный выше фрагмент obj Wavefront означает, что в вершинах thoose используется material_11.

Q: Итак, как я могу получить материал, соответствующий каждой вершине?

ошибка

Волновой фронт объект материалы не в правильных вершинах:

Исходная модель (отображается с помощью программы просмотра модели ASSIMP):
введите описание изображения здесь

Модель с моим кодом:
введите описание изображения здесь

Код:

Код, который я использую для загрузки цвета материалов MTL:

std::vector<color4<float>> colors = std::vector<color4<float>>();

...

for (unsigned int i = 0; i < scene->mNumMeshes; i++)
{
const aiMesh* model = scene->mMeshes[i];
const aiMaterial *mtl = scene->mMaterials[model->mMaterialIndex];

color4<float> color = color4<float>(1.0f, 1.0f, 1.0f, 1.0f);
aiColor4D diffuse;
if (AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_DIFFUSE, &diffuse))
color = color4<float>(diffuse.r, diffuse.g, diffuse.b, diffuse.a);
colors.push_back(color);

...
}

Код для создания вершин:

vertex* vertices_arr = new vertex[positions.size()];
for (unsigned int i = 0; i < positions.size(); i++)
{
vertices_arr[i].SetPosition(positions.at(i));
vertices_arr[i].SetTextureCoordinate(texcoords.at(i));
}

// Code for setting vertices colors (I'm just setting it in ASSIMP vertices order, since I don't know how to set it in the correct order).
for (unsigned int i = 0; i < scene->mNumMeshes; i++)
{
const unsigned int vertices_size = scene->mMeshes[i]->mNumVertices;
for (unsigned int k = 0; k < vertices_size; k++)
{
vertices_arr[k].SetColor(colors.at(i));
}
}

РЕДАКТИРОВАТЬ:

Похоже, что позиции вершин модели тоже загружаются некорректно. Даже когда я отключаю выборку лица и меняю цвет фона.

введите описание изображения здесь

1

Решение

Игнорирование проблем, связанных с количеством вызовов отрисовки и дополнительной памятью, пропускной способностью и обработкой для вершинных цветов,

Это выглядит как vertex* vertices_arr = new vertex[positions.size()]; это один большой массив, который вы создаете для хранения всей модели (которая имеет много сеток, каждая с одним материалом). Предполагая, что ваш первый цикл правильный и positions содержит все позиции для всех сеток вашей модели. Второй цикл начинает дублировать цвета сетки для каждой вершины в сетке. Тем не мение, vertices_arr[k] всегда начинается с нуля и должен начинаться после последней вершины предыдущего меша. Вместо этого попробуйте:

int colIdx = 0;
for (unsigned int i = 0; i < scene->mNumMeshes; i++)
{
const unsigned int vertices_size = scene->mMeshes[i]->mNumVertices;
for (unsigned int k = 0; k < vertices_size; k++)
{
vertices_arr[colIdx++].SetColor(colors.at(i));
}
}
assert(colIdx == positions.size()); //double check

Как вы говорите, если геометрия не рисуется должным образом, может быть, positions не содержит все данные вершин. Возможно, проблема похожа на приведенный выше код? Другая проблема может заключаться в объединении индексов для каждой сетки. Все индексы должны быть обновлены со смещением к новым местоположениям вершин в пределах vertices_arr массив. Хотя сейчас я просто выбрасываю догадки.

1

Другие решения


По вопросам рекламы [email protected]