В Vtk, как переназначить текстуру от одной модели к другой? - PullRequest
0 голосов
/ 15 ноября 2018

Я использую 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);
}

Как мне подойти к этой проблеме?

...