﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-koilin-随笔分类-图形学</title><link>http://www.cppblog.com/koilin/category/12553.html</link><description>beautiful graphics, beautiful world!</description><language>zh-cn</language><lastBuildDate>Mon, 01 Feb 2010 02:30:11 GMT</lastBuildDate><pubDate>Mon, 01 Feb 2010 02:30:11 GMT</pubDate><ttl>60</ttl><item><title>根据Mesh生成Cage的心历路程（4）</title><link>http://www.cppblog.com/koilin/archive/2010/01/29/106703.html</link><dc:creator>koilin</dc:creator><author>koilin</author><pubDate>Fri, 29 Jan 2010 03:34:00 GMT</pubDate><guid>http://www.cppblog.com/koilin/archive/2010/01/29/106703.html</guid><wfw:comment>http://www.cppblog.com/koilin/comments/106703.html</wfw:comment><comments>http://www.cppblog.com/koilin/archive/2010/01/29/106703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/koilin/comments/commentRss/106703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/koilin/services/trackbacks/106703.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>下面开始描述我是怎么样去实现方法五的。</span></p>
<p><span>根据我目前掌握的知识，和实验室已知的编程条件，方法五我需要以下三个过程：</span></p>
<p><span><span>（1）<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>在</span><span>CGAL</span><span>框架下生成</span><span>GPU</span><span>的绘制数据。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>对原</span><span>Mesh</span><span>的每个面生成局部坐标系；</span></p>
<p><span><img alt="local coordinates.bmp" src="file:///d:/Temp/msohtmlclip1/01/clip_image002.jpg" width=328 height=182 v:shapes="图片_x0020_16"></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>由局部坐标系形成面的</span><span>OBB</span><span>包围盒</span><span>Shell</span><span>；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><img alt=shells.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image004.jpg" width=151 height=90 v:shapes="图片_x0020_17"><img alt="shell slice.bmp" src="file:///d:/Temp/msohtmlclip1/01/clip_image006.jpg" width=173 height=90 v:shapes="图片_x0020_18"><img alt="a shell.bmp" src="file:///d:/Temp/msohtmlclip1/01/clip_image008.jpg" width=183 height=90 v:shapes="图片_x0020_19"></span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Shell</span><span>划分为</span><span>5</span><span>个</span><span>Tetrahedron</span><span>；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>根据离散化规格沿</span><span>Z</span><span>轴产生等距的</span><span>Slice</span><span>，每个</span><span>Slice</span><span>与</span><span>Tetrahedron</span><span>产生的交点即为</span><span>GPU</span><span>的输入顶点数据流。</span></p>
<p><span><img alt=slice.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image010.jpg" width=174 height=90 v:shapes="图片_x0020_22"><img alt="points in plane.bmp" src="file:///d:/Temp/msohtmlclip1/01/clip_image012.jpg" width=167 height=90 v:shapes="图片_x0020_21">&nbsp;<img alt="all points.bmp" src="file:///d:/Temp/msohtmlclip1/01/clip_image014.jpg" width=168 height=90 v:shapes="图片_x0020_20"></span></p>
<p><span>Cylinder</span><span>内部看</span></p>
<p><span><img alt=自己画的图.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image016.jpg" width=332 height=202 v:shapes="图片_x0020_25"></span></p>
<p><span><span>（2）<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>GPU</span><span>绘制</span></p>
<p><span>根据得到的顶点数据流，以及距离计算函数对每个切片数据进行绘制。绘制的过程其实一直都是有问题的，个中的原因我也说不清楚，只是知道结果是不正确的。</span></p>
<p align=center><span><img alt=距离值错误1.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image018.jpg" width=118 height=93 v:shapes="图片_x0020_26"><img alt=距离值错误2.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image020.jpg" width=118 height=93 v:shapes="图片_x0020_27"><img alt=距离值错误4.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image022.jpg" width=118 height=93 v:shapes="图片_x0020_28"><img alt=距离值错误3.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image024.jpg" width=118 height=93 v:shapes="图片_x0020_29"></span></p>
<p>&nbsp;</p>
<p><span>直到这个图才有了点成功的迹象</span><span>~</span></p>
<p align=center><span><img alt=好像有点成功的迹象了.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image026.jpg" width=198 height=156 v:shapes="图片_x0020_30"><img alt=貌似正确.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image028.jpg" width=199 height=156 v:shapes="图片_x0020_40"></span></p>
<p><span>对深度计算方法进行调整好以后才出现了自己想要的结果。以下是三个连续的切片。从整体上来看数据还是好的，但是最遗憾的就是中间的黑色部分出现了间断。</span></p>
<p align=center><span><img alt=20.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image030.gif" width=140 height=140 v:shapes="图片_x0020_31"><img alt=15.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image032.gif" width=140 height=140 v:shapes="图片_x0020_32"><img alt=16.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image034.gif" width=140 height=140 v:shapes="图片_x0020_33"></span></p>
<p><span>由于</span><span>vtk</span><span>处理的数据是</span><span>8</span><span>或</span><span>24</span><span>位的，而</span><span>D3D</span><span>的函数默认生成</span><span>bmp</span><span>图是</span><span>32</span><span>位的。这里幸亏张大帮忙，并提醒我用</span><span>opencv</span><span>来解决。</span><span>Opencv</span><span>不错，用起来挺方便的，建议数字图像处理的人用。</span></p>
<p><span>生成的</span><span>64x64</span><span>的</span><span>8</span><span>位灰度图如下：</span></p>
<p align=center><span><img alt=45.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image035.gif" width=64 height=64 v:shapes="图片_x0020_34"><img alt=43.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image036.gif" width=64 height=64 v:shapes="图片_x0020_35"><img alt=44.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image037.gif" width=64 height=64 v:shapes="图片_x0020_36"></span></p>
<p><span><span>（3）<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>VTK</span><span>根据切片数据，由</span><span>2D</span><span>的</span><span>bmp</span><span>图片生成</span><span>3D</span><span>网格模型</span></p>
<p align=left><span><img alt="gpu draw.bmp" src="file:///d:/Temp/msohtmlclip1/01/clip_image039.jpg" width=344 height=271 v:shapes="图片_x0020_41"></span></p>
<p><span>上图为</span><span>GPU</span><span>的绘制结果，通过</span><span>vtk</span><span>（</span><span>Visualization Toolkit</span><span>）绘制的结果。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>vtkBMPReader</span> *<span>reader</span> = <span>vtkBMPReader</span>::<span>New</span>();<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>SetFilePrefix</span>(<span>"D://cylinder/"</span>);</span></p>
<p align=left><span>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>SetFilePattern</span>(<span>"%s%d.bmp"</span>);</span></p>
<p align=left><span>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>SetDataByteOrderToLittleEndian</span>();</span></p>
<p align=left><span>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>SetDataSpacing</span>(1, 1, 3);</span></p>
<p align=left><span>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>SetFileNameSliceSpacing</span>(1);</span></p>
<p align=left><span>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>SetDataExtent</span>(0, 63, 0, 63, 1, 50);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>Allow8BitBMPOn</span>();</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span><span>reader</span>-&gt;<span>Update</span>();</span></p>
<p><span><img alt=vtk.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image041.jpg" width=284 height=207 v:shapes="图片_x0020_42"></span></p>
<p><span>生成了</span><span>STL</span><span>文件格式，然后再使用</span><span>3ds Max</span><span>进行</span><span>obj</span><span>文件格式转换。</span></p>
<p><span><img alt=obj1.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image043.jpg" width=281 height=218 v:shapes="图片_x0020_43"><img alt=obj2.bmp src="file:///d:/Temp/msohtmlclip1/01/clip_image045.jpg" width=264 height=218 v:shapes="图片_x0020_45"></span></p>
<p><span>比较郁闷的是网格模型竟然是双层的，不知道是什么原因啊？还好我的</span><span>Deformation</span><span>框架可以把文件读进来啊。</span></p>
<p><span>到现在，我的工作也可以说是到了一个段落了。接下来怎么改？迷茫</span><span>~~</span></p>
<img src ="http://www.cppblog.com/koilin/aggbug/106703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/koilin/" target="_blank">koilin</a> 2010-01-29 11:34 <a href="http://www.cppblog.com/koilin/archive/2010/01/29/106703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>