我正在使用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);
}
如何解决此问题?