下面开始描述我是怎么样去实现方法五的。
根据我目前掌握的知识,和实验室已知的编程条件,方法五我需要以下三个过程:
(1) 在CGAL框架下生成GPU的绘制数据。
对原Mesh的每个面生成局部坐标系;
由局部坐标系形成面的OBB包围盒Shell;
Shell划分为5个Tetrahedron;
根据离散化规格沿Z轴产生等距的Slice,每个Slice与Tetrahedron产生的交点即为GPU的输入顶点数据流。
Cylinder内部看
(2) GPU绘制
根据得到的顶点数据流,以及距离计算函数对每个切片数据进行绘制。绘制的过程其实一直都是有问题的,个中的原因我也说不清楚,只是知道结果是不正确的。
直到这个图才有了点成功的迹象~
对深度计算方法进行调整好以后才出现了自己想要的结果。以下是三个连续的切片。从整体上来看数据还是好的,但是最遗憾的就是中间的黑色部分出现了间断。
由于vtk处理的数据是8或24位的,而D3D的函数默认生成bmp图是32位的。这里幸亏张大帮忙,并提醒我用opencv来解决。Opencv不错,用起来挺方便的,建议数字图像处理的人用。
生成的64x64的8位灰度图如下:
(3) VTK根据切片数据,由2D的bmp图片生成3D网格模型
上图为GPU的绘制结果,通过vtk(Visualization Toolkit)绘制的结果。
vtkBMPReader *reader = vtkBMPReader::New(); reader->SetFilePrefix("D://cylinder/");
reader->SetFilePattern("%s%d.bmp");
reader->SetDataByteOrderToLittleEndian();
reader->SetDataSpacing(1, 1, 3);
reader->SetFileNameSliceSpacing(1);
reader->SetDataExtent(0, 63, 0, 63, 1, 50);
reader->Allow8BitBMPOn();
reader->Update();
生成了STL文件格式,然后再使用3ds Max进行obj文件格式转换。
比较郁闷的是网格模型竟然是双层的,不知道是什么原因啊?还好我的Deformation框架可以把文件读进来啊。
到现在,我的工作也可以说是到了一个段落了。接下来怎么改?迷茫~~