koilin

beautiful graphics, beautiful world!

常用链接

统计

最新评论

根据Mesh生成Cage的心历路程(4)

 

下面开始描述我是怎么样去实现方法五的。

根据我目前掌握的知识,和实验室已知的编程条件,方法五我需要以下三个过程:

(1)    CGAL框架下生成GPU的绘制数据。

       对原Mesh的每个面生成局部坐标系;

local coordinates.bmp

       由局部坐标系形成面的OBB包围盒Shell

       shells.bmpshell slice.bmpa shell.bmp

 

       Shell划分为5Tetrahedron

       根据离散化规格沿Z轴产生等距的Slice,每个SliceTetrahedron产生的交点即为GPU的输入顶点数据流。

slice.bmppoints in plane.bmp all points.bmp

Cylinder内部看

自己画的图.bmp

(2)    GPU绘制

根据得到的顶点数据流,以及距离计算函数对每个切片数据进行绘制。绘制的过程其实一直都是有问题的,个中的原因我也说不清楚,只是知道结果是不正确的。

距离值错误1.bmp距离值错误2.bmp距离值错误4.bmp距离值错误3.bmp

 

直到这个图才有了点成功的迹象~

好像有点成功的迹象了.bmp貌似正确.bmp

对深度计算方法进行调整好以后才出现了自己想要的结果。以下是三个连续的切片。从整体上来看数据还是好的,但是最遗憾的就是中间的黑色部分出现了间断。

20.bmp15.bmp16.bmp

由于vtk处理的数据是824位的,而D3D的函数默认生成bmp图是32位的。这里幸亏张大帮忙,并提醒我用opencv来解决。Opencv不错,用起来挺方便的,建议数字图像处理的人用。

生成的64x648位灰度图如下:

45.bmp43.bmp44.bmp

(3)    VTK根据切片数据,由2Dbmp图片生成3D网格模型

gpu draw.bmp

上图为GPU的绘制结果,通过vtkVisualization 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();

vtk.bmp

生成了STL文件格式,然后再使用3ds Max进行obj文件格式转换。

obj1.bmpobj2.bmp

比较郁闷的是网格模型竟然是双层的,不知道是什么原因啊?还好我的Deformation框架可以把文件读进来啊。

到现在,我的工作也可以说是到了一个段落了。接下来怎么改?迷茫~~

posted on 2010-01-29 11:34 koilin 阅读(552) 评论(0)  编辑 收藏 引用 所属分类: 图形学


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理