Я использую vtk для манипуляции 3D-моделью. Я хочу взять информацию о текстуре из одной модели и вставить поверх другой 3D-модели. Я не уверен, какие шаги я должен следовать. Ниже моя идея о том, что делать. Но у меня есть вопросы о том, как это сделать.
Шаг 1: Найти пары 3D-точек между 3D-моделями. Я сделал это.
Шаг 2: Получить текстурные координаты списка выбранных 3D точек из первой модели. Я не знаю, как это сделать, но я написал фрагмент кода для получения всех координат текстуры от актера, который представляет первую трехмерную модель.
void getTextureCoordinates(vtkSmartPointer<vtkPolyData> pd, std::vector<Eigen::Vector2d>& tcoord)
{
vtkDataArray *tcoords = NULL;
double *p;
tcoords = pd->GetPointData()->GetTCoords();
if (tcoords)
{
for (int i = 0; i < tcoords->GetNumberOfTuples(); i++)
{
p = tcoords->GetTuple(i);
Eigen::Vector2d tpt;
tpt << p[0], p[1];
tcoord.push_back(tpt);
}
}
}
У меня есть файл obj для 3D-модели. Кажется, что существует неравное количество координат вершин и текстур. Так что я не знаю, какая координата текстуры соответствует какой вершине.
Шаг 3: Установить координаты текстуры для второй 3D-модели. Опять же, я не хочу касаться каждой точки вершины. Я хочу применить текстуру только к тому списку 3D-точек, которые у меня есть. Я написал код ниже, чтобы установить координаты текстуры на полиданные.
// my understanding is that texture coordinates is 2D
void setTextureCoordinates(vtkSmartPointer<vtkPolyData> pd, std::vector<Eigen::Vector2d>& tcoord)
{
vtkDataArray *array = NULL;
double tuple[2];
for (int i = 0; i < tcoord.size(); i++)
{
tuple[0] = tcoord.at(i)[0];
tuple[1] = tcoord.at(i)[1];
array->InsertNextTuple(tuple);
}
pd->GetPointData()->SetTCoords(array);
}
Как мне подойти к этой проблеме?