在Vtk中,如何将纹理从一个模型重新映射到另一个模型?

时间:2018-11-15 09:07:42

标签: graphics textures vtk texture-mapping uv-mapping

我正在使用vtk进行3D模型操作。我想从一个模型中获取纹理信息,然后粘贴到另一个3D模型上。我不确定应该采取什么步骤。以下是我的操作思路。但是我对如何做有疑问。

第一步:在3D模型之间找到3D点对。我已经做到了。

步骤2:从第一个模型中获取所选3D点列表的纹理坐标。我不知道该怎么做,但是我编写了一个代码片段,用于从表示第一个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);
    }
  }
}

我有一个3D模型的obj文件。顶点和纹理坐标的数量似乎不相等。所以我不知道哪个纹理坐标对应于哪个顶点。

Step3:设置第二个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);
}

如何解决此问题?

0 个答案:

没有答案