今天需要用vtk实现贴图功能,搜遍网上居然都没有找到很好的学习资料,只是找到一篇写于07年的“vtk中的纹理贴图详解”里面有一个例子,是在一个平面上贴图,但我要实现的是三维空间中的贴图,类似于在一个立方体上面贴图,有参考的例子了,开始实验:
1、VTK纹理贴图基础:
见vtk中的纹理贴图详解(点击进入)
2、实验开始:
预定义
#define NFACE 6
#define NLINE 4
#define M_GET_LENGTH3D(x, y, z) sqrt((double)((x)*(x) + (y)*(y) + (z)*(z)))
//---------------------------------------------------------
typedef struct _T_PT3D_T_
{
double x, y, z;
}
PT3D;
先是定义数据,先是生成一个vtkUnstructuredGrid的立方体数据
//首先定义立方体的8个点
// a-----------b //顶
// / /
// / /
// c-----------d
// aa-----------bb //底
// / /
// / /
// cc-----------dd
PT3D pa,pb,pc,pd,paa,pbb,pcc,pdd;
paa.x = paa.y = paa.z = 0;
pbb.x = pbb.z = 0; pbb.y = 1;
pcc.y = pcc.z = 0; pcc.x = 1;
pdd.x = pdd.y = 1; pdd.z = 0;
pa.x = pa.y = 0; pa.z = 1;
pb.y = pb.z = 1; pb.x = 0;
pc.x = pc.z = 1; pc.y = 0;
pd.x = pd.y = pd.z = 1;
vtkUnstructuredGrid *mycube = vtkUnstructuredGrid::New();
vtkPoints *points = vtkPoints::New();
points->InsertPoint(0, paa.x, paa.y, paa.z);//0->aa
points->InsertPoint(1, pbb.x, pbb.y, pbb.z);//1->bb
points->InsertPoint(2, pcc.x, pcc.y, pcc.z);//2->cc
points->InsertPoint(3, pdd.x, pdd.y, pdd.z);//3->dd
points->InsertPoint(4, pa.x, pa.y, pa.z);//4->a
points->InsertPoint(5, pb.x, pb.y, pb.z);//5->b
points->InsertPoint(6, pc.x, pc.y, pc.z);//6->c
points->InsertPoint(7, pd.x, pd.y, pd.z);//7->d
mycube->SetPoints(points);
//int facesIndex[6][4] = {
{ 下 },{ 上 },{ 左 },{ 右 },{ 前 },{ 后 }};
//int facesIndex[6][4] = {
{aa-bb-dd-cc},{a-b-d-c},{aa-a-c-cc},{bb-b-d-dd},{cc-c-d-dd},{aa-a-b-bb}};
int facesIndex[NFACE][NLINE] = {
{0,1,3,2},{4,5,7,6},{0,4,6,2},{1,5,7,3},{2,6,7,3},{0,4,5,1}};
//int facesIndex[NFACE][NLINE] = {
{6,0,2},{6,0,1},{6,2,3},{6,1,3}};
for (int iFace = 0; iFace < NFACE; iFace++)
{
mycube->InsertNextCell(VTK_POLYGON,NLINE,facesIndex[iFace]);
}
然后读取纹理数据,纹理文件见附件
//读取纹理图像
vtkBMPReader *bmpReader = vtkBMPRead