tag:blogger.com,1999:blog-49813352978009137082024-02-20T18:40:22.117-08:00Khaled Mamou's Blogkmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.comBlogger26125tag:blogger.com,1999:blog-4981335297800913708.post-84414297026501714662016-06-02T19:20:00.001-07:002016-06-02T19:20:58.276-07:00Who is using Open3DGC?<div dir="ltr" style="text-align: left;" trbidi="on">
Please, let me know if you are using open3dgc in your products/projects/articles<br />
<ul style="text-align: left;">
<li><span style="color: #0000ee;"><a href="https://github.com/KhronosGroup/glTF">Khronous glTF</a></span></li>
<li><span style="color: #0000ee;"><u><a href="http://community.poonya.com/224">SEA3D Studio</a></u></span></li>
<li><span style="color: #0000ee;"><a href="http://cesiumjs.org/2015/08/10/introducing-3d-tiles/">Cesium</a></span></li>
<li><a href="https://graphics.cg.uni-saarland.de/fileadmin/cguds/papers/2014/sutter/blast.pd">BLAST</a></li>
</ul>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com1tag:blogger.com,1999:blog-4981335297800913708.post-54794084382200671072016-01-24T14:00:00.000-08:002016-01-24T14:00:14.248-08:00Latest V-HACD source code<div dir="ltr" style="text-align: left;" trbidi="on">
The latest version of the V-HACD code is available here https://github.com/kmammou/v-hacd</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com19tag:blogger.com,1999:blog-4981335297800913708.post-79787410183983098382015-06-26T20:45:00.001-07:002015-06-26T20:53:28.591-07:00A Simple C++ Class for 3D Mesh Decimation <div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRCpZGoj4qB4IrO15A5sRh57ZpvonbFrdF-1B8pv_9nKuPBzqw3E9FCaNBITUqhIqJhWIeGqhM_po9n_FoiYasIr9QYEW8930MemNkVbgsMTwINedVevCMYYucR6LuIyqssu6t9AL266GW/s1600/Slide2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRCpZGoj4qB4IrO15A5sRh57ZpvonbFrdF-1B8pv_9nKuPBzqw3E9FCaNBITUqhIqJhWIeGqhM_po9n_FoiYasIr9QYEW8930MemNkVbgsMTwINedVevCMYYucR6LuIyqssu6t9AL266GW/s400/Slide2.PNG" width="400" /></a></div>
<br />
Some time ago I wrote a simple C++ class to simplify a 3D mesh. It is based on Michael Garland's article "<a href="http://www.cs.cmu.edu/~./garland/Papers/quadrics.pdf">Surface Simplification Using Quadric Error Metrics</a>"<br />
<br />
The <a href="https://github.com/kmammou/MeshDecimation">code </a>is available under a BSD license.<br />
<br />
A <a href="https://github.com/kmammou/MeshDecimation/tree/master/bin/Win64">win64 </a>executable is also available for quick testing.<br />
<br />
The code produces good quality results. However, it is relatively slow!<br />
<br />
Usage:<br />
<span style="font-family: Courier New, Courier, monospace;">MeshSimplification fileNameIn.obj targetNTrianglesDecimatedMesh targetNVerticesDecimatedMesh maxDecimationError fileNameOut.obj</span><br />
<br />
For instance, to generate a decimated mesh with 1000 triangles use the following command line:<br />
<span style="font-family: Courier New, Courier, monospace;">MeshSimplification input.obj 1000 0 1.0 decimated.obj</span><br />
<br />
To generate a decimated mesh with 1000 vertices:<br />
<span style="font-family: Courier New, Courier, monospace;">MeshSimplification input.obj 0 1000 1.0 decimated.obj</span><br />
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
To generate a decimated mesh with an error of 1%:<br />
<span style="font-family: Courier New, Courier, monospace;">MeshSimplification input.obj 0 0 0.01 decimated.obj</span><br />
<br />
<div>
To use the mesh decimation class in your code, proceed as follows:</div>
</div>
<pre></pre>
</div>
<pre><span style="color: green;"><i>// input mesh
</i></span>Vec3<span style="color: blue;"><</span>Float<span style="color: blue;">></span> <span style="color: blue;">*</span> points<span style="color: blue;"><b>;</b></span>
Vec3<span style="color: blue;"><</span><span style="color: red;"><b>int</b></span><span style="color: blue;">></span> <span style="color: blue;">*</span> triangles<span style="color: blue;"><b>;</b></span>
<span style="color: green;"><i>// Fill points and triangles with input mesh
</i></span><span style="color: green;"><i>// ...
</i></span>
<span style="color: green;"><i>// decimate mesh
</i></span>MeshDecimator myMDecimator<span style="color: blue;"><b>;</b></span>
myMDecimator<span style="color: blue;"><b>.</b></span>Initialize<span style="color: blue;"><b>(</b></span>nPoints<span style="color: blue;"><b>,</b></span> nTriangles<span style="color: blue;"><b>,</b></span> points<span style="color: blue;"><b>,</b></span> triangles<span style="color: blue;"><b>)</b></span><span style="color: blue;"><b>;</b></span>
myMDecimator<span style="color: blue;"><b>.</b></span>Decimate<span style="color: blue;"><b>(</b></span>targetNVerticesDecimatedMesh<span style="color: blue;"><b>,</b></span> targetNTrianglesDecimatedMesh<span style="color: blue;"><b>,</b></span> maxDecimationError<span style="color: blue;"><b>)</b></span><span style="color: blue;"><b>;</b></span>
<span style="color: green;"><i>// allocate memory for decimated mesh
</i></span>size_t nVerticesDecimatedMesh <span style="color: blue;">=</span> myMDecimator<span style="color: blue;"><b>.</b></span>GetNVertices<span style="color: blue;"><b>(</b></span><span style="color: blue;"><b>)</b></span><span style="color: blue;"><b>;</b></span>
size_t nTrianglesDecimatedMesh <span style="color: blue;">=</span> myMDecimator<span style="color: blue;"><b>.</b></span>GetNVertices<span style="color: blue;"><b>(</b></span><span style="color: blue;"><b>)</b></span><span style="color: blue;"><b>;</b></span>
Vec3<span style="color: blue;"><</span>Float<span style="color: blue;">></span> <span style="color: blue;">*</span> decimatedMeshPoints <span style="color: blue;">=</span> <span style="color: red;"><b>new</b></span> Vec3<span style="color: blue;"><</span>Float<span style="color: blue;">></span><span style="color: blue;"><b>[</b></span>nVerticesDecimatedMesh<span style="color: blue;"><b>]</b></span><span style="color: blue;"><b>;</b></span>
Vec3<span style="color: blue;"><</span><span style="color: red;"><b>int</b></span><span style="color: blue;">></span> <span style="color: blue;">*</span> decimatedMeshTriangles <span style="color: blue;">=</span> <span style="color: red;"><b>new</b></span> Vec3<span style="color: blue;"><</span><span style="color: red;"><b>int</b></span><span style="color: blue;">></span><span style="color: blue;"><b>[</b></span>nTrianglesDecimatedMesh<span style="color: blue;"><b>]</b></span><span style="color: blue;"><b>;</b></span>
<span style="color: green;"><i>// retrieve decimated mesh
</i></span>myMDecimator<span style="color: blue;"><b>.</b></span>GetMeshData<span style="color: blue;"><b>(</b></span>decimatedMeshPoints<span style="color: blue;"><b>,</b></span> decimatedMeshTriangles<span style="color: blue;"><b>)</b></span><span style="color: blue;"><b>;</b></span></pre>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com2tag:blogger.com,1999:blog-4981335297800913708.post-76826828518728329842015-04-10T15:07:00.000-07:002015-04-10T15:07:12.649-07:00Using V-HACD for 2D Approximate Convex Decomposition<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqKVOf0RlZQhMeTYYxS212nTWZ2dnDMEx0QQgXO2clhDzY2vUr6UAv9gzozSOQThg8CNnJZ6-rusvuEGrOq0CTC3T2wbxnf58Ve8HQOAuCPwCn7NhPPYVWKWuN4723S_rQlKeSKHFJkMjY/s1600/VHACD_FLAT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqKVOf0RlZQhMeTYYxS212nTWZ2dnDMEx0QQgXO2clhDzY2vUr6UAv9gzozSOQThg8CNnJZ6-rusvuEGrOq0CTC3T2wbxnf58Ve8HQOAuCPwCn7NhPPYVWKWuN4723S_rQlKeSKHFJkMjY/s1600/VHACD_FLAT.png" height="298" width="400" /></a></div>
<br /></div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com4tag:blogger.com,1999:blog-4981335297800913708.post-50410574328952848092015-04-02T18:24:00.002-07:002015-04-02T18:25:31.898-07:00 Unreal Engine 4 switches to V-HACD<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://forums.unrealengine.com/showthread.php?65376-Engine-Features-Preview-4-02-2015"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOHZfepHNgC6XEUyg9asJIp08q69N64ozonARAJORNtHU-uDm6nreqCUGaji9iGixfRXFJDF0MgtsqgRfrlTlSyZEiyf4N9q-L0G7lFeKiJPEfpwVhzmTl2SHBkok_CsFx3W7zlR9douOP/s1600/Armor.png" height="166" width="400" /></a></div>
<br /></div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-49990617273810524462015-01-21T22:56:00.000-08:002016-01-24T14:24:59.141-08:00OpenCL Acceleration for V-HACD<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
Since I don’t expect to have time in the near future to work on V-HACD , I am writing this post to keep track of the performance
improvements obtained after the latest optimizations I added. The source code is available <a href="https://github.com/kmammou/v-hacd">here</a>.<br />
<br />
<b><span style="font-size: large;">Experimental Evaluation</span></b><br />
Table 1 compares the computation times (cf. Section "Machine description") of V-HACD 2.0 and
V-HACD 2.2 obtained by using the configuration described below (cf. Table 2). These results
show that V-HACD 2.2 is an order of magnitude faster than V-HACD 2.0. The gains
are mainly obtained thanks to the convex-hull approximation (cf. Section "Updates"). The OpenCL acceleration provides
30-50% lower computation times when compared to the CPU-only version of V-HACD 2.2. </div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The code is still not fully optimized and more
improvements could be expected!<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-align: center;">
<br /></div>
<div class="MsoNormal" style="text-align: center;">
<o:p></o:p></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
V-HACD 2.0 (CPU only)<o:p></o:p></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
V-HACD 2.2 (CPU+GPU)<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
army_man<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
650s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
65s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
block<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
220s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
26s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Bunny<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
317s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
30s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Camel<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
388s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
34s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Casting<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
744s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
79s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Chair<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
408s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
42s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Cow1<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
314s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
30s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Cow2<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
349s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
32s<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
deer_bound<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.85pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
411s<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 116.9pt;" valign="top" width="156"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
34s<o:p></o:p></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<o:p><span style="text-align: center;"><b>Table 1: Computation times: V-HACD 2.0 vs V-HACD 2.2</b></span> </o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b>Parameter<o:p></o:p></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b>Config.
1<o:p></o:p></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
resolution<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
8000000<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
max. depth<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
20<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
max. concavity<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0.001<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
plane down-sampling<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
4<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
convex-hull down-sampling<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
4<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
alpha<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0.05<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
beta<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0.05<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
gamma<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0.0005<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
delta<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0.05<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
pca<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
mode<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
max. vertices per convex-hull<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
64<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
min. volume to add vertices to convex-hulls<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
0.0001<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.8pt;" valign="top" width="208"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
convex-hull approximation<o:p></o:p></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 155.85pt;" valign="top" width="208"><div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
1<o:p></o:p></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<o:p><b><span style="text-align: center;">Table 2: Tested configuration</span> </b></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br />
<span style="font-size: large;"><b>Updates</b></span><br />
<div class="MsoNormal">
V-HACD 2.2 include the following updates:</div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
</div>
<ol>
<li><span style="text-indent: -18pt;">OpenCL acceleration to compute the clipped volumes on the GPU</span></li>
<li><span style="text-indent: -18pt;">Convex-hull approximation to accelerate concavity calculations</span></li>
<li>Added local concavity measure to clipping cost calculation</li>
<li>Changed command line parameters</li>
</ol>
<div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo2; text-indent: -18.0pt;">
<span style="font-size: large;"><b>To do</b></span><br />
When I'll find time (probably not soon), I need to do the following:<br />
<br />
<ul>
<li>Test the code and build executables for different platforms (i.e., Linux, Mac OS), and </li>
<li>Update the Blender add-on to make it work with the new command line parameters.</li>
</ul>
</div>
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-size: large;"><b>Machine description</b></span><o:p></o:p></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<br />
<ul style="text-align: left;">
<li>OS: Windows 8.1 Pro 64-bit</li>
<li>CPU: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz (8
CPUs), ~3.4GHz</li>
<li>GPU: NVIDIA GeForce GTX 550 Ti</li>
<li>Memory: 10240MB RAM</li>
</ul>
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpLast" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;">
<o:p></o:p></div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-23133752994793455432014-12-18T18:48:00.001-08:002014-12-18T19:35:24.500-08:00[V-HACD] Adaptive Convex-Hulls Sub-sampling<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: left;">Today, I took some time to add a new parameter (i.e., minVolumePerCH) to V-HACD to adaptively control the number of vertices/triangles of the generated convex-hulls. Below some results for different values of </span><span style="text-align: left;">minVolumePerCH.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKcatV-RgNW-VTrwBIaf0ho0BG2GILgwbL39pQXcswRbTAC8bgC4HAz1VBxv5C2YtHQYvDjXxIu65ON_cyXx6COPbOvxgB4eDgDDOS7i9L5xl9X0W5o-a9uvWQ9ELa46LViKM14ZQq2LY6/s1600/vhacd_minVolume.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKcatV-RgNW-VTrwBIaf0ho0BG2GILgwbL39pQXcswRbTAC8bgC4HAz1VBxv5C2YtHQYvDjXxIu65ON_cyXx6COPbOvxgB4eDgDDOS7i9L5xl9X0W5o-a9uvWQ9ELa46LViKM14ZQq2LY6/s1600/vhacd_minVolume.png" height="360" width="640" /></a></div>
<br />
<br />
<br />
<br /></div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com2tag:blogger.com,1999:blog-4981335297800913708.post-63765526418172706052014-12-16T21:21:00.004-08:002015-06-23T07:08:52.951-07:00Who is using V-HACD?<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Please, let me know if you are using V-HACD in your products<br />
<ul style="text-align: left;">
<li><a href="http://www.leadwerks.com/werkspace/blog/1/entry-1362-convex-decomposition-made-useful/">Leadwerks</a></li>
<li><a href="https://www.rtt.ag/en">3DEXCITE</a></li>
<li><a href="https://forums.unrealengine.com/showthread.php?65376-Engine-Features-Preview-4-02-2015">Unreal Engine 4</a></li>
<li><a href="http://forum.thegamecreators.com/?m=forum_view&t=208831&b=8">DBPro</a></li>
<li><a href="https://highfidelity.com/">HighFidelity</a></li>
<li><a href="http://bonzaiengine.com/index.php">Bonzai Engine</a></li>
</ul>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-58003718902169671362014-12-15T10:15:00.000-08:002014-12-15T20:00:58.359-08:00V-HACD Blender Add-on (by Alain Ducharme)<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibsma4f-HfRKZCgWnQ0cPpuKUYvLhCOWXBLkxTWansZ1na30Uejq2Js9_vZIFacRB3tyUfsNqmj9DyWUocnNF_k8tty8HnJpo6DOIszpL1ESn35IuxlEG3ZSriUwl4iAuG00XqPCp2_dWQ/s1600/v-hacd_Blender_addon.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibsma4f-HfRKZCgWnQ0cPpuKUYvLhCOWXBLkxTWansZ1na30Uejq2Js9_vZIFacRB3tyUfsNqmj9DyWUocnNF_k8tty8HnJpo6DOIszpL1ESn35IuxlEG3ZSriUwl4iAuG00XqPCp2_dWQ/s1600/v-hacd_Blender_addon.jpg" height="225" width="400" /></a></div>
Checkout this Blender <a href="http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=4&t=6619&start=30">add-on</a> released by Alain Ducharme!</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-7730175683441053532014-12-13T14:32:00.001-08:002015-01-10T16:39:54.922-08:00V-HACD 2.0 Parameters Description<div dir="ltr" style="text-align: left;" trbidi="on">
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
</style>
<br />
<br />
<table border="1" class="tg">
<tbody>
<tr>
<th class="tg-031e">Parameter name</th>
<th class="tg-031e">Description</th>
<th class="tg-031e">Default value</th>
<th class="tg-031e">Range</th>
</tr>
<tr>
<td class="tg-031e">resolution</td>
<td class="tg-031e">maximum number of voxels generated during the voxelization stage</td>
<td class="tg-031e">100,000</td>
<td class="tg-031e">10,000-64,000,000</td>
</tr>
<tr>
<td class="tg-031e">depth</td>
<td class="tg-031e">maximum number of clipping stages. During each split stage, all the model parts (with a concavity higher than the user defined threshold) are clipped according the "best" clipping plane</td>
<td class="tg-031e">20</td>
<td class="tg-031e">1-32</td>
</tr>
<tr>
<td class="tg-031e">concavity</td>
<td class="tg-031e">maximum concavity</td>
<td class="tg-031e">0.0025</td>
<td class="tg-031e">0.0-1.0</td>
</tr>
<tr>
<td class="tg-031e">planeDownsampling</td>
<td class="tg-031e">controls the granularity of the search for the "best" clipping plane</td>
<td class="tg-031e">4</td>
<td class="tg-031e">1-16</td>
</tr>
<tr>
<td class="tg-031e">convexhullDownsampling</td>
<td class="tg-031e">controls the precision of the convex-hull generation process during the clipping plane selection stage</td>
<td class="tg-031e">4</td>
<td class="tg-031e">1-16</td>
</tr>
<tr>
<td class="tg-031e">alpha</td>
<td class="tg-031e">controls the bias toward clipping along symmetry planes </td>
<td class="tg-031e">0.05</td>
<td class="tg-031e">0.0-1.0</td>
</tr>
<tr>
<td class="tg-031e">beta</td>
<td class="tg-031e">controls the bias toward clipping along revolution axes</td>
<td class="tg-031e">0.05</td>
<td class="tg-031e">0.0-1.0</td>
</tr>
<tr>
<td class="tg-031e">gamma</td>
<td class="tg-031e">maximum allowed concavity during the merge stage</td>
<td class="tg-031e">0.00125</td>
<td class="tg-031e">0.0-1.0</td>
</tr>
<tr>
<td class="tg-031e">pca</td>
<td class="tg-031e">enable/disable normalizing the mesh before applying the convex decomposition</td>
<td class="tg-031e">0</td>
<td class="tg-031e">0-1</td>
</tr>
<tr>
<td class="tg-031e">mode</td>
<td class="tg-031e">0: voxel-based approximate convex decomposition, 1: tetrahedron-based approximate convex decomposition</td>
<td class="tg-031e">0</td>
<td class="tg-031e">0-1</td>
</tr>
<tr>
<td class="tg-031e">maxNumVerticesPerCH</td>
<td class="tg-031e">controls the maximum number of triangles per convex-hull</td>
<td class="tg-031e">64</td>
<td class="tg-031e">4-1024</td>
</tr>
<tr>
<td class="tg-031e">minVolumePerCH</td>
<td class="tg-031e">controls the adaptive sampling of the generated convex-hulls</td>
<td class="tg-031e">0.0001</td>
<td class="tg-031e">0.0-0.01</td>
</tr>
</tbody></table>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com7tag:blogger.com,1999:blog-4981335297800913708.post-14970425938569929642014-12-07T18:46:00.005-08:002016-01-24T14:25:44.330-08:00V-HACD 2.0 vs. HACD<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Below some approximate convex decomposition results comparing <a href="https://github.com/kmammou/v-hacd"><span style="color: red;">V</span>-HACD</a> 2.0 and <a href="http://sourceforge.net/projects/hacd/">HACD</a>.<br />
<br />
Parameters:<br />
<ul style="text-align: left;">
<li>testVHACD.exe %%i 8000000 20 0.003 4 4 0.05 0.05 0.0015 0 0 256 0.0 %%i.wrl log_%%i.txt</li>
<li>testHACD.exe %%i 2 50 0 0 1 30 2000</li>
</ul>
Score:<br />
<ul style="text-align: left;">
<li>+1: V-HACD provides better decomposition than HACD</li>
<li>-1: HACD provides better decomposition than V-HACD</li>
<li>0: V-HACD and HACD provide comparable results</li>
</ul>
<br />
<br />
<table border="0" cellpadding="0">
<tbody>
<tr>
<td align="center" valign="center"><span style="font-size: x-large;"><span style="color: red;"><b>V</b></span>-HACD 2.0</span></td>
<td align="center" valign="center"><span style="font-size: x-large;">HACD</span></td>
<td align="center" valign="center"><span style="font-size: x-large;">Score</span></td>
</tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieMxd_pkM7hU0U-f9UGktYNysrvO6Fe6NvaTPrcHDyF0TkMTj4IHGs30FSi7L6SC5HItWJzMc03w7yQhXu8Z0qu1pHBpDDFMCNE40vwIpKG-NVOkwqci5N9LW32mK3z1FfKkTcNc6xPWI5/s1600/army_man_vhacd2_18parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieMxd_pkM7hU0U-f9UGktYNysrvO6Fe6NvaTPrcHDyF0TkMTj4IHGs30FSi7L6SC5HItWJzMc03w7yQhXu8Z0qu1pHBpDDFMCNE40vwIpKG-NVOkwqci5N9LW32mK3z1FfKkTcNc6xPWI5/s1600/army_man_vhacd2_18parts.png" width="195" /></a></div>
18 convex-hulls<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
</td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg10laJdeCRvNEMPly_54Wv2d8scG33HCTNwt5AwWMdQMJkTBSHPEQrzgDb_9qijpugjZrmcKWyfTn-r3aQZV6orAMK5JT9bxq0nvJluIyHPqgLLBJxbMGKsZfBZFllmVO6zjEQHGXQ6kmG/s1600/army_man_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg10laJdeCRvNEMPly_54Wv2d8scG33HCTNwt5AwWMdQMJkTBSHPEQrzgDb_9qijpugjZrmcKWyfTn-r3aQZV6orAMK5JT9bxq0nvJluIyHPqgLLBJxbMGKsZfBZFllmVO6zjEQHGXQ6kmG/s1600/army_man_hacd.png" width="195" /></a><br />
66 convex-hulls<br />
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV2cRhEp6xJEjQQ2Z8lh1Shl7VwB2JtDmyROl75JFiqWP5EtSxPSXNNN9dGoF3away19kZvMQwJa228_db5a5M2KVOQ46mYG-_cecYuFlzW_5nUBQTZrQE256OQ1XWh976XFTODxEkOMaZ/s1600/block_vhacd2_18parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV2cRhEp6xJEjQQ2Z8lh1Shl7VwB2JtDmyROl75JFiqWP5EtSxPSXNNN9dGoF3away19kZvMQwJa228_db5a5M2KVOQ46mYG-_cecYuFlzW_5nUBQTZrQE256OQ1XWh976XFTODxEkOMaZ/s1600/block_vhacd2_18parts.png" width="133" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
18 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyxGtoPSGsQgSRSg0rgf1cCHorCY2-ur2_p8UOQ7ZtLiJeJu5IdjjzWYRsmY_7ave4Gut_jBw1_BkdmdKkgac4pjcm8fbSjFsvbptrpzh6GIVuLbealk9kXklu6VUM-wEZk-Fa26zOs0Tm/s1600/block_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyxGtoPSGsQgSRSg0rgf1cCHorCY2-ur2_p8UOQ7ZtLiJeJu5IdjjzWYRsmY_7ave4Gut_jBw1_BkdmdKkgac4pjcm8fbSjFsvbptrpzh6GIVuLbealk9kXklu6VUM-wEZk-Fa26zOs0Tm/s1600/block_hacd.png" width="133" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
26 convex-hulls</div>
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQT9bu1fSCUZTi9g9-L6mNR1rfoPhji_ei_WG-UVSynijI87LOOzeb54fTGeTuddAjWMvimmvGtDAEvFp_A1NOYjTCZG1KtKz-eOufD-9IIEdCajtX_26LhhvyOIpeQNQlxevpLptcOM9B/s1600/bunny_vhacd_16parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQT9bu1fSCUZTi9g9-L6mNR1rfoPhji_ei_WG-UVSynijI87LOOzeb54fTGeTuddAjWMvimmvGtDAEvFp_A1NOYjTCZG1KtKz-eOufD-9IIEdCajtX_26LhhvyOIpeQNQlxevpLptcOM9B/s1600/bunny_vhacd_16parts.png" width="166" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
16 <span style="text-align: left;">convex-hulls</span></div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZUAUZX-M2_DEX5GHilQ8l6XisUqjeiVCNPqiiIsYicoba2_c5Am1pFYiU0lJB5smoZCHZG_Sdgwqt07iSEuyEnq1JVX_NgsWW5p_fT6aKumAveivCAGvOwec94X42BdZetSXem4qwHBNv/s1600/bunny_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZUAUZX-M2_DEX5GHilQ8l6XisUqjeiVCNPqiiIsYicoba2_c5Am1pFYiU0lJB5smoZCHZG_Sdgwqt07iSEuyEnq1JVX_NgsWW5p_fT6aKumAveivCAGvOwec94X42BdZetSXem4qwHBNv/s1600/bunny_hacd.png" width="175" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
12 <span style="text-align: left;">convex-hulls</span></div>
<br /></td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLorYD2DEX1PW83cCUKNZxtlS4gDbwknhDO1L09WhzPVVxhvmx5HJ3hk006kgmUVnIxTPburpNW6nxRLfajO_LE-kl0_yH6tycF_Lk9mEtXI7f96Ank5GSREhryYWtkzEWN4V9VEsRZHii/s1600/camel_vhacd_30parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLorYD2DEX1PW83cCUKNZxtlS4gDbwknhDO1L09WhzPVVxhvmx5HJ3hk006kgmUVnIxTPburpNW6nxRLfajO_LE-kl0_yH6tycF_Lk9mEtXI7f96Ank5GSREhryYWtkzEWN4V9VEsRZHii/s1600/camel_vhacd_30parts.png" width="133" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
30 <span style="text-align: left;">convex-hulls</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="text-align: left;"><br /></span></div>
</td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn-ZmB1i6TXSWLNwPAM1n8dNT_0Qf1MD8MzselFX-Dt08iJhxR5pNkVUtSEmd3-EGJD5qn1LEOgK855SECoUCcHsdD_aOFpmwybYEDwA2LxknCj3II_RtsAsVv7G0pvVTSkuIDVWBlfrEt/s1600/camel_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn-ZmB1i6TXSWLNwPAM1n8dNT_0Qf1MD8MzselFX-Dt08iJhxR5pNkVUtSEmd3-EGJD5qn1LEOgK855SECoUCcHsdD_aOFpmwybYEDwA2LxknCj3II_RtsAsVv7G0pvVTSkuIDVWBlfrEt/s1600/camel_hacd.png" width="128" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
28 <span style="text-align: left;">convex-hulls</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="text-align: left;"><br /></span></div>
</td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgT5sOom2c5z0-4oH05cwiX86u1i3bU7veJnk45L6qhyF8slyKa4jRIi1W0F4ff1bkwaaOnmNf2mXpGX59wLB2GFlfrMZrE2FdfkoFlZLoM-o5Vq2BP1KnTAp9DPDKsCIZamzWfMhQSJ19/s1600/casting_vhacd_46parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgT5sOom2c5z0-4oH05cwiX86u1i3bU7veJnk45L6qhyF8slyKa4jRIi1W0F4ff1bkwaaOnmNf2mXpGX59wLB2GFlfrMZrE2FdfkoFlZLoM-o5Vq2BP1KnTAp9DPDKsCIZamzWfMhQSJ19/s1600/casting_vhacd_46parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
46 convex-hulls</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiieeS1ot0anYAmMT1yf4MNq1EpYvl2bw2VmbRXBh-hH2M34zyTlDbj9ldejWCZfvSAxlbwDyu27ROCEUOoVvpc2-CExpJ-vy75Tlv15iZpqiFWcQbqxCCj6fOwh73TM_7q3JOWv9qHpq9s/s1600/casting_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiieeS1ot0anYAmMT1yf4MNq1EpYvl2bw2VmbRXBh-hH2M34zyTlDbj9ldejWCZfvSAxlbwDyu27ROCEUOoVvpc2-CExpJ-vy75Tlv15iZpqiFWcQbqxCCj6fOwh73TM_7q3JOWv9qHpq9s/s1600/casting_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
54 convex-hulls</div>
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1r-bUfjstFkLfuPHrHTXE7TMF-pXAdBmd0HxTJMvex-aK0KdTBKjlWRduObzYIWZ1d7dU135e7ITpgvmL4hrVDcb3gImD0IrVXTCbAnhYnJHA_MyP8wsF9E2V5kjeV5X3QwrfK-Bxa68x/s1600/character_vhacd_18parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1r-bUfjstFkLfuPHrHTXE7TMF-pXAdBmd0HxTJMvex-aK0KdTBKjlWRduObzYIWZ1d7dU135e7ITpgvmL4hrVDcb3gImD0IrVXTCbAnhYnJHA_MyP8wsF9E2V5kjeV5X3QwrfK-Bxa68x/s1600/character_vhacd_18parts.png" width="200" /></a></div>
18 convex-hulls<br />
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0EPcwhjr8EqZX0feqkWmPrEZhaQStaFNzTVhpvSwa92aDNBhPOJk3v3Ga70AAVksu8r-P2CrFiBWJHBK-F_xtAGDdXreNMMXwVWODYPM5TDWjI7W0EsnBxhtgCdNgDADkmoorLg_FVLCW/s1600/character_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0EPcwhjr8EqZX0feqkWmPrEZhaQStaFNzTVhpvSwa92aDNBhPOJk3v3Ga70AAVksu8r-P2CrFiBWJHBK-F_xtAGDdXreNMMXwVWODYPM5TDWjI7W0EsnBxhtgCdNgDADkmoorLg_FVLCW/s1600/character_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
26 convex-hulls</div>
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLked6sMc_v4CRApE9pWR63iqNYbNSbc7PX6eUi33UEvmbIuGTXNmOHciD4f-fzNh898AgQpd7lYsyCvotwJIovkuOPudjR4M-SvHTzNEtO7_sLFsnTXGk-dxfbYMtqzGjtG27KDEzAPkA/s1600/cow1_vhacd_16parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLked6sMc_v4CRApE9pWR63iqNYbNSbc7PX6eUi33UEvmbIuGTXNmOHciD4f-fzNh898AgQpd7lYsyCvotwJIovkuOPudjR4M-SvHTzNEtO7_sLFsnTXGk-dxfbYMtqzGjtG27KDEzAPkA/s1600/cow1_vhacd_16parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
16 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJXs8iOcYeG3GaeqMlxIybzMYpYLPDRcgBTlcrgIr0_gWBpszfiiqD3d5ug9VANqjtoMtOQN6r-OO1EX40JhDf2WFqgWF7Gi_snNF9lO6s2tkXuw1erxo3e15TN0gic5lHBAdTqbuBXUDh/s1600/cow1_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJXs8iOcYeG3GaeqMlxIybzMYpYLPDRcgBTlcrgIr0_gWBpszfiiqD3d5ug9VANqjtoMtOQN6r-OO1EX40JhDf2WFqgWF7Gi_snNF9lO6s2tkXuw1erxo3e15TN0gic5lHBAdTqbuBXUDh/s1600/cow1_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
19 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi59zytYWsSioEDqGSSIqgb65QKdU2x4mhuIfHFAxT4uJUnQOL0gFF09knRfObSLkAUTEFf2ZGXxJLHiENzvCrVHAYazAZcfDmrUqsGi7mfHiN0Ph1OdsEizQxQRnZWeJPywRDPvn8rfaR7/s1600/cow2_vhacd_18parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi59zytYWsSioEDqGSSIqgb65QKdU2x4mhuIfHFAxT4uJUnQOL0gFF09knRfObSLkAUTEFf2ZGXxJLHiENzvCrVHAYazAZcfDmrUqsGi7mfHiN0Ph1OdsEizQxQRnZWeJPywRDPvn8rfaR7/s1600/cow2_vhacd_18parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
18 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizAYjHNFpZ92bSfUjOR4TH8Xkpdi9UpTipcLsjBwGc9hH_s83QF0ASCLiMZSii0jPurKpgO2S1uSkGTs8tl6FGxdIwPKaMPiLRbXbX8Y5tcJjoC9hGWUKBApw5vliHhAKP9_B0iafxViPQ/s1600/cow2_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizAYjHNFpZ92bSfUjOR4TH8Xkpdi9UpTipcLsjBwGc9hH_s83QF0ASCLiMZSii0jPurKpgO2S1uSkGTs8tl6FGxdIwPKaMPiLRbXbX8Y5tcJjoC9hGWUKBApw5vliHhAKP9_B0iafxViPQ/s1600/cow2_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
22 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1wvFdmYi9CU8lTnabNzfWNut8osZtTPqgCCPkVsNX8jXSwx8kM4ACtgvdYKE1lEAzjtRI9DGFekninevgFI1pH0ecW_7h_gKO5kK4YFzRnj3e-w0NarJXsNvrZHdgglBwnu_hdkP4JV6u/s1600/cup_vhacd_34parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1wvFdmYi9CU8lTnabNzfWNut8osZtTPqgCCPkVsNX8jXSwx8kM4ACtgvdYKE1lEAzjtRI9DGFekninevgFI1pH0ecW_7h_gKO5kK4YFzRnj3e-w0NarJXsNvrZHdgglBwnu_hdkP4JV6u/s1600/cup_vhacd_34parts.png" width="177" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
34 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHUAGqF0ZCZi7AtjS5_xEFE0Il6wwIpij-f5Pe3-4j5mmP9NZOIftUr8iAbZEmwDWGzFcvq8RlZNTHQchWuAnOTr7SAy078WVG6cpS-T6iCNgasdhBEdVsd8TgbtU93LUYMZCshEfKM0RQ/s1600/cup_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHUAGqF0ZCZi7AtjS5_xEFE0Il6wwIpij-f5Pe3-4j5mmP9NZOIftUr8iAbZEmwDWGzFcvq8RlZNTHQchWuAnOTr7SAy078WVG6cpS-T6iCNgasdhBEdVsd8TgbtU93LUYMZCshEfKM0RQ/s1600/cup_hacd.png" width="178" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
17 convex-hulls</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3s61ZLQV1xTXv7HcEZSDzrJpcD6-K0_7K_4w7B8-1a6eb5wikvyRfYXLEImw_8qxRznE-yNzm6WWHDUc9Dgj0nBxGzoWwrR9GbjnIWDBU24QwNuyo6stPRlv0vhnoAocI12ZNk2eFJvZU/s1600/dancer_vhacd_18parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3s61ZLQV1xTXv7HcEZSDzrJpcD6-K0_7K_4w7B8-1a6eb5wikvyRfYXLEImw_8qxRznE-yNzm6WWHDUc9Dgj0nBxGzoWwrR9GbjnIWDBU24QwNuyo6stPRlv0vhnoAocI12ZNk2eFJvZU/s1600/dancer_vhacd_18parts.png" width="86" /></a></div>
18 convex-hulls<br />
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggLyi18lyfJXwXat8Trg2WEpivHkdfiyaviefAnPN1WTEDsSlPtubrdbEtUFx9dQpKR3h_c9xSx391BH-P6s4ULQQKIWkylgaqLzo1raN-oM766PMrpHmXAhWhAqoQ9uThtFlAgZ65bb47/s1600/dancer_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggLyi18lyfJXwXat8Trg2WEpivHkdfiyaviefAnPN1WTEDsSlPtubrdbEtUFx9dQpKR3h_c9xSx391BH-P6s4ULQQKIWkylgaqLzo1raN-oM766PMrpHmXAhWhAqoQ9uThtFlAgZ65bb47/s1600/dancer_hacd.png" width="81" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
13 convex-hulls</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuGVGiM9d_M96cwEIB6aPjK_0SSP_FFE5_wt_9aOUdYLXc11hiQ7ucXn5-473Vc7Ju6poxXglCDr8NhSZCo3QmUG81GPg54Jtx_mkuLfagC4MHzZCi4L9O9v6lCIZL1EE0EpX7tQlqI2e8/s1600/deer_vhacd_25parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="153" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuGVGiM9d_M96cwEIB6aPjK_0SSP_FFE5_wt_9aOUdYLXc11hiQ7ucXn5-473Vc7Ju6poxXglCDr8NhSZCo3QmUG81GPg54Jtx_mkuLfagC4MHzZCi4L9O9v6lCIZL1EE0EpX7tQlqI2e8/s1600/deer_vhacd_25parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
25 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3p0r6c9DAEZTX8iRpmcniN6FHQLGpoEv4m7Wf200lRt6TwpJcn06SrEQ8YeGVBpQ4E90DFRJ-A8AyNeIxwrBJQ7g7NQTPyZbBd-BHH9UoGUPApMOl7NLnkLxKHCd3E_idSn3jKK01PJBx/s1600/deer_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3p0r6c9DAEZTX8iRpmcniN6FHQLGpoEv4m7Wf200lRt6TwpJcn06SrEQ8YeGVBpQ4E90DFRJ-A8AyNeIxwrBJQ7g7NQTPyZbBd-BHH9UoGUPApMOl7NLnkLxKHCd3E_idSn3jKK01PJBx/s1600/deer_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
28 convex-hulls</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghY10YCpmVAVVgCQIjBfaOfNkJdOvC6IktPZj8g6lvZtDf2MVvb18tIM3uXeSwJWAV-3T5Eqfr9mv4N7Wlwo8FiDWXXGm9XATg-Ycx_V_XyP-3bvKlZ7SxofcdMsBTpAzepOeSIeL9hANZ/s1600/dilo_vhacd_20parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="84" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghY10YCpmVAVVgCQIjBfaOfNkJdOvC6IktPZj8g6lvZtDf2MVvb18tIM3uXeSwJWAV-3T5Eqfr9mv4N7Wlwo8FiDWXXGm9XATg-Ycx_V_XyP-3bvKlZ7SxofcdMsBTpAzepOeSIeL9hANZ/s1600/dilo_vhacd_20parts.png" width="200" /></a></div>
20 convex-hulls<br />
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYk-fw0n30Axh3BoWkZ5mZL06PmUjZrFqt5zXx7D4CpxcTNVFb3IFe8H4qcM0jKcYegFXtA8mJXq2k_0ZUItACuPjM4C577e0oZbGZ_-dzClTMmPBA9lrNOxjQrLg_O0gynd94wtWy-hID/s1600/dilo_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="83" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYk-fw0n30Axh3BoWkZ5mZL06PmUjZrFqt5zXx7D4CpxcTNVFb3IFe8H4qcM0jKcYegFXtA8mJXq2k_0ZUItACuPjM4C577e0oZbGZ_-dzClTMmPBA9lrNOxjQrLg_O0gynd94wtWy-hID/s1600/dilo_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
15 convex-hulls</div>
<br /></td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW76P4Ng4uPSN4ylMJGe74R9DUQAB2wgq-fKPhOfvGwwrajhVWgndG1f7O6VqCqJyyqMZMC8AaX7a4tYKIs238SXER6UogZ4QFoGWaBWlln2lMw-aqelTqUAwU_A60j_x0sG6nvMB6REf8/s1600/dino_vhacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW76P4Ng4uPSN4ylMJGe74R9DUQAB2wgq-fKPhOfvGwwrajhVWgndG1f7O6VqCqJyyqMZMC8AaX7a4tYKIs238SXER6UogZ4QFoGWaBWlln2lMw-aqelTqUAwU_A60j_x0sG6nvMB6REf8/s1600/dino_vhacd.png" width="190" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
22 convex-hulls</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRNjwMlQeUOXgdFGI3yxvCRXeqATXQI4wFBvFaPxOClcGcVEsFaHDFASzVTyQn8-FvowqFxrwjfd4EMWskr5KMblnTQSGMlt62DncvtSF0x2ie9_Tuji-9EVq3RxAv-yVWBQYZYHRG4Snn/s1600/dino_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRNjwMlQeUOXgdFGI3yxvCRXeqATXQI4wFBvFaPxOClcGcVEsFaHDFASzVTyQn8-FvowqFxrwjfd4EMWskr5KMblnTQSGMlt62DncvtSF0x2ie9_Tuji-9EVq3RxAv-yVWBQYZYHRG4Snn/s1600/dino_hacd.png" width="188" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
16 convex-hulls</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw6EN22xLoete3hEuWkovp_BNeE3W0mYzyjDbBQFLyUwti2Acoqz5lBOgwqXuJSgg4l_vGiV0U3_Jtj2fYloLuO0C1QBPlj7g1h2qRk56VdWAwGxuU3lUqRI3lkKKAej_smLZOpxxwdTLV/s1600/dragon_vhacd_42parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw6EN22xLoete3hEuWkovp_BNeE3W0mYzyjDbBQFLyUwti2Acoqz5lBOgwqXuJSgg4l_vGiV0U3_Jtj2fYloLuO0C1QBPlj7g1h2qRk56VdWAwGxuU3lUqRI3lkKKAej_smLZOpxxwdTLV/s1600/dragon_vhacd_42parts.png" width="149" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
42 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOcC7Y7VGhqJTHeOrQE99IKmUcBAzVLd_RC1qjeWaoB7uRotx36CPQKlDOI1Z8r4W8STDHEF3yW8uwsfAn40Y9yX7e8UFqxI4uQlS35rzM1qaNUijLHoBcN7P6NMFvcZuno5-BZIMST-f7/s1600/dragon_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOcC7Y7VGhqJTHeOrQE99IKmUcBAzVLd_RC1qjeWaoB7uRotx36CPQKlDOI1Z8r4W8STDHEF3yW8uwsfAn40Y9yX7e8UFqxI4uQlS35rzM1qaNUijLHoBcN7P6NMFvcZuno5-BZIMST-f7/s1600/dragon_hacd.png" width="153" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
42 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyoZjIRL3XnQ_vJ6GHNlVG4g3RX8RZ_VGTjsOTEnP805LgKJZcYB2c9IYBS9Le-f1y0tQI-uMULFgLYM8q0DOj0HUsBDasjw2QO8zK7PctT299dlt7XOzblYrI0skoZQCT7hTULqCHjNp-/s1600/egea_vhacd_9parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyoZjIRL3XnQ_vJ6GHNlVG4g3RX8RZ_VGTjsOTEnP805LgKJZcYB2c9IYBS9Le-f1y0tQI-uMULFgLYM8q0DOj0HUsBDasjw2QO8zK7PctT299dlt7XOzblYrI0skoZQCT7hTULqCHjNp-/s1600/egea_vhacd_9parts.png" width="195" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
9 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJhH5RlmwPtbwmcDkmdNAzLRgFYZ-OJ8i9aMTbdkmd2mQsjxmG1KbNeFXrL0b9BvS0CDBFmmyPvNZzNSMELi6Tu37miaKNIAH-W66Cx8H9WrRRJnrZ-UzOdi4VAdPOa-U_oqEhAE3-Df_2/s1600/egea_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJhH5RlmwPtbwmcDkmdNAzLRgFYZ-OJ8i9aMTbdkmd2mQsjxmG1KbNeFXrL0b9BvS0CDBFmmyPvNZzNSMELi6Tu37miaKNIAH-W66Cx8H9WrRRJnrZ-UzOdi4VAdPOa-U_oqEhAE3-Df_2/s1600/egea_hacd.png" width="190" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
7 convex-hulls</div>
<br /></td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEE7K6URXFOKu8LzVRydKug7WE5-vjadKKADp3bklBb2i8UVKduBSvU3Dzl0M6Ttv1y1N2hb5iK9fHDJmspEMlp29iKeT_kX46CmMJXlo3Xdht-Ecg9BeJjeajn-TUd7AkP695J3Dev7bu/s1600/chair_vhacd_16parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEE7K6URXFOKu8LzVRydKug7WE5-vjadKKADp3bklBb2i8UVKduBSvU3Dzl0M6Ttv1y1N2hb5iK9fHDJmspEMlp29iKeT_kX46CmMJXlo3Xdht-Ecg9BeJjeajn-TUd7AkP695J3Dev7bu/s1600/chair_vhacd_16parts.png" width="79" /></a></div>
16 convex-hulls<br />
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge-CsXkgLCSHVLloyv2ZxI9eUSEDq0ODO6lqrICGVKpYwF-HpGcm5cSQUQG337bSUJ7ntJp6ud55BsN9wiezfm-SWe8oG2BZ0RUzf_9ONZaj8rsApOWd4SwvLnUo63rPy6-XEizs03eHFm/s1600/chair_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge-CsXkgLCSHVLloyv2ZxI9eUSEDq0ODO6lqrICGVKpYwF-HpGcm5cSQUQG337bSUJ7ntJp6ud55BsN9wiezfm-SWe8oG2BZ0RUzf_9ONZaj8rsApOWd4SwvLnUo63rPy6-XEizs03eHFm/s1600/chair_hacd.png" width="80" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
15 convex-hulls</div>
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9vLFvIKAqGmD8lBGng4Ya2Bb4au6SwmtYRELlVW7D0_mgW9m4voSss6_0TNQmcMoKHgKCPEu5A20I5Am9zDfO1vu4mDeg5cYhlcDSamzGkBkTSFbkM1dxF53LninJl9cptGWnYG5FQrH5/s1600/elephant_vhacd_35parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9vLFvIKAqGmD8lBGng4Ya2Bb4au6SwmtYRELlVW7D0_mgW9m4voSss6_0TNQmcMoKHgKCPEu5A20I5Am9zDfO1vu4mDeg5cYhlcDSamzGkBkTSFbkM1dxF53LninJl9cptGWnYG5FQrH5/s1600/elephant_vhacd_35parts.png" width="200" /></a></div>
35 convex-hulls<br />
<br />
<br /></td>
<td align="center" valign="center"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9L-YIUgAWDASf4jb9KODbkFeJYQ7kAP0WRLwOXrWHBwHEUK6DtxlJlQ6T3-SQ7pDdjwDMHZRe3D41livgzMyWsbn5bsUBwG8QHg5vPK_dK8QdMqV-kJkiD6j9Ueq513JRFzDzRPr4u9CA/s1600/elephant_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9L-YIUgAWDASf4jb9KODbkFeJYQ7kAP0WRLwOXrWHBwHEUK6DtxlJlQ6T3-SQ7pDdjwDMHZRe3D41livgzMyWsbn5bsUBwG8QHg5vPK_dK8QdMqV-kJkiD6j9Ueq513JRFzDzRPr4u9CA/s1600/elephant_hacd.png" width="200" /></a><br />
37 convex-hulls<br />
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td></td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTTVVpk1wIXG2aNm72SiSS4tvn3qfs4r3gpChOASUYFjqAe9lfaiCDFBO_Q7uIYSPxeeE8gNGMMnWOmQTCIppBaSKifg8nh93CiG3n617VNgSj4fxENOvHslfzR_oe-WpK115-zEPdwiQE/s1600/elk_vhacd_17parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTTVVpk1wIXG2aNm72SiSS4tvn3qfs4r3gpChOASUYFjqAe9lfaiCDFBO_Q7uIYSPxeeE8gNGMMnWOmQTCIppBaSKifg8nh93CiG3n617VNgSj4fxENOvHslfzR_oe-WpK115-zEPdwiQE/s1600/elk_vhacd_17parts.png" width="196" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
17 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-6EcsVOee0nDK_rII1xQSBbHs2rFrSLZbutefxPXF6xiSnhCSecAlx0lQysa1J0mashD0ZIL57uePXUUSfUvTEyQHVKOtFdBBkuV2jFd5baxFv77D-l1NPsmb0y9ubB8QeUXYR_KJr8jN/s1600/elk_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-6EcsVOee0nDK_rII1xQSBbHs2rFrSLZbutefxPXF6xiSnhCSecAlx0lQysa1J0mashD0ZIL57uePXUUSfUvTEyQHVKOtFdBBkuV2jFd5baxFv77D-l1NPsmb0y9ubB8QeUXYR_KJr8jN/s1600/elk_hacd.png" width="193" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
17 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td></td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCbrBMG5VpWpMCrXIvI5MbpE-2ffEs769baMWSQQFDjsvS1tzhiF7yBPTV51D7hF5SgfSwkpbznmA89aAgVgeM_SefDgRh5DMlCa_hACnoI0fXD2amdE0VceaK0trkcxCtsvsGg8kFhPxz/s1600/horse_vhacd_18parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCbrBMG5VpWpMCrXIvI5MbpE-2ffEs769baMWSQQFDjsvS1tzhiF7yBPTV51D7hF5SgfSwkpbznmA89aAgVgeM_SefDgRh5DMlCa_hACnoI0fXD2amdE0VceaK0trkcxCtsvsGg8kFhPxz/s1600/horse_vhacd_18parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
18 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac7BdSK6CWXa4WJGad2xUKIWypVe7gOivQRrp1T-cqCuexIfJfuuZp11zKFjV7XJCulkw_5Kz6ZoTGgae2xd26TCiQ8-F0EEz6bb-CtNK65anbpWrblm-cp1LglDBMVuEa8WXH7a0YlNf/s1600/horse_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac7BdSK6CWXa4WJGad2xUKIWypVe7gOivQRrp1T-cqCuexIfJfuuZp11zKFjV7XJCulkw_5Kz6ZoTGgae2xd26TCiQ8-F0EEz6bb-CtNK65anbpWrblm-cp1LglDBMVuEa8WXH7a0YlNf/s1600/horse_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
18 convex-hulls</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPnhHq6X4N8ShYHOhehoR7523FFZgdIqu4Gn1Zjs7QDpiacHlEtHY2zB-O8U0smA2tIxvvLXoXtd2ytmsmGhxZXm7eGYZeGuCXN2bI1K3XcPvbO0_ad3CYkI_kKdc9q5rmfkqGu6ZbGg8a/s1600/feline_vhacd_36parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPnhHq6X4N8ShYHOhehoR7523FFZgdIqu4Gn1Zjs7QDpiacHlEtHY2zB-O8U0smA2tIxvvLXoXtd2ytmsmGhxZXm7eGYZeGuCXN2bI1K3XcPvbO0_ad3CYkI_kKdc9q5rmfkqGu6ZbGg8a/s1600/feline_vhacd_36parts.png" width="190" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
36 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2xun8PVkpytdztDWgUZvNJ6FUDu1h8iwZ2eP_Z5V-8kRGrweyAWkGhlkIXhKX-NCAtcirf-5kmeJwcK9L2Ob5735zkO7WNwnFefYlLfdL78I5n0rzhM0NMl7h-r10ybIX0R2V3DHO9MTo/s1600/feline_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2xun8PVkpytdztDWgUZvNJ6FUDu1h8iwZ2eP_Z5V-8kRGrweyAWkGhlkIXhKX-NCAtcirf-5kmeJwcK9L2Ob5735zkO7WNwnFefYlLfdL78I5n0rzhM0NMl7h-r10ybIX0R2V3DHO9MTo/s1600/feline_hacd.png" width="193" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
34 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7pLj6wazoCtujjx9ez5llyLDUVwF-RyRo1d_B4BLmppZfNry2dkdxTTfsoKUkc383qe563xiaXKdhC1c4oSG_vbf7szTp6o61THzzVSI3ZvklX6LQ744bh08kidOj_3VuSBIMi217zJzJ/s1600/fish_vhacd_13parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7pLj6wazoCtujjx9ez5llyLDUVwF-RyRo1d_B4BLmppZfNry2dkdxTTfsoKUkc383qe563xiaXKdhC1c4oSG_vbf7szTp6o61THzzVSI3ZvklX6LQ744bh08kidOj_3VuSBIMi217zJzJ/s1600/fish_vhacd_13parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
13 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqjTJzcAZ3kP6gmFbNQHnmG68a0TbGFr6XHXhqP9sftexi4kAUtWGFxXVGQZ0GQ5n1uQlPFVRmC8k2AGXQ82WX12jZIIRWK_irIKboGtLP3_LC9qDuRDewAUorEhQiuHu_mZb7CoR088S/s1600/fish_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqjTJzcAZ3kP6gmFbNQHnmG68a0TbGFr6XHXhqP9sftexi4kAUtWGFxXVGQZ0GQ5n1uQlPFVRmC8k2AGXQ82WX12jZIIRWK_irIKboGtLP3_LC9qDuRDewAUorEhQiuHu_mZb7CoR088S/s1600/fish_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
10 convex-hulls</div>
<br /></td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN2IbkwE_Ryl1ewwkkNK5gQQNOKNPesOo5sKrGHVbKQ4hyphenhyphenoKSLm-jPeIm25SHe6H9Kztb_liv-Eq5b4NFvY7FAihPLQ5MbsGwSFaILHyIRBlCBATmNrQGSGQqMPvX8NSXNZwmjaAKPTUKq/s1600/foot_vhacd_11parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN2IbkwE_Ryl1ewwkkNK5gQQNOKNPesOo5sKrGHVbKQ4hyphenhyphenoKSLm-jPeIm25SHe6H9Kztb_liv-Eq5b4NFvY7FAihPLQ5MbsGwSFaILHyIRBlCBATmNrQGSGQqMPvX8NSXNZwmjaAKPTUKq/s1600/foot_vhacd_11parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
11 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQrwJkITDB4LySk-VF_SGZL9sp1d3sUx1Oq48jTaHK52H5-Z4KMNFJWTITJefaeTpnZeV01hn8b3JPI28s02va6bGVlcHPHmbVammlR5y44HlWpXWuW60L-h8wvL9gcAAJaA4nTU-7EBUY/s1600/foot_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQrwJkITDB4LySk-VF_SGZL9sp1d3sUx1Oq48jTaHK52H5-Z4KMNFJWTITJefaeTpnZeV01hn8b3JPI28s02va6bGVlcHPHmbVammlR5y44HlWpXWuW60L-h8wvL9gcAAJaA4nTU-7EBUY/s1600/foot_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
5 convex-hulls</div>
<br /></td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1o0kh9HPQNA6FIPt5z354q_xn17WTYN2dUo5I_ZeV3d2lkR7H8AhvCfmm2gJpwlLMgvThmQIFR6ukMQdR3Vw0TgolhTpA7pSBYzow9Gs6gAfqtkZNzcGNND-YSACpuRyiAqwWOq4Tp4Jt/s1600/genus3_vhacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1o0kh9HPQNA6FIPt5z354q_xn17WTYN2dUo5I_ZeV3d2lkR7H8AhvCfmm2gJpwlLMgvThmQIFR6ukMQdR3Vw0TgolhTpA7pSBYzow9Gs6gAfqtkZNzcGNND-YSACpuRyiAqwWOq4Tp4Jt/s1600/genus3_vhacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
24 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKFaN5lHYG7hbHVr1rNRMD1D9z8mVl5_U6m13vN5PrLZJSPMgl3GN1bCp2n2UO7xamPsSgx1OZDkuVlQ_apQFgA_QwKxKl11hQtmD3Rxu6S0coUq7v4ko2bJhDr7Savq8cAVu-Wy77xzLE/s1600/genus3_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKFaN5lHYG7hbHVr1rNRMD1D9z8mVl5_U6m13vN5PrLZJSPMgl3GN1bCp2n2UO7xamPsSgx1OZDkuVlQ_apQFgA_QwKxKl11hQtmD3Rxu6S0coUq7v4ko2bJhDr7Savq8cAVu-Wy77xzLE/s1600/genus3_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
20 convex-hulls</div>
<br /></td>
<td style="text-align: center;">1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinShoImJA1-YYHSy6qXx5Xlyjw40msqOI8zUnFKfimnvkOuzYz5pbxa6OeGO1q5I7-Lhd9Obu-eQj_gTaS7xgQt_3COy2yoAn3n2xhWhoFudIHZ7e_5QKjrDWA0cwBqpwgkLYg2KUeHAaa/s1600/greek_sculpture_vhacd_35parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinShoImJA1-YYHSy6qXx5Xlyjw40msqOI8zUnFKfimnvkOuzYz5pbxa6OeGO1q5I7-Lhd9Obu-eQj_gTaS7xgQt_3COy2yoAn3n2xhWhoFudIHZ7e_5QKjrDWA0cwBqpwgkLYg2KUeHAaa/s1600/greek_sculpture_vhacd_35parts.png" width="75" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
35 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdBjb1Ip-BNQZAzvcnIryS9QQsBgSZbdyFw7DO_d_H2EiQAA6UsYYIIc1J3z8R_pceeQQSIS8GEN89LNQyYbGFzKNSVlgikNqynuDKqnveCb7lxD9pSwEta0Q7zbuq3VWaRBiiewy3Hlq1/s1600/greek_sculpture_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdBjb1Ip-BNQZAzvcnIryS9QQsBgSZbdyFw7DO_d_H2EiQAA6UsYYIIc1J3z8R_pceeQQSIS8GEN89LNQyYbGFzKNSVlgikNqynuDKqnveCb7lxD9pSwEta0Q7zbuq3VWaRBiiewy3Hlq1/s1600/greek_sculpture_hacd.png" width="69" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
36 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0aD91NOsNMXIINSB8LVboZWWzJBd4TItwju_DuJhW5IwiBJUmcpwhQOq__J7HKIzc5DDoYy-M7pFMfJ3YK70X8bkk2nXdsuw-40JNVdhMpkEnUeQBeAMc6Ubk41vyVwYwtd6jJrksnNIw/s1600/hand_vhacd_21parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0aD91NOsNMXIINSB8LVboZWWzJBd4TItwju_DuJhW5IwiBJUmcpwhQOq__J7HKIzc5DDoYy-M7pFMfJ3YK70X8bkk2nXdsuw-40JNVdhMpkEnUeQBeAMc6Ubk41vyVwYwtd6jJrksnNIw/s1600/hand_vhacd_21parts.png" width="123" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
21 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9YfhiUIBCsS0OeywL9_5hDnuO-uHgyIuBeiqOpRTbufh7UibZxFQY3PcoyPyRAxgGxARj42fNUhHIiYWmoR4QAf5efxVABuy_9tpI7OZiok900Wk5LTL82AoQAUCQZ9czd2wyT9htqEvC/s1600/hand_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9YfhiUIBCsS0OeywL9_5hDnuO-uHgyIuBeiqOpRTbufh7UibZxFQY3PcoyPyRAxgGxARj42fNUhHIiYWmoR4QAf5efxVABuy_9tpI7OZiok900Wk5LTL82AoQAUCQZ9czd2wyT9htqEvC/s1600/hand_hacd.png" width="122" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
13 convex-hulls</div>
<br /></td>
<td style="text-align: center;">-1</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIfCMV-iH9fu3aLmZ-YdIF4OW_k8MuPp1IrMCCfqLNr-8XSTkJMd4xyWKXZUrYiEgBBoZYeQD89iffLramRezq1SPJCy6qqwAkV6FmuuBenXd6I8KsE83rfZSkFBupJvZp-rLkoE_k_vT4/s1600/helix_vhacd_15parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="115" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIfCMV-iH9fu3aLmZ-YdIF4OW_k8MuPp1IrMCCfqLNr-8XSTkJMd4xyWKXZUrYiEgBBoZYeQD89iffLramRezq1SPJCy6qqwAkV6FmuuBenXd6I8KsE83rfZSkFBupJvZp-rLkoE_k_vT4/s1600/helix_vhacd_15parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
15 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQEovHxM-4RKsCI0h4OfEHdn7WgBOTi3sQhDwtr3NNhiKXAdxSk9uOgSlw8OCHLCaKJ6QXThew-M-Y_ys_ingOr_ygPbGHWrSezO5S1Y7kw_SWHPRQ85Ix_KOogoAhC_WalR6wEepkgVuQ/s1600/helix_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQEovHxM-4RKsCI0h4OfEHdn7WgBOTi3sQhDwtr3NNhiKXAdxSk9uOgSlw8OCHLCaKJ6QXThew-M-Y_ys_ingOr_ygPbGHWrSezO5S1Y7kw_SWHPRQ85Ix_KOogoAhC_WalR6wEepkgVuQ/s1600/helix_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
16 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-DXqUZspY55JfgUGRYWytXCLLxnSBOjaVkxE2sFHblaqQjjaVnUfxLyXtCA21ldsu3J1vLizC8xXP7AM9lH-DRF4vrCIhlXwh6_1B3JWwzS1mAj6N7RMtB56jgt0Jjh1TOIipF8EutgHW/s1600/helmet_vhacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-DXqUZspY55JfgUGRYWytXCLLxnSBOjaVkxE2sFHblaqQjjaVnUfxLyXtCA21ldsu3J1vLizC8xXP7AM9lH-DRF4vrCIhlXwh6_1B3JWwzS1mAj6N7RMtB56jgt0Jjh1TOIipF8EutgHW/s1600/helmet_vhacd.png" width="200" /></a></div>
9 convex-hulls</td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisdTehjBSbHCoQVL89oQldFb2mMwiNL6iaW3lxr2mKhPDzu2wHjmEcyx2mC5DxPF0SRmjJSsiMiLr8cnBPIzjnpupUcw9IFmzgsqQbJxgm56Buzp8I0yfByH4VYCMujzZck_ZZnh0ACQFi/s1600/helmet_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisdTehjBSbHCoQVL89oQldFb2mMwiNL6iaW3lxr2mKhPDzu2wHjmEcyx2mC5DxPF0SRmjJSsiMiLr8cnBPIzjnpupUcw9IFmzgsqQbJxgm56Buzp8I0yfByH4VYCMujzZck_ZZnh0ACQFi/s1600/helmet_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
10 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpE4MeAfNHuPJyWVOgASakfa78FyLChQsQDOlQvwxSk0D5lJQQBysHLyXeLWkQ8Gc-lmHucXVswq5ZPyuv-9WpM5B-FAcK0gEAydBf6lp4zeOKfOdpJAk6ou9G-VBw85Plvc-C3nyLUGRb/s1600/hero_vhacd_41parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpE4MeAfNHuPJyWVOgASakfa78FyLChQsQDOlQvwxSk0D5lJQQBysHLyXeLWkQ8Gc-lmHucXVswq5ZPyuv-9WpM5B-FAcK0gEAydBf6lp4zeOKfOdpJAk6ou9G-VBw85Plvc-C3nyLUGRb/s1600/hero_vhacd_41parts.png" width="154" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
41 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_8DhdcpOrKhH_wrzMlCxkG7HnflSMUlimzxuFMs98NWn3S8f3hXaRQ12BYob3bQoLS4BZSCa5NtgNiGt4lLi56tlP-guhtLjLqwb13YKXs4miPrJO816jOuTc3g0UuDBfgNpKq4lf2HDH/s1600/hero_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_8DhdcpOrKhH_wrzMlCxkG7HnflSMUlimzxuFMs98NWn3S8f3hXaRQ12BYob3bQoLS4BZSCa5NtgNiGt4lLi56tlP-guhtLjLqwb13YKXs4miPrJO816jOuTc3g0UuDBfgNpKq4lf2HDH/s1600/hero_hacd.png" width="136" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
71 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxt0pkXN5K_-jpzeHBj4tdOz5zORw5IPI2UMJYI33CMd6PrRrQIt9dnpiVBrRJeOFfGvAZ8itxfV-5IIaP3GhmfM7kf-hKcqg9tJomEwE429FB6c39XsBUOVMdQ293Eutx_NrpLkitmv6K/s1600/homer_vhacd_22parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxt0pkXN5K_-jpzeHBj4tdOz5zORw5IPI2UMJYI33CMd6PrRrQIt9dnpiVBrRJeOFfGvAZ8itxfV-5IIaP3GhmfM7kf-hKcqg9tJomEwE429FB6c39XsBUOVMdQ293Eutx_NrpLkitmv6K/s1600/homer_vhacd_22parts.png" width="118" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
22 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUVQI7eXMNajo5NUp212OOHS1M5tVCiqYO4bKqi5sq3WcqcYR0iHLdCvGd_OTXVemQz6e5el4hi9htEQEPeVyGnltPktgNg421gXAZkje5kPjhMoVxJp1Q4JrNbkKJ_6pzjJUcrk4Greb/s1600/homer_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUVQI7eXMNajo5NUp212OOHS1M5tVCiqYO4bKqi5sq3WcqcYR0iHLdCvGd_OTXVemQz6e5el4hi9htEQEPeVyGnltPktgNg421gXAZkje5kPjhMoVxJp1Q4JrNbkKJ_6pzjJUcrk4Greb/s1600/homer_hacd.png" width="118" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
27 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUa-dBEgSLfvuD_sZ-fT_SDAEDi1NcU2lBaHqXDBSc1ZscnG0KfUd9hyphenhyphenk6D7mKLxiqdxxpryPDw6JKw-iRd-GjR_br9FhYMEyCo-hE0qgn4hj5ssXI5wFyvQW7mkencuY37S521J71r8_K/s1600/hornbug_vhacd_47parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUa-dBEgSLfvuD_sZ-fT_SDAEDi1NcU2lBaHqXDBSc1ZscnG0KfUd9hyphenhyphenk6D7mKLxiqdxxpryPDw6JKw-iRd-GjR_br9FhYMEyCo-hE0qgn4hj5ssXI5wFyvQW7mkencuY37S521J71r8_K/s1600/hornbug_vhacd_47parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
47 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyLOsZU6awnSA2T-9FLNDyjvw5mmHUGWBxcJiKDPBRAKKaM8jGwj5hCwtTcADMlcC4D_V4lARJaNzoTly4XiWMgKSzNex5JlbdvJTDlWsK6aJnEpTCyIxoa1yUPA1E2d43QqJCC1SI_tYs/s1600/hornbug_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyLOsZU6awnSA2T-9FLNDyjvw5mmHUGWBxcJiKDPBRAKKaM8jGwj5hCwtTcADMlcC4D_V4lARJaNzoTly4XiWMgKSzNex5JlbdvJTDlWsK6aJnEpTCyIxoa1yUPA1E2d43QqJCC1SI_tYs/s1600/hornbug_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
51 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td> </tr>
<tr>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbWr6ulx0T0kzv-ukrfC5CMPdw1fLfNkgvW-qwr5AKAeHdc3Q1He3zRkr3ZJR8FPyQ65Sgrki0cc4WlWTowqnvTu2dEG5sMkvL2KN7vY1aG97YBe6bJHxhhU8bLcfifSjnJ_mGGuUsMqVS/s1600/horse_walk_vhacd_23parts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbWr6ulx0T0kzv-ukrfC5CMPdw1fLfNkgvW-qwr5AKAeHdc3Q1He3zRkr3ZJR8FPyQ65Sgrki0cc4WlWTowqnvTu2dEG5sMkvL2KN7vY1aG97YBe6bJHxhhU8bLcfifSjnJ_mGGuUsMqVS/s1600/horse_walk_vhacd_23parts.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
23 convex-hulls</div>
<br /></td>
<td align="center" valign="center"><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioFMYr6tWSj3NOZY0e7WqZZnlFKd2d_PwL71_96ZgcycIBQX_r_ophlxZoe8mS79yec86q1KH7nhdCB48I-2tZarOuRORwlQoNoWHSJiDywdvgrbwSCd7DgdcIiT1kigjV6EgadzsRkNKh/s1600/horse_walk_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioFMYr6tWSj3NOZY0e7WqZZnlFKd2d_PwL71_96ZgcycIBQX_r_ophlxZoe8mS79yec86q1KH7nhdCB48I-2tZarOuRORwlQoNoWHSJiDywdvgrbwSCd7DgdcIiT1kigjV6EgadzsRkNKh/s1600/horse_walk_hacd.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
28 convex-hulls</div>
<br /></td>
<td style="text-align: center;">0</td>
</tr>
</tbody></table>
</div>
<br /></div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com3tag:blogger.com,1999:blog-4981335297800913708.post-84913714549980071082014-12-06T05:38:00.001-08:002014-12-11T15:01:05.543-08:00Using the V-HACD library in your project<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUvpwJd8bMxFTAQYQw_bSE9slg8rQ10gYERzykMI7bbmmDMH9QFo0X24ZilDILZAMVGwy06B7zxJ3_NC6FpiVZR3locXtjLHWaCAQkSj_XL9k2-_PKaJm8Bhg9UK2jzS4AqMIto3P2pkdK/s1600/dragon_vhacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUvpwJd8bMxFTAQYQw_bSE9slg8rQ10gYERzykMI7bbmmDMH9QFo0X24ZilDILZAMVGwy06B7zxJ3_NC6FpiVZR3locXtjLHWaCAQkSj_XL9k2-_PKaJm8Bhg9UK2jzS4AqMIto3P2pkdK/s1600/dragon_vhacd.png" height="320" width="232" /></a></div>
<br />
<!-- HTML generated using hilite.me -->I have lately worked on re-factoring the V-HACD code to make it easier to integrate. An example of code using V-HACD would look like this.<br />
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include <stdio.h></span>
<span style="color: #557799;">#include "VHACD.h"</span>
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span> <span style="color: #333333;">*</span> argv[])
{
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #333333;">*</span> triangles; <span style="color: #888888;">// array of indexes</span>
<span style="color: #333399; font-weight: bold;">float</span> <span style="color: #333333;">*</span> points; <span style="color: #888888;">// array of coordinates </span>
...
<span style="color: #888888;">// load the mesh </span>
...
IVHACD<span style="color: #333333;">::</span>Parameters params; <span style="color: #888888;">// V-HACD parameters</span>
IVHACD <span style="color: #333333;">*</span> interfaceVHACD <span style="color: #333333;">=</span> CreateVHACD(); <span style="color: #888888;">// create interface</span>
<span style="color: #888888;">// compute approximate convex decomposition</span>
<span style="color: #333399; font-weight: bold;">bool</span> res <span style="color: #333333;">=</span> interfaceVHACD<span style="color: #333333;">-></span>Compute(points, <span style="color: #0000dd; font-weight: bold;">3</span>, nPoints, triangles, <span style="color: #0000dd; font-weight: bold;">3</span>, nTriangles, params);
<span style="color: #888888;">// read results</span>
<span style="color: #333399; font-weight: bold;">unsigned</span> <span style="color: #333399; font-weight: bold;">int</span> nConvexHulls <span style="color: #333333;">=</span> interfaceVHACD<span style="color: #333333;">-></span>GetNConvexHulls(); <span style="color: #888888;">// Get the number of convex-hulls</span>
IVHACD<span style="color: #333333;">::</span>ConvexHull ch;
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #333399; font-weight: bold;">unsigned</span> <span style="color: #333399; font-weight: bold;">int</span> p <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span>; p <span style="color: #333333;"><</span> nConvexHulls; <span style="color: #333333;">++</span>p)
{
interfaceVHACD<span style="color: #333333;">-></span>GetConvexHull(p, ch); <span style="color: #888888;">// get the p-th convex-hull information</span>
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #333399; font-weight: bold;">unsigned</span> <span style="color: #333399; font-weight: bold;">int</span> v <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span>, idx <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span>; v <span style="color: #333333;"><</span> ch.m_nPoints; <span style="color: #333333;">++</span>v, idx<span style="color: #333333;">+=</span><span style="color: #0000dd; font-weight: bold;">3</span>)
{
printf(<span style="background-color: #fff0f0;">"x=%f, y=%f, z=%f"</span>, ch.m_points[idx], ch.m_points[idx<span style="color: #333333;">+</span><span style="color: #0000dd; font-weight: bold;">1</span>], ch.m_points[idx<span style="color: #333333;">+</span><span style="color: #0000dd; font-weight: bold;">2</span>])
}
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #333399; font-weight: bold;">unsigned</span> <span style="color: #333399; font-weight: bold;">int</span> t <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span>, idx <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span>; t <span style="color: #333333;"><</span> ch.m_nTriangles; <span style="color: #333333;">++</span>t, idx <span style="color: #333333;">+=</span><span style="color: #0000dd; font-weight: bold;">3</span>)
{
printf(<span style="background-color: #fff0f0;">"i=%f, j=%f, k=%f"</span>, ch.m_triangles[idx], ch.m_triangles[idx<span style="color: #333333;">+</span><span style="color: #0000dd; font-weight: bold;">1</span>], ch.m_triangles[idx<span style="color: #333333;">+</span><span style="color: #0000dd; font-weight: bold;">2</span>])
}
}
<span style="color: #888888;">// release memory</span>
interfaceVHACD<span style="color: #333333;">-></span>Clean();
interfaceVHACD<span style="color: #333333;">-></span>Release();
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</td></tr>
</tbody></table>
</div>
<br />
All the magic happens at line <b>14</b> where the IVHACD::Compute() function is called. In order to cancel the decomposition process, the function IVHACD::Cancel() could be called from any other thread.<br />
<br />
V-HACD offers the user the possibility to track progress and get access to logging information. The only thing the user needs to do is to provide his implementation of the two abstract classes IUserCallback and IUserLogger.<br />
<br />
Below, an example of implementation of IUserCallback.<br />
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">MyCallback</span> <span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">public</span> IVHACD<span style="color: #333333;">::</span>IUserCallback
{
<span style="color: #997700; font-weight: bold;">public:</span>
MyCallback(<span style="color: #333399; font-weight: bold;">void</span>) {}
<span style="color: #333333;">~</span>MyCallback() {};
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">Update</span>(<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #333399; font-weight: bold;">double</span> overallProgress,
<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #333399; font-weight: bold;">double</span> stageProgress,
<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #333399; font-weight: bold;">double</span> operationProgress,
<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #333399; font-weight: bold;">char</span> <span style="color: #333333;">*</span> <span style="color: #008800; font-weight: bold;">const</span> stage,
<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #333399; font-weight: bold;">char</span> <span style="color: #333333;">*</span> <span style="color: #008800; font-weight: bold;">const</span> operation)
{
cout <span style="color: #333333;"><<</span> setfill(<span style="color: #0044dd;">' '</span>) <span style="color: #333333;"><<</span> setw(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #333333;"><<</span> (<span style="color: #333399; font-weight: bold;">int</span>)(overallProgress <span style="color: #333333;">+</span><span style="color: #6600ee; font-weight: bold;">0.5</span>) <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"% "</span>
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"[ "</span> <span style="color: #333333;"><<</span> stage <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" "</span> <span style="color: #333333;"><<</span> setfill(<span style="color: #0044dd;">' '</span>) <span style="color: #333333;"><<</span> setw(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #333333;"><<</span> (<span style="color: #333399; font-weight: bold;">int</span>)(stageProgress <span style="color: #333333;">+</span><span style="color: #6600ee; font-weight: bold;">0.5</span>) <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"% ] "</span>
<span style="color: #333333;"><<</span> operation <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" "</span> <span style="color: #333333;"><<</span> setfill(<span style="color: #0044dd;">' '</span>) <span style="color: #333333;"><<</span> setw(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #333333;"><<</span> (<span style="color: #333399; font-weight: bold;">int</span>)(operationProgress<span style="color: #333333;">+</span><span style="color: #6600ee; font-weight: bold;">0.5</span>) <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"%"</span> <span style="color: #333333;"><<</span> endl;
};
};
</pre>
</td></tr>
</tbody></table>
</div>
<br />
The Update() callback is called regularly during the decomposition process to report:<br />
<ul style="text-align: left;">
<li>The overall progress,</li>
<li>The progress of the current stage, and</li>
<li>The progress of the current operation.</li>
</ul>
Notice that the progress is always reported as a percentage. The decomposition process is composed of a set of stages, which are composed of operations.<br />
<br />
An example of implementation of IUserLogger may look as follows.<br />
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">MyLogger</span> <span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">public</span> IVHACD<span style="color: #333333;">::</span>IUserLogger
{
<span style="color: #997700; font-weight: bold;">public:</span>
MyLogger(<span style="color: #333399; font-weight: bold;">void</span>){}
MyLogger(<span style="color: #008800; font-weight: bold;">const</span> string <span style="color: #333333;">&</span> fileName){ OpenFile(fileName); }
<span style="color: #333333;">~</span>MyLogger() {};
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">Log</span>(<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #333399; font-weight: bold;">char</span> <span style="color: #333333;">*</span> <span style="color: #008800; font-weight: bold;">const</span> msg)
{
<span style="color: #008800; font-weight: bold;">if</span> (m_file.is_open())
{
m_file <span style="color: #333333;"><<</span> msg;
m_file.flush();
}
};
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">OpenFile</span>(<span style="color: #008800; font-weight: bold;">const</span> string <span style="color: #333333;">&</span> fileName) { m_file.open(fileName.c_str()); }
<span style="color: #997700; font-weight: bold;">private:</span>
ofstream m_file;
};
</pre>
</td></tr>
</tbody></table>
</div>
<br />
<span style="color: #bb0066; font-weight: bold; line-height: 16.25px;">MyCallback </span>and <span style="color: #bb0066; font-weight: bold; line-height: 16.25px;">MyLogger </span>are hooked to the IVHACD object by updating encode parameters as follows<span style="line-height: 16.25px;">.</span><br />
<span style="line-height: 16.25px;"><br /></span>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10</pre>
</td><td><pre style="line-height: 125%; margin: 0;">IVHACD<span style="color: #333333;">::</span>Parameters params; <span style="color: #888888;">// V-HACD parameters</span>
IVHACD <span style="color: #333333;">*</span> interfaceVHACD <span style="color: #333333;">=</span> CreateVHACD(); <span style="color: #888888;">// create interface</span>
MyCallback myCallback;
MyLogger <span style="color: #0066bb; font-weight: bold;">myLogger</span>(fileNameLog);
params.m_logger <span style="color: #333333;">=</span> <span style="color: #333333;">&</span>myLogger;
params.m_callback <span style="color: #333333;">=</span> <span style="color: #333333;">&</span>myCallback;
<span style="color: #888888;">// compute approximate convex decomposition</span>
<span style="color: #333399; font-weight: bold;">bool</span> res <span style="color: #333333;">=</span> interfaceVHACD<span style="color: #333333;">-></span>Compute(points, <span style="color: #0000dd; font-weight: bold;">3</span>, nPoints, triangles, <span style="color: #0000dd; font-weight: bold;">3</span>, nTriangles, params); </pre>
</td></tr>
</tbody></table>
</div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-87480134702831888282014-11-11T23:15:00.001-08:002016-01-24T14:26:46.200-08:00V-HACD V2.0 is here!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVsFXKJ_nAgDhpXy9Bjjrw_wVl1oLY4mjlRU-PyvCuz-D0wHeVnLREeQ0CGtwjSXEBvZ-dsLTBHip-42B9DChkgtN1y_WANsZdAv7MjugntHdHse60aQOR8vgUJoDy_mgknOI1GbU-HfTo/s1600/V-HACD_V1.0vsV2.0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVsFXKJ_nAgDhpXy9Bjjrw_wVl1oLY4mjlRU-PyvCuz-D0wHeVnLREeQ0CGtwjSXEBvZ-dsLTBHip-42B9DChkgtN1y_WANsZdAv7MjugntHdHse60aQOR8vgUJoDy_mgknOI1GbU-HfTo/s400/V-HACD_V1.0vsV2.0.png" width="400" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
V-HACD V2.0 is here and it kicks ass. It works with any
triangular mesh (i.e., open or closed, manifold or not, oriented or not...) and it
gives cleaner and more consistent results than V-HACD 1.0 and HACD.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The source code is available here <a href="https://github.com/kmammou/v-hacd">https://github.com/kmammou/v-hacd</a><br />
<br />
You can also download binaries:<br />
<ul style="text-align: left;">
<li><a href="https://code.google.com/p/v-hacd/source/browse/bin/win32/testVHACD.exe">win32</a></li>
<li><a href="https://code.google.com/p/v-hacd/source/browse/bin/win64/testVHACD.exe">win64</a></li>
<li><a href="https://code.google.com/p/v-hacd/source/browse/bin/ubuntu/testVHACD">ubuntu</a></li>
<li><a href="https://code.google.com/p/v-hacd/source/browse/bin/osx10.10.1/testVHACD">osx</a></li>
</ul>
<div class="MsoNormal">
Example of command line (lower quality but faster):</div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">testVHACD.exe input.obj 100000 20 0.0025 4 4 0.05 0.05 0.00125 0 0 64 0.0 output.wrl </span><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">log.txt</span><br />
<br />
Example of command line (high quality but slow):</div>
<div class="MsoNormal">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">testVHACD.exe input.obj 80</span><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">00000 20 0.0025 4 4 0.05 0.05 0.00125 0 0 64</span><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> 0.0 output.wrl </span><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">log.txt</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Below some convex decomposition results generated with V-HACD 2.0.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFqFY6uPrgjlyX463zSX7-8v_h_wuAP1h7w5ASdTEVRzLLTR_gulBvEXWA2J-TF63w5uAT5bRDgU26tv2xbAKB9xO9ZauvsC90ULIC-gE44Y1SlV_UHp3Li7r-5ZM1tOiHyL_Z_KaUblZW/s1600/snapshots_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFqFY6uPrgjlyX463zSX7-8v_h_wuAP1h7w5ASdTEVRzLLTR_gulBvEXWA2J-TF63w5uAT5bRDgU26tv2xbAKB9xO9ZauvsC90ULIC-gE44Y1SlV_UHp3Li7r-5ZM1tOiHyL_Z_KaUblZW/s400/snapshots_1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dv3g-lTZaSJIsaq78dh1oyR0SgD3ncPZS0yZPWNYAKBGkO50HpEjUJvjRCG-NUqJMJwpvda1xq4QiPPrWdNuYnpXtn05Ukl63IuerHLsy-1kywguAUAMjMlk6CxfjXlWMEYXvd4Cvhyv/s1600/snapshots_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dv3g-lTZaSJIsaq78dh1oyR0SgD3ncPZS0yZPWNYAKBGkO50HpEjUJvjRCG-NUqJMJwpvda1xq4QiPPrWdNuYnpXtn05Ukl63IuerHLsy-1kywguAUAMjMlk6CxfjXlWMEYXvd4Cvhyv/s400/snapshots_2.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQZJJPSa-e7N35yBOnRFTSWHcOtSyB4yhrEwfvItxsmGYBiPgEpxjlDG_O1wu-Q1-zfWzyIRIod-M7ijHDR8Vunue0AEzz_kuqwypjWcyCCuw9xzj1wK9IXg2mLAsj5IWnDCa3yjswM2MM/s1600/snapshots_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQZJJPSa-e7N35yBOnRFTSWHcOtSyB4yhrEwfvItxsmGYBiPgEpxjlDG_O1wu-Q1-zfWzyIRIod-M7ijHDR8Vunue0AEzz_kuqwypjWcyCCuw9xzj1wK9IXg2mLAsj5IWnDCa3yjswM2MM/s400/snapshots_3.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcB9RpELMqZN93rHWZ9D-urcM554icP2cssloPhuJVxsTSwybbF91kCCUpSo4c10qDKQ_RUH7Lt6IaRJy5SsX6eGun7U4edt3TUBUxyD-jXp6QC5-Ac6T1kurrit5xXFa8tv8D0JsTSZni/s1600/snapshots_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcB9RpELMqZN93rHWZ9D-urcM554icP2cssloPhuJVxsTSwybbF91kCCUpSo4c10qDKQ_RUH7Lt6IaRJy5SsX6eGun7U4edt3TUBUxyD-jXp6QC5-Ac6T1kurrit5xXFa8tv8D0JsTSZni/s400/snapshots_4.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Y4sG-fmhlbUDvXDvIX4hIjq02RfZh1EV840a30dsWxW0U-rN06uc-_ipWtDBEXxxS60D2JZeh6Mc21KbOs78rsDz-I37ZUTv1njUJWFZAY4K5evnY3yX-NtoOUk-K4SCDaEyl18W6VcR/s1600/snapshots_5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Y4sG-fmhlbUDvXDvIX4hIjq02RfZh1EV840a30dsWxW0U-rN06uc-_ipWtDBEXxxS60D2JZeh6Mc21KbOs78rsDz-I37ZUTv1njUJWFZAY4K5evnY3yX-NtoOUk-K4SCDaEyl18W6VcR/s400/snapshots_5.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com16tag:blogger.com,1999:blog-4981335297800913708.post-37999527037013560992013-11-23T15:42:00.003-08:002013-11-23T15:45:41.493-08:00EFFICIENT 3D WEB CONTENT DELIVERY WITH KHRONOS AND MPEG TECHNOLOGIES<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.slideshare.net/KhaledMAMOU/wt-4151khaledmammou131121160422phpapp01" target="_blank"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9CnsPkeu71bL1o0NDX3Hp2e-nBvnNA7BwqXSsRjbT4YLbP0PvaZBIDEGnM87CW1t8WLunaBOhaE62vVKtl_2XM19swkMDag29YwH9HQWNUCNGpZgoaKHcYb5jKzcIbdWa_4w8Ui7CLYcX/s400/glTFViewer.png" width="363" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.slideshare.net/KhaledMAMOU/wt-4151khaledmammou131121160422phpapp01" target="_blank">glTF Viewer leveraging Open3DGC compression</a></div>
<br /></div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-66969522750594394752013-11-23T15:38:00.000-08:002013-11-23T15:39:22.582-08:00AMD VIDEO CODING ENGINE: THE ROUTE TOWARDS LOW-LATENCY CLOUD GAMING SOLUTIONS<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://www.slideshare.net/KhaledMAMOU/mm-4094khaledmammou131121095436phpapp01"></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.slideshare.net/KhaledMAMOU/mm-4094khaledmammou131121095436phpapp01"><img border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhrWpVH4xwxx1lKny_TcJt9mxNJzTp_oMwGPpcY5PpTQwwINM1VyGM9aMh00lrRneWbuHYaC4Gy_MOplv-zrUubqwpdyyqZpEkoSxACI6rBEIZ4cPeVfxxXfSYCoIH6XjVUsU0bfch2EXW/s400/VCE.png" width="400" /></a></div>
<a href="http://www.slideshare.net/KhaledMAMOU/mm-4094khaledmammou131121095436phpapp01"><br /></a></div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-88251943507663612122013-10-08T20:23:00.001-07:002013-10-08T20:23:22.786-07:00Selecting O3DGC Encoding Parameters<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
<br /></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-table-layout-alt: fixed; mso-yfti-tbllook: 1184; width: 491px;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.4pt;" valign="top" width="85">
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Attribute type<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.45pt;" valign="top" width="170">
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-size: 8.0pt;">Quantization<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 177.3pt;" valign="top" width="236">
<div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-size: 8.0pt;">Prediction mode<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.4pt;" valign="top" width="85">
<div class="MsoNormal">
<span lang="FR-BE" style="font-family: Consolas; font-size: 8.0pt; mso-ansi-language: FR-BE;">POSITION<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.45pt;" valign="top" width="170">
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Excellent quality: 13<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Good quality: 12<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Aggressive compression: 10<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 177.3pt;" valign="top" width="236">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">O3DGC_SC3DMC_PARALLELOGRAM_PREDICTION<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.4pt;" valign="top" width="85">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">TEXCOORD<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.45pt;" valign="top" width="170">
<div class="MsoNormal">
<span style="font-size: 8.0pt;">10 (for 1024x1024) texture images<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">9 (for 512x512) texture images<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">8 (for 256x256) texture images<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">N (for 2^Nx2^N) texture
images<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 177.3pt;" valign="top" width="236">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">O3DGC_SC3DMC_PARALLELOGRAM_PREDICTION<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.4pt;" valign="top" width="85">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">NORMAL<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.45pt;" valign="top" width="170">
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Excellent quality: 10<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Good quality: 8<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Aggressive compression: 6<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 177.3pt;" valign="top" width="236">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">O3DGC_SC3DMC_SURF_NORMALS_PREDICTION
if the normals magnitudes are not relevant<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">O3DGC_SC3DMC_PARALLELOGRAM_PREDICTION
to preserve the normals magnitudes<o:p></o:p></span></div>
<div class="MsoNormal" style="text-indent: 36.0pt;">
<br /></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.4pt;" valign="top" width="85">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">COLOR<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.45pt;" valign="top" width="170">
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Excellent quality: 10<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Good quality: 8<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">Aggressive compression: 6<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 177.3pt;" valign="top" width="236">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">O3DGC_SC3DMC_DIFFERENTIAL_PREDICTION<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.4pt;" valign="top" width="85">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">WEIGHT<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.45pt;" valign="top" width="170">
<div class="MsoNormal">
<span style="font-size: 8.0pt;">No idea yet. I need to test
with real data.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 8.0pt;">I would say between 8-12<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 177.3pt;" valign="top" width="236">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">O3DGC_SC3DMC_PARALLELOGRAM_PREDICTION<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.4pt;" valign="top" width="85">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">JOINT_ID<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.45pt;" valign="top" width="170">
<div class="MsoNormal">
<span style="font-size: 8.0pt;">No quantization<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 177.3pt;" valign="top" width="236">
<div class="MsoNormal">
<span style="font-family: Consolas; font-size: 8.0pt;">O3DGC_SC3DMC_DIFFERENTIAL_PREDICTION<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Computational complexity of prediction modes:</div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span style="font-family: Consolas;">O3DGC_SC3DMC_PARALLELOGRAM_PREDICTION
(+++)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<!--[if !supportLists]--><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span style="font-family: Consolas;">O3DGC_SC3DMC_SURF_NORMALS_PREDICTION
(+++)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-autospace: none; text-indent: -18.0pt;">
<!--[if !supportLists]--><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span style="font-family: Consolas;">O3DGC_SC3DMC_DIFFERENTIAL_PREDICTION
(++)<o:p></o:p></span></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-autospace: none; text-indent: -18.0pt;">
<!--[if !supportLists]--><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;">·<span style="font-family: 'Times New Roman'; font-size: 7pt;">
</span></span><!--[endif]--><span style="font-family: Consolas;">O3DGC_SC3DMC_NO_PREDICTION
(+)<o:p></o:p></span></div>
<div class="MsoNormal">
</div>
<div class="MsoListParagraphCxSpLast">
<br /></div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-42156078836458288462013-08-01T21:59:00.004-07:002013-08-04T16:16:47.331-07:00[Open3DGC] Examples of encoded streams<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-size: large;">Encoded Models</span><br />
<div>
<ul style="text-align: left;">
<li><a href="http://graphics.stanford.edu/data/3Dscanrep/#bunny" target="_blank">Bunny</a></li>
<li><a href="http://graphics.stanford.edu/projects/faxing/happy/" target="_blank">Buddha</a></li>
<li><a href="http://www.sci.utah.edu/~wald/animrep/" target="_blank">Ben</a></li>
<li><a href="http://graphics.stanford.edu/data/3Dscanrep/" target="_blank">Dragon</a></li>
</ul>
<div>
Original, encoded and decoded streams are available <a href="https://github.com/kmammou/rest3d/tree/master/server/o3dgc/examples" target="_blank">here</a> </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxtwUI6dMk0icvjyeJ2Uk0QotEXA1XPjE68dgGsYnWsRtJV1Hz5s63HRjpMM6mLHtTgwn5uLKlFpeWBjS86K436Bq48cX0msx3R-uDbZEgOMCD7PpuVulNQt15gyfAEqrjaukD_SkANY-_/s1600/examples.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxtwUI6dMk0icvjyeJ2Uk0QotEXA1XPjE68dgGsYnWsRtJV1Hz5s63HRjpMM6mLHtTgwn5uLKlFpeWBjS86K436Bq48cX0msx3R-uDbZEgOMCD7PpuVulNQt15gyfAEqrjaukD_SkANY-_/s320/examples.png" width="320" /></a></div>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<span style="font-size: large;">Compression Results</span><br />
<ul style="text-align: left;">
<li>14 bits quantization for positions</li>
<li>10 bits quantization for normals and texture coordinates</li>
</ul>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5WlgTjZ98_FIPkP_7ymApPqygBhayBs8GRJwO1XQ48aLh_lg-uYoX39z707K0-eaZLxBNHeXIp0wUniWzIj6JHVLXMDivAHUgb11mk7rxoNxQitvYQg9Pp6WaplVCagDIGqSoD0rvRZll/s1600/res_examples.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5WlgTjZ98_FIPkP_7ymApPqygBhayBs8GRJwO1XQ48aLh_lg-uYoX39z707K0-eaZLxBNHeXIp0wUniWzIj6JHVLXMDivAHUgb11mk7rxoNxQitvYQg9Pp6WaplVCagDIGqSoD0rvRZll/s320/res_examples.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><br /></span></div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-62647085799691224782013-08-01T17:47:00.006-07:002013-08-04T16:17:00.828-07:00Open3DGC (more results!)<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div>
<span style="font-size: large;">Encoders</span></div>
<div>
<ul style="text-align: left;">
<li><a href="https://github.com/amd/rest3d/tree/master/server/o3dgc" target="_blank">Open3DGC</a>-Bin: binary version of Open3DGC (14 bits quantization)</li>
<li><a href="https://github.com/amd/rest3d/tree/master/server/o3dgc" target="_blank">Open3DGC</a>-ASCII: ascii version of Open3DGC (14 bits quantization)</li>
<li><a href="https://code.google.com/p/webgl-loader/wiki/BenCompressionStats" target="_blank">webgl-loader</a>: the optimized version obj2utf8x (14 bits quantization)</li>
<li><a href="http://www.gzip.org/" target="_blank">GZip</a> (default): level=6</li>
<li><a href="http://www.gzip.org/" target="_blank">GZip</a> (best): level=9</li>
<li><a href="http://www.7-zip.org/" target="_blank">7zip</a> (best): level=9</li>
</ul>
<div>
<span style="font-size: large;">Test dataset</span></div>
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3gxMFbld8fD7fBf4RX-AxS7ApVB88rFM5qTn1Rotfnr2LesImYX50MPz49XtqmpRxRFRYedFUuu3_3jz-OUCIwuD_A1Pnsn4Twq_jnnJzX53sdpzr0qj-SedwpCLTmYRSO7E70mEEjNNg/s1600/testDataSet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3gxMFbld8fD7fBf4RX-AxS7ApVB88rFM5qTn1Rotfnr2LesImYX50MPz49XtqmpRxRFRYedFUuu3_3jz-OUCIwuD_A1Pnsn4Twq_jnnJzX53sdpzr0qj-SedwpCLTmYRSO7E70mEEjNNg/s400/testDataSet.png" width="400" /></a></div>
<span style="font-size: large;">Results</span><span style="font-size: large;"><span id="goog_556060142"></span><span id="goog_556060143"></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCzxGJjyrRJD_cn3kts78X8PLMczKCBtB9bruIP60MuOhS_MFOuYXFs305ffv-TNlcsJ7s9GitBlvsKLyZUOA_hGV-iQCyJwuEBHhDHl4y6nGHRRzRBc6l3ps4aDY-VDUPWkr-HYUUwgKx/s1600/res.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCzxGJjyrRJD_cn3kts78X8PLMczKCBtB9bruIP60MuOhS_MFOuYXFs305ffv-TNlcsJ7s9GitBlvsKLyZUOA_hGV-iQCyJwuEBHhDHl4y6nGHRRzRBc6l3ps4aDY-VDUPWkr-HYUUwgKx/s400/res.png" width="400" /></a></div>
<br /></div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-79424417893664753802013-07-31T22:37:00.000-07:002013-07-31T22:37:08.336-07:00Open3DGC (updated results)<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
<span style="font-size: 13.5pt;">In a <a href="http://kmamou.blogspot.ca/2013/07/open-3d-graphics-compression-open3dgc.html" target="_blank">previous</a> post, I reported experimental results comparing the compression efficiency of <a href="https://github.com/amd/rest3d/tree/master/server/o3dgc" target="_blank">Open3DGC</a>
to <a href="https://code.google.com/p/webgl-loader/" target="_blank">webgl-loader</a> and <a href="http://openctm.sourceforge.net/?page=development" target="_blank">OpenCTM</a>. In this post, I am providing an updated version,
which takes into account:</span></div>
<div class="MsoNormal">
</div>
<ul style="text-align: left;">
<li><span style="font-size: 13.5pt;">The "evaluation version" </span><a href="https://code.google.com/p/webgl-loader/wiki/BenCompressionStats" style="font-size: 13.5pt;" target="_blank">obj2utf8x</a><span style="font-size: 13.5pt;"> of
webgl-loader, which provides better compression performances than the obj2utf8 encoder, and</span></li>
<li><span style="font-size: 13.5pt;">The latest Open3DGC version (slightly better compression).</span></li>
</ul>
<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimo6elhEHFdmD65SygeBdlrbC61pT1w2fOIiWPv09va-Lt5ec-MPOfnRNuC4MG3vWiVmxZ5ejqWxJJOsHfsx08AWmnp9GWvDoEqgG4Cp77HFwlvqfPFSnHyZHV_Hp0RPL-z0oe1p0hOHga/s1600/stats.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimo6elhEHFdmD65SygeBdlrbC61pT1w2fOIiWPv09va-Lt5ec-MPOfnRNuC4MG3vWiVmxZ5ejqWxJJOsHfsx08AWmnp9GWvDoEqgG4Cp77HFwlvqfPFSnHyZHV_Hp0RPL-z0oe1p0hOHga/s320/stats.png" width="320" /></a></div>
<div>
<br /><div>
</div>
</div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-18840617089243265932013-07-27T22:06:00.000-07:002013-07-27T22:06:14.538-07:00Open3DGC at "COLLADA/glTF" BoF (Siggraph 2013)<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
Open3DGC was demoed at "COLLADA/glTF" BoF (Siggraph
2013). Check out these two presentations:</div>
<div class="MsoNormal">
</div>
<ul style="text-align: left;">
<li><a href="http://www.slideshare.net/KhaledMAMOU/gl-tf-siggraph2013" target="_blank">Graphics Library Transmission Format</a> (<a href="https://github.com/fabrobinet" target="_blank">Fabrice Robinet</a>)</li>
<li><a href="http://www.slideshare.net/remi_arnaud/rest3d-bofsiggraph2013" target="_blank">Rest3D</a> (<a href="http://www.slideshare.net/remi_arnaud" target="_blank">Remi Arnaud</a>)</li>
</ul>
<br />
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-83545592095635462312013-07-24T17:07:00.000-07:002013-07-27T20:29:32.705-07:00Open3DGC (Open 3D Graphics Compression) <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
<span style="font-family: Arial, Helvetica, sans-serif;">I am glad to introduce the </span><a href="https://github.com/amd/rest3d/tree/master/server/o3dgc" style="font-family: Arial, Helvetica, sans-serif;" target="_blank">Open3DGC</a><span style="font-family: Arial, Helvetica, sans-serif;"> (</span><span style="font-family: Arial, Helvetica, sans-serif;">Open 3D Graphics Compression</span><span style="font-family: Arial, Helvetica, sans-serif;">) library!</span></div>
<div class="MsoNormal">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Arial, Helvetica, sans-serif;">Open3DGC aims at providing a cross platform C++ implementation (under MIT License) of patent free MPEG tools for 3D graphics compression.</span></div>
<div class="MsoNormal">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Arial, Helvetica, sans-serif;">The current Open3DGC version provides an implementation of
the <a href="http://www.slideshare.net/MariusPreda/basics-of-mpeg-4-3d-graphics-compression" target="_blank">MPEG-SC3DMC</a> codec (Scalable Complexity 3D Mesh Compression). SC3DMC offers an efficient low complexity solution to compress arbitrary
triangular 3D meshes with attributes (e.g., normals, texture coordinate, skinning
animation weights, bone IDs..).</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">A detailed description of the compression algorithm is available <a href="http://khaledmammou.com/AllPublications/casa2009.pdf" target="_blank">here</a></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Arial, Helvetica, sans-serif;">Open3DGC supports two output stream types:</span><br />
<ul style="text-align: left;">
<li><span style="font-family: Arial, Helvetica, sans-serif;">Binary streams: compressed using arithmetic encoding</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">ASCII (7-bits) streams: adapted for server-side gzip compression and java-script client side decoding</span></li>
</ul>
<br />
<span style="font-family: Arial, Helvetica, sans-serif; font-size: large;">Compression Efficiency</span></div>
<div class="MsoNormal">
</div>
<div style="text-align: center;">
<b style="text-indent: -18pt;"><span style="text-indent: 0px;"><b style="text-indent: -18pt;"><span style="text-indent: 0px;"><br /></span></b></span></b>
<b style="text-indent: -18pt;"><span style="text-indent: 0px;"><b style="text-indent: -18pt;"><span style="text-indent: 0px;"><span style="color: #990000; font-family: Arial, Helvetica, sans-serif;"><a href="https://github.com/amd/rest3d" target="_blank">Open3DGC</a> is 7.8 times more efficient than Gzip and </span></span></b></span></b></div>
<span style="font-family: Arial, Helvetica, sans-serif;"><b style="text-indent: -18pt;"><span style="text-indent: 0px;">
</span></b>
</span><br />
<div style="text-align: center;">
<b style="text-indent: -18pt;"><span style="text-indent: 0px;"><b style="text-indent: -18pt;"><span style="text-indent: 0px;"><span style="color: #990000; font-family: Arial, Helvetica, sans-serif;">1.7-2.0 times more efficient than <a href="https://code.google.com/p/webgl-loader/" target="_blank">Webgl-loader</a> and <a href="http://openctm.sourceforge.net/?page=development" target="_blank">OpenCTM</a></span></span></b></span></b></div>
<b style="text-indent: -18pt;"><span style="font-family: Arial, Helvetica, sans-serif; text-indent: 0px;">
</span></b>
<br />
<ul style="text-align: left;">
<li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="text-indent: -18pt;">Test dataset: 160 models with v</span><span style="text-indent: -18pt;">arious shapes and topologies (i.e., open/closed, manifold/non-manifold, arbitrary genus)</span></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Codecs: </span></li>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://code.google.com/p/webgl-loader/" style="text-indent: -18pt;">WebGL</a><a href="https://code.google.com/p/webgl-loader/" style="text-indent: -18pt;">-Loader </a><span style="text-indent: -18pt;"> and </span><a href="https://github.com/amd/rest3d/tree/master/server/o3dgc" style="text-indent: -18pt;">Open3DGC</a> with <span style="text-indent: -18pt;">14 bits quantization for positions and 10 bits quantization for normals/texture coord</span></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><a href="http://openctm.sourceforge.net/?page=development" style="text-indent: -18pt;">OpenCTM</a><span style="text-indent: -18pt;">: default parameters (not fair)</span></span></li>
</ul>
</ul>
<div class="" style="clear: both; text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8XF4XeGvTOtwMpB5Rex7CsyxH3CbZb_XHNSKQKiq2DGg9Jvgdq_1ls1NaQqSZd2izt7eNixQajztpDbiYkk9JHo-9eVmOcBh81gOrZzkCarP2zbIYiOcR_RMI0cJvSMX5mkf3f_zLUaOL/s1600/Open3DGCvsOpenCTMvsWebglLoadervsGzip.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Arial, Helvetica, sans-serif;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8XF4XeGvTOtwMpB5Rex7CsyxH3CbZb_XHNSKQKiq2DGg9Jvgdq_1ls1NaQqSZd2izt7eNixQajztpDbiYkk9JHo-9eVmOcBh81gOrZzkCarP2zbIYiOcR_RMI0cJvSMX5mkf3f_zLUaOL/s400/Open3DGCvsOpenCTMvsWebglLoadervsGzip.png" width="400" /></span></a></div>
<div style="text-indent: -24px;">
<span style="font-family: Arial, Helvetica, sans-serif; text-indent: 0px;"><br /></span></div>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: large;">Using the Open3DGC Compression Tool</span><br />
<ul style="text-align: left;">
<li><span style="font-family: Arial, Helvetica, sans-serif;">The "test_o3dgc" tool supports only <a href="https://en.wikipedia.org/wiki/Wavefront_.obj_file" target="_blank">OBJ</a> files with a single triangular model</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Pre-built binaries for Win32, Win64 and ubuntu are available </span><a href="https://github.com/kmammou/rest3d/tree/master/server/o3dgc/bin" style="font-family: Arial, Helvetica, sans-serif;" target="_blank">here</a></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Example of test models are located</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><a href="https://github.com/kmammou/rest3d/tree/master/server/o3dgc/data" style="font-family: Arial, Helvetica, sans-serif;" target="_blank">here</a></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">To compress the "bunny" model file use the following command line:</span></li>
</ul>
<ul style="text-align: left;"><ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Binary stream</span></li>
</ul>
</ul>
<div style="text-align: left;">
</div>
<blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;">
<div style="text-align: center;">
<span style="font-family: 'Courier New', Courier, monospace;">test_o3dgc.exe -c -st binary -i bunny.obj</span></div>
</blockquote>
<div style="text-align: left;">
</div>
<ul style="text-align: left;"><ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">ASCII stream</span></li>
</ul>
</ul>
<div style="text-align: left;">
</div>
<blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;">
<div style="text-align: center;">
<span style="font-family: 'Courier New', Courier, monospace;">test_o3dgc.exe -c -st ascii -i bunny.obj</span></div>
</blockquote>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<br />
<ul style="text-align: left;">
<li><span style="font-family: Arial, Helvetica, sans-serif;">ASCII streams </span><span style="font-family: Arial, Helvetica, sans-serif;">should be further compressed by using GZip</span></li>
</ul>
<ul style="text-align: left;">
<li><span style="font-family: Arial, Helvetica, sans-serif;">To decompress the stream:</span></li>
</ul>
<div style="text-align: center;">
<span style="font-family: Courier New, Courier, monospace;">test_o3dgc.exe -d -i bunny.s3d</span></div>
<ul style="text-align: left;">
<li style="text-indent: -24px;"><span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></li>
</ul>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-19117204756337574572012-11-12T18:56:00.001-08:002012-11-12T19:01:24.553-08:00<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-size: large;"><span style="color: red;">V</span>-HACD: Replacing <a href="http://www.cs.cmu.edu/~quake/triangle.html" target="_blank">Triangle</a>'s Constrained Delaunay Triangulation</span><br />
<br />
As mentioned in my previous post, the first version of V-HACD relies on the library Triangle to compute 2D constrained Delaunay triangulations. In fact, the V-HACD algorithm involves clipping the mesh against a plane and filling the produced holes (cf. Figure 1).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUtKgtx6LobrLoWtkWNsZS9ArrL7KasCWwf5VHwaw_f91ux-imsZV0nzdQ2qDFoDlVKy01N15epIz1POSg-0RAQ-Z2u2__mrKiz9roHIPjyJDHAZDdri5QFDMLuw5DW9Xwsybgd59sKkCB/s1600/cdt_plane_clipping.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUtKgtx6LobrLoWtkWNsZS9ArrL7KasCWwf5VHwaw_f91ux-imsZV0nzdQ2qDFoDlVKy01N15epIz1POSg-0RAQ-Z2u2__mrKiz9roHIPjyJDHAZDdri5QFDMLuw5DW9Xwsybgd59sKkCB/s400/cdt_plane_clipping.png" width="400" /></a></div>
The Triangle library produces excellent results and is very stable. However, as pointed out by <a href="http://www.altdevblogaday.com/author/erwin-coumans/" target="_blank">Erwin Coumans</a> it has a non permissive license. Another alternative to Triangle is the <a href="http://code.google.com/p/poly2tri/" target="_blank">poly2tri</a>, which is released under a New BSD License. Poly2tri turned out to be non-usable in my case because it supports only simple polygons as constraints. After searching the internet for a "good" and stable implementation with a permissive license, I ended up developing a simple triangulation algorithm (it is not a Constrained Delaunay Triangulation), which is enough for V-HACD needs. My implementation is a very simplified version of the <a href="http://www.cescg.org/CESCG-2004/web/Domiter-Vid/" target="_blank">Incremental Delaunay algorithm </a><br />
<br />
The new triangulation algorithm was uploaded to the git repository and could be compared to the Triangle library by adding <span style="color: #274e13; font-family: Courier New, Courier, monospace;">#define USE_TRIANGLE</span> to vhacdMesh.cpp<br />
<br />
The code is still ugly and not optimized at all. For now, I am trying to have some first results and understand better the algorithm limitations. Hopefully, I'll have soon the time to clean up the code.</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-34194333777694124862012-11-07T22:16:00.003-08:002014-11-23T22:56:54.956-08:00<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: justify;">
<span style="color: red;"><span style="font-size: large; text-align: center;">This post is out-of-date. Check out </span><a href="http://kmamou.blogspot.ca/2014/11/v-hacd-v20-is-here.html" style="font-size: x-large; text-align: center;">V-HACD 2.0</a><span style="font-size: large; text-align: center;">!</span></span></div>
<span style="font-size: large; text-align: center;"><br /></span>
<span style="font-size: large; text-align: center;"><br /></span>
<span style="font-size: large;"><span style="color: red;"><b><br /></b></span></span>
<span style="font-size: large;"><span style="color: red;"><b>V</b>-</span>HACD: Hierarchical Approximate Convex Decomposition Revisited</span><br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Lately, I have found time to work on improving the <a href="http://sourceforge.net/projects/hacd/" target="_blank">HACD</a> algorithm. The new <a href="http://code.google.com/p/v-hacd/" target="_blank"><b>V</b>-HACD</a> library tries to tackle the problem of convex-hulls inter-penetration usually encountered when using HACD. Figure 1 illustrates this limitation by comparing <a href="http://code.google.com/p/v-hacd/" target="_blank">V-HACD</a> results to those generated by using HACD.</div>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijxJmdI00_TgsCMT6aw8kQeUK19J7w0Fd7kBZb4_EZgor_KIP963_3AatgOTihIsx2oXnOrXQrGBmdtnlx0SpEcLGHiHm6g51NyNAGVeFnAedWlAQg5wAGzFfzvfOY9a7U-9Cia11Gyfyo/s1600/vhacd_vs_hacd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijxJmdI00_TgsCMT6aw8kQeUK19J7w0Fd7kBZb4_EZgor_KIP963_3AatgOTihIsx2oXnOrXQrGBmdtnlx0SpEcLGHiHm6g51NyNAGVeFnAedWlAQg5wAGzFfzvfOY9a7U-9Cia11Gyfyo/s320/vhacd_vs_hacd.png" height="240" width="320" /></a></div>
<div style="text-align: center;">
Figure 1. <span style="color: red;"><b>V</b></span>-HACD vs. HACD: <span style="color: red;"><b>V</b></span>-HACD generates non-overlapping convex-hulls.</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
V-HACD works only with manifold closed meshes of arbitrary genus, which makes it less general than HACD algorithm (which handles open and non-manifold meshes). The V-HACD code is <a href="http://code.google.com/p/v-hacd/" target="_blank">available </a>under New BSD License. However, the current version relies on the following other libraries:<br />
<br />
<ul>
<li><a href="http://www.cs.cmu.edu/~quake/triangle.html" target="_blank">Triangle</a> to compute constrained delaunay triangulation which has a non permissive license, which should be replaced [Thanks to <a href="http://www.altdevblogaday.com/author/erwin-coumans/" target="_blank">Erwin Coumans</a> for noticing that]</li>
<li>Ole Kniemeyer's implementation of the convex-hull algorithm provided with <a href="http://code.google.com/p/bullet/" target="_blank">bullet</a></li>
<li>John Tsiombikas's <a href="http://code.google.com/p/kdtree/" target="_blank">kd-tree</a> algorithm</li>
</ul>
<br />
The first results are encouraging. However, the code is still buggy and not optimized. I hope that people would be interested in helping me improve this first version.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
To play with the algorithm, a pre-compiled win32 executable is available <a href="http://code.google.com/p/v-hacd/source/browse/#git%2Fbin" target="_blank">here</a><br />
Pre-computed decomposition results are available <a href="http://code.google.com/p/v-hacd/source/browse/#git%2Fdata%2Fres" target="_blank">here</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br />
V-HACD parameters are the following:</div>
<div style="text-align: justify;">
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;">testVHACD fileName.off depth maxConcavity invertInputFaces posSampling </span><span style="font-family: 'Courier New', Courier, monospace;">angleSampling posRefine angleRefine alpha targetNTrianglesDecimatedMesh</span></div>
</div>
<div style="text-align: justify;">
<ul>
<li>fileName.off: 3D mesh in off format (type: string, example: block.off )</li>
<li>depth: maximum number of decomposition stages (type: integer, default: 10)</li>
<li>maxConcavity: maximum allowed concavity (type: float, default 0.01)</li>
<li>invertInputFaces: indicates whether mesh normals should be inverted or not (type: boolean, default 0)</li>
<li>posSampling: clipping plane position sampling resolution for coarse search (type: int, default 10)</li>
<li>angleSampling: clipping plane orientation sampling resolution for coarse search (type: int, default 10) </li>
<li>posRefine: clipping plane position sampling resolution for refined search (type: int, default 5) </li>
<li>angleRefine: clipping plane orientation sampling resolution for refined search (type: int, default 5)</li>
<li>alpha: parameter controlling the compromise between concavity and balance between convex-hulls. (type: float, default: 0.01)</li>
<li>targetNTrianglesDecimatedMesh: number of triangles in the decimated mesh. V-HACD decimates the input mesh to reduce computation times. (type: integer, default: 1000)</li>
</ul>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
To apply V-HACD to the input mesh "input.off" use the following command line:</div>
<div style="text-align: justify;">
<br />
<div style="text-align: center;">
<span style="font-family: Courier New, Courier, monospace;">testVHACD.exe input.off 30 0.01 0 64 32 8 64 0.001 2000</span></div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Below, some screen-shots of the obtained results.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2FS_UshK3I6OawF8-_OUfPjRwg3BF1wvtMO6-JGDICnfy78Xi9IlOC4JCg9vR7Efm_VtFhw_UW72vovnbAqr7thIsHIUHWMlvL1aKirVvdF6cwbxdyfuMNcvalC2Xix241wFeUvPCJxL-/s1600/Slide2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2FS_UshK3I6OawF8-_OUfPjRwg3BF1wvtMO6-JGDICnfy78Xi9IlOC4JCg9vR7Efm_VtFhw_UW72vovnbAqr7thIsHIUHWMlvL1aKirVvdF6cwbxdyfuMNcvalC2Xix241wFeUvPCJxL-/s320/Slide2.PNG" height="240" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg84lQuPA9C3eMe3sBsLVIU9qqjUYkAMNnQ1mnKHZhcDL-1CDo3RTxOgIKFCtxjNW5lDOv1AXKOv_bFwFraGs_SO_zk4YUCsAMNeLGYUeHDpTD46c1XunMDHVKf-K1G8wJ1QagPmN41kcCq/s1600/Slide3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg84lQuPA9C3eMe3sBsLVIU9qqjUYkAMNnQ1mnKHZhcDL-1CDo3RTxOgIKFCtxjNW5lDOv1AXKOv_bFwFraGs_SO_zk4YUCsAMNeLGYUeHDpTD46c1XunMDHVKf-K1G8wJ1QagPmN41kcCq/s320/Slide3.PNG" height="240" width="320" /></a></div>
<br />
<br />
<br /></div>
<div style="text-align: justify;">
The current version of V-HACD provides poor results or errors for the following three meshes. As soon as I get some free time I'll try to fix these bugs.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW7puj0oQ2Wb0-IFjbRxOf2bCBCB1OtBQTMcigPhKuZTkXew0wGj3YqnClhHDPq70KF2Pe3hgu0VD0tv0ttuC2TWqTc7iAUAi2aRlSH00hzrV_lox8ZoV2yUnNZLshBGVPtDtNj2nnsHzW/s1600/Slide4.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW7puj0oQ2Wb0-IFjbRxOf2bCBCB1OtBQTMcigPhKuZTkXew0wGj3YqnClhHDPq70KF2Pe3hgu0VD0tv0ttuC2TWqTc7iAUAi2aRlSH00hzrV_lox8ZoV2yUnNZLshBGVPtDtNj2nnsHzW/s320/Slide4.PNG" height="240" width="320" /></a></div>
<br /></div>
<div style="text-align: justify;">
<ul>
<li>dancer2</li>
<li>elk</li>
<li>hand1</li>
<li>hand2</li>
<li>hero</li>
<li>octopus</li>
<li>polygirl</li>
<li>shark_b</li>
<li>Sketched-Brunnen</li>
<li>torus</li>
<li>tstTorusModel</li>
<li>tstTorusModel3</li>
</ul>
</div>
<div style="text-align: justify;">
<br /></div>
</div>
kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0tag:blogger.com,1999:blog-4981335297800913708.post-55902550516823256212011-11-23T14:51:00.001-08:002011-11-24T14:35:59.748-08:00HACD parameters<div dir="ltr" style="text-align: left;" trbidi="on">
In this post, I'll to give an overview of the HACD parameters and explain their meaning and how they should be set. The text will be improved over time. My main concern is to have things written down for reference...<br />
<br />
<br />
<ol style="text-align: left;">
<li><b>Parameters overview</b></li>
</ol>
<div>
<div style="text-align: -webkit-auto;">
<table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-bottom-style: none; border-collapse: collapse; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; width: 519px;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Parameter<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Description<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Default<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">NTargetTrianglesDecimatedMesh </span></span><span style="font-size: 8pt;"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">Target
number of triangles in the decimated mesh. The decimation stage was added
mainly to decrease the computation costs for dense meshes (refer to Section 2.1</span></span><span class="apple-style-span"><span style="font-size: 8pt;">).</span></span><span style="font-size: 8pt;"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">1000<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">NVerticesPerCH</span></span><span style="font-size: 8pt;"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Maximum number
of vertices in the generated convex-hulls.<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">100<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">ScaleFactor</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Normalization
factor used to ensure that the
other parameters (e.g. concavity) are expressed w.r.t. a fixed size. Refer to Section 2.3 for details<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">1000<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-converted-space"><span style="font-size: 8pt;"> </span></span><span class="apple-style-span"><span style="font-size: 8pt;">SmallClusterThreshold</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Threshold on
the clusters area (expressed as a percentage of the entire mesh area) under
which the cluster is considered small and it is forced to be merged with
other clusters at the price of a high concavity.<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">0.25<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">AddFacesPoints</span></span><span class="apple-converted-space"><span style="font-size: 8pt;"><o:p></o:p></span></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">If enabled an additional
ray located at the center of each triangle pointing toward its normal is
considered when computing the concavity of a non-flat cluster. The parameter was
added to handle coarse meshes (i.e. with a low number of vertices)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">ON<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">AddExtraDistPoitns</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">If enabled additional
rays are considered to handle bowl-like shapes.<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">ON<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">NClusters</span></span><span class="apple-converted-space"><span style="font-size: 8pt;"> </span></span><span class="apple-style-span"><span style="font-size: 8pt;"><o:p></o:p></span></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Minimum number of
convex-hulls to be generated<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">1<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">Concavity</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Maximum allowed
concavity<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">100<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">ConnectDist</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">If the distance
between two triangles, each belonging to a different connected components (CCs),
is lower than the </span><span class="apple-style-span"><span style="font-size: 8pt;">ConnectDist</span></span><span style="font-size: 8pt;"> threshold an additional edge connecting
them is added to the dual graph. This parameter was added to handle meshes
with multiple CCs</span><span style="font-size: 8pt;">.<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">30<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">VolumeWeight</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Weight
controlling the contribution of the volume related cost to the global
edgecollapse cost (refer to XXX for details). <o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">0.0 <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">(not used)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">CompacityWeight</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Weight
controlling the contribution of the shape factor related cost to the global
edgecollapse cost (refer to XXX for details). <o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">0.0001<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="apple-style-span"><span style="font-size: 8pt;">FlatRegionThreshold</span><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Threshold expressed
a percentage of ScaleFactor under which a cluster is considered flat.<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">1<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 127.15pt;" valign="top" width="170"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">ComputationWeight
<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 213.65pt;" valign="top" width="285"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">Weight
controlling the contribution of the computation related cost to the global
edgecollapse cost (refer to XXX for details).<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 48.1pt;" valign="top" width="64"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-size: 8pt;">0.01<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
</div>
</div>
<div style="text-align: -webkit-auto;">
<b>2. Detailed description</b></div>
<div style="text-align: -webkit-auto;">
<ul style="text-align: left;">
<li><b>NTargetTrianglesDecimatedMesh</b></li>
</ul>
In order to reduce the computations times for dense meshes, the HACD library makes it possible to decimate the original mesh before running the decomposition process. More details about the decimation algorithm are provided here <a href="http://kmamou.blogspot.com/2011/10/hacd-optimization.html" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif;" target="_blank">http://kmamou.blogspot.<wbr></wbr>com/2011/10/hacd-optimization.<wbr></wbr>html</a></div>
<div style="text-align: -webkit-auto;">
<br /></div>
<div style="text-align: left;">
<ul style="text-align: left;">
<li><b>NVerticesPerCH</b></li>
</ul>
this parameter was introduced in order to comply with the constraints that most physics engines put on the number of vertices/triangles per convex-hull (CH). If the function HACD::Compute() is called with the parameter fullCH=false, then the generated CHs will have a number of vertices lower than NVerticesPerCH.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
In order to optimally choose the best vertices to keep in the final CH, the ICHull::Process(unsigned long nPointsCH) function implements a slightly different version of the Incremental Convex Hull algorithm (cf. <a href="http://www.eecs.tufts.edu/~mhorn01/comp163/" target="_blank">demo</a> <a href="http://maven.smith.edu/~orourke/books/ftp.html" target="_blank">code</a> ). Here, at each step, the point with the highest volume increment is chosen, until all points are processed or the CH has exactly NVerticesPerCH points.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The code looks like this:</div>
<div style="text-align: left;">
<div>
<br /></div>
<div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">while</span> (!vertices.GetData().m_tag &&
addedPoints < nPointsCH) <span style="color: green;">// not processed</span><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (!FindMaxVolumePoint())<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
<span style="color: blue;">break</span>;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
} <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
vertices.GetData().m_tag = <span style="color: blue;">true</span>; <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (ProcessPoint())<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
addedPoints++;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
CleanUp(addedPoints);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
vertices.Next();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: green;">// delete remaining points</span><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">while</span> (!vertices.GetData().m_tag)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
vertices.Delete();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
</div>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<ul style="text-align: left;">
<li><b>ScaleFactor</b></li>
</ul>
</div>
<div style="text-align: left;">
A normalization process is applied to the input mesh in order to ensure that the other parameters (e.g. concavity) are expressed w.r.t. a fixed size. This process is inverted before producing the final CHs.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The HACD::Compute() function follows the following main steps:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">bool</span> HACD::Compute(<span style="color: blue;">bool</span>
fullCH, <span style="color: blue;">bool</span> exportDistPoints)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (m_targetNTrianglesDecimatedMesh > 0)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> DecimateMesh(targetNTrianglesDecimatedMesh);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> NormalizeData();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> CreateGraph();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> InitializeDualGraph();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> InitializePriorityQueue();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> Simplify();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> DenormalizeData();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> CreateFinalCH();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">return</span> <span style="color: blue;">true</span>;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The HACD::NormalizeData() function centers the mesh and scale it so its coordinates are in the interval [-m_sacle, m_sclae]x[-m_sacle, m_sclae]x[-m_sacle, m_sclae]. The code proceeds as follows:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">void</span> HACD::NormalizeData()<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">const</span> Real
invDiag = <span style="color: blue;">static_cast</span><Real>(2.0 * m_scale
/ m_diag);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">for</span> (size_t v = 0; v < m_nPoints ; v++) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_points[v]
= (m_points[v] - m_barycenter) * invDiag;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The HACD::DenormalizeData() function invert the normalization operated by HACD::NormalizeData():</div>
<div style="text-align: left;">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">void</span> HACD::DenormalizeData()<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">const</span>
Real diag = <span style="color: blue;">static_cast</span><Real>(m_diag /
(2.0 * m_scale));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">for</span>
(size_t v = 0; v < m_nPoints ; v++) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_points[v] = m_points[v] * diag +
m_barycenter;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
</div>
<ul style="text-align: left;">
<li><b>SmallClusterThreshold</b></li>
</ul>
Due to numerical stability issues (or maybe some bugs I haven't spotted yet :) ) the HACD algorithm may produce small clusters. In order to detect them and make sure they will be merged, the SmallClusterThreshold was introduced. A cluster is considered to be small if its area is smaller than SmallClusterThreshold% of the entire mesh area.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The condition2 in the HACD::Simplify() function forces small clusters to be merged (m_area is the area of the entire mesh):</div>
<div style="text-align: left;">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">void</span><span style="font-family: Consolas; font-size: 9.5pt;"> HACD::Simplify()<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">double</span> areaThreshold = m_area * m_smallClusterThreshold
/ 100.0;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">while</span> (
!m_pqueue.empty() ) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
currentEdge = m_pqueue.top();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
m_pqueue.pop();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> v1 = m_graph.m_edges[currentEdge.m_name].m_v1;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> v2 = m_graph.m_edges[currentEdge.m_name].m_v2; <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">bool</span>
condition1 = (m_graph.m_edges[currentEdge.m_name].m_concavity < </span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_concavity)
&& (globalConcavity < m_concavity) && </span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> (m_graph.GetNVertices() > m_nMinClusters) && </span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> (m_graph.GetNEdges()
> 0);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> b<span style="color: blue;">ool</span> condition2 = (m_graph.m_vertices[v1].m_surf <
areaThreshold || </span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_graph.m_vertices[v2].m_surf < areaThreshold);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> i<span style="color: blue;">f</span>
(condition1 || condition2)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_graph.EdgeCollapse(v1,
v2);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">long</span> idEdge;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">for</span>(size_t itE = 0; itE <
m_graph.m_vertices[v1].m_edges.Size(); ++itE)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> idEdge = m_graph.m_vertices[v1].m_edges[itE];<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> ComputeEdgeCost(idEdge); </span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"> </span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"> } </span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"> </span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px; text-indent: 40px;">}</span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<ul style="text-align: left;">
<li><b>AddFacesPoints and AddExtraDistPoitns</b></li>
</ul>
</div>
<div style="text-align: left;">
The parameter AddFacesPoints was introduced to improve the precision of the concavity computation for meshes with a low number of vertices. The idea is to add additional rays located each at the center of a triangle and pointing to the same direction as its normal.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The Parameter AddExtraDistPoints was added to handle bowl-like shapes. As illustrated below, if only the rays located on the current cluster are considered when computing its concavity, you may end up with a big cluster corresponding to the external surface (which is convex) of the bowl containing a lot of small clusters located on the internal part (which is concave). </div>
<div style="text-align: left;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuE3Vzj0eKzv2R0f6Y9_Dm1ZQo-x8DPF0ollyR6d9orQmuUR5knUUVGBhfj3JnFEffauNoAxkuRxq0LxsIFqhNvlTWs3qwzNG3eogZChyphenhyphen98eQW0WishfDlvf99Od7lVOXHRwCrIJwgHhOW/s1600/bowl_bad.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuE3Vzj0eKzv2R0f6Y9_Dm1ZQo-x8DPF0ollyR6d9orQmuUR5knUUVGBhfj3JnFEffauNoAxkuRxq0LxsIFqhNvlTWs3qwzNG3eogZChyphenhyphen98eQW0WishfDlvf99Od7lVOXHRwCrIJwgHhOW/s320/bowl_bad.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bad decomposition for bowl-like shapes if AddExtraDistPoints is not enabled</td></tr>
</tbody></table>
<div style="text-align: left;">
In order to avoid such a bad decomposition, the idea consists in introducing new rays that would constrain the propagation of the cluster corresponding to the external surface of the bowl by taking into account rays located on the concave part. More precisely, during the initialization stage, an additional ray (the yellow ray in the figure below) is associated with each triangle (colored in red). </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The additional ray, denoted R (the yellow arrow), is defined as follows. Let N be the normal (the blue arrow) to the current triangle T (colored in red) and X be the ray starting at the center of T and with direction (-N) (the dotted green arrow). The starting point of R, denoted P0 (the yellow point), is defined a the nearest intersection point of X and the mesh. Moreover, the normal of the surface at P0 should point to the same direction as X. R has the direction of the normal of the surface at the P0.</div>
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3kgIT_Hso-ix_I5-pQM4FO1cJeSTRlDU7F1uDFdmM7anSXmuGST5MGePOZGk1uOI9e3Rd5T_ieFhbCE8sy9WD9jz3rtTD-94OnAHpf0dE6SA-DK4R5BU1rpCkOVhPytOEqVYZF3sDNwua/s1600/extraDistPoints.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3kgIT_Hso-ix_I5-pQM4FO1cJeSTRlDU7F1uDFdmM7anSXmuGST5MGePOZGk1uOI9e3Rd5T_ieFhbCE8sy9WD9jz3rtTD-94OnAHpf0dE6SA-DK4R5BU1rpCkOVhPytOEqVYZF3sDNwua/s320/extraDistPoints.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Additional ray (yellow) is associated with the red triangle when AddExtraDistPoints is activated</td></tr>
</tbody></table>
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The code looks like this:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">void</span> HACD::InitializeDualGraph()<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">for</span>(<span style="color: blue;">unsigned</span> <span style="color: blue;">long</span> f = 0; f < m_nTriangles; f++)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> i
= m_triangles[f].X();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> </span><span lang="FR" style="font-family: Consolas; font-size: 9.5pt;">j =
m_triangles[f].Y();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt;"> </span><span style="font-family: Consolas; font-size: 9.5pt;">k = m_triangles[f].Z();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(i,
0, <span style="color: blue;">false</span>, <span style="color: blue;">false</span>));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(j,
0, <span style="color: blue;">false</span>, <span style="color: blue;">false</span>));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(k,
0, <span style="color: blue;">false</span>, <span style="color: blue;">false</span>));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> u
= m_points[j] - m_points[i];<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> v = m_points[k] - m_points[i];<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> w = m_points[k] - m_points[j];<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> normal = u ^ v;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_normals[i] += normal;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_normals[j] += normal;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_normals[k] += normal;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_graph.m_vertices[f].m_surf =
normal.GetNorm();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_area
+= m_graph.m_vertices[f].m_surf;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> normal.Normalize();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span>(m_addFacesPoints)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
m_faceNormals[f] = normal;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
m_facePoints[f] = (m_points[i] + m_points[j] + m_points[k]) / 3.0;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (m_addExtraDistPoints) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
Vec3<Real> seedPoint((m_points[i] + m_points[j] + m_points[k]) /
3.0);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> Vec3<Real> hitPoint;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> Vec3<Real> hitNormal;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> normal = -normal;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span>
(rm.Raycast(seedPoint,normal,hitTriangle,dist, hitPoint, hitNormal))<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> faceIndex = hitTriangle;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> } <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
<span style="color: blue;">if</span> (faceIndex < m_nTriangles )<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_extraDistPoints[f] = hitPoint;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_extraDistNormals[f] = hitNormal;</span><span class="Apple-style-span" style="font-family: Consolas; font-size: 13px;"> </span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(m_nPoints+f,
0, <span style="color: blue;">false</span>, <span style="color: blue;">true</span>));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">for</span> (size_t v = 0; v < m_nPoints; v++) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> m_normals[v].Normalize();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
</div>
<div style="text-align: left;">
<div style="text-align: left;">
</div>
<ul style="text-align: left;">
<li><b>Concavity</b></li>
</ul>
This parameter specifies the maximum allowed concavity for each cluster. As discussed in <a href="http://kmamou.blogspot.com/2011/10/hacd-hierarchical-approximate-convex.html">http://kmamou.blogspot.com/2011/10/hacd-hierarchical-approximate-convex.html</a> different concavity measures are considered for flat (i.e. 2D) surfaces and for non-flat surfaces.</div>
<div style="text-align: left;">
<ul style="text-align: left;">
<li><b>ConnectDist</b></li>
</ul>
In order to handle meshes with different <a href="http://en.wikipedia.org/wiki/Connected_component_(graph_theory)" target="_blank">connected components</a>. The idea consists in adding "virtual edges" between triangles belonging to different CCs. More precisely, if the distance between two triangles T1 and T2 belonging each to a different CC is lower than a threshold distConnect then an edge connecting T1 to T2 is added to the dual graph.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The code looks like this:</div>
<div style="text-align: left;">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">void</span> HACD::CreateGraph()<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> …<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (m_ccConnectDist >= 0.0)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
m_graph.ExtractCCs();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (m_graph.m_nCCs > 1) <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
std::vector< std::set<<span style="color: blue;">long</span>>
> cc2V;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
cc2V.resize(m_graph.m_nCCs);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
</span><span lang="FR" style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;">long</span><span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;"> cc;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;"> <span style="color: blue;">for</span>(size_t
t = 0; t < m_nTriangles; ++t)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;"> cc =
m_graph.m_vertices[t].m_cc;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;">
cc2V[cc].insert(m_triangles[t].X());<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;">
cc2V[cc].insert(m_triangles[t].Y());<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;">
cc2V[cc].insert(m_triangles[t].Z());<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;"> </span><span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
<span style="color: blue;">for</span>(size_t cc1 = 0; cc1 < m_graph.m_nCCs;
++cc1)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
<span style="color: blue;">for</span>(size_t cc2 = cc1+1; cc2 <
m_graph.m_nCCs; ++cc2)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> std::set<<span style="color: blue;">long</span>>::const_iterator itV1(cc2V[cc1].begin()),
itVEnd1(cc2V[cc1].end()); <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
<span style="color: blue;">for</span>(;
itV1 != itVEnd1; ++itV1)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">double</span> distC1C2 = std::numeric_limits<<span style="color: blue;">double</span>>::max();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">double</span> dist;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> t1 = -1;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> t2 = -1;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
std::set<<span style="color: blue;">long</span>>::const_iterator itV2(cc2V[cc2].begin()),
itVEnd2(cc2V[cc2].end()); <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">for</span>(; itV2 != itVEnd2; ++itV2)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> dist =
(m_points[*itV1] - m_points[*itV2]).GetNorm();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (dist < distC1C2)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> distC1C2 =
dist;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> t1 =
*vertexToTriangles[*itV1].begin();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> std::set<<span style="color: blue;">long</span>>::const_iterator
it2(vertexToTriangles[*itV2].begin()), <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
it2End(vertexToTriangles[*itV2].end()); <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> t2 =
-1;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">for</span>(; it2 != it2End; ++it2)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (*it2 != t1)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> t2
= *it2;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">break</span>;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">if</span> (distC1C2 <= m_ccConnectDist && t1
>= 0 && t2 >= 0)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> </span><span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;">
m_graph.AddEdge(t1, t2); <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span lang="FR" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: FR;"> </span><span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">
}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
</div>
<ul style="text-align: left;">
<li><b><span class="Apple-style-span" style="font-family: Consolas;"> </span>FlatRegionThreshold</b></li>
</ul>
When computing concavity we need to distinguish between flat surfaces and non-float surfaces. The measure of flatness considered in HACD is related to the ratio between the convex-hull volume and the area of its boundary. If this later ration is small compared to m_scale then the mesh is considered flat. Otherwise it is considered non-flat. The parameter FlatRegionThreshold is the threshold which separate flat region from non flat region. It is expressed as percentage of m_scale.<br />
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
In practice, the final concavity is computed as weighted sum of the flat region concavity and the 3D concavity. The weight is a function of the flatness of the cluster.</div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
The code is as follows:</div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;"><br /></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
</div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">void</span><span style="font-family: Consolas; font-size: 9.5pt;"> HACD::ComputeEdgeCost(size_t e)<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">…<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">double</span><span style="font-family: Consolas; font-size: 9.5pt;"> surfCH = ch->ComputeArea() /
2.0;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">double</span><span style="font-family: Consolas; font-size: 9.5pt;"> volumeCH =
ch->ComputeVolume();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">double</span><span style="font-family: Consolas; font-size: 9.5pt;"> vol2Surf = volumeCH / surfCH;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">double</span><span style="font-family: Consolas; font-size: 9.5pt;"> concavity_flat =
sqrt(fabs(surfCH-surf));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0.5in; margin-right: 0in; margin-top: 0in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">double</span><span style="font-family: Consolas; font-size: 9.5pt;">
weightFlat = std::max(0.0, 1.0 - pow(- vol2Surf * 100.0 / (m_scale *
m_flatRegionThreshold), 2.0));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">concavity_flat *= weightFlat;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">if</span><span style="font-family: Consolas; font-size: 9.5pt;">(!ch->IsFlat())<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">
concavity = Concavity(*ch, distPoints);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">concavity += concavity_flat;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 0.5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">…<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></div>
</div>
</div>kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com1tag:blogger.com,1999:blog-4981335297800913708.post-69682927485442923392011-10-05T06:56:00.000-07:002011-10-10T00:13:11.044-07:00HACD optimization<div dir="ltr" style="text-align: left;" trbidi="on"><div><div style="font-family: Helvetica;">Today, I have updated the HACD library in order to reduce both memory usage and computation complexity (cf. http://sourceforge.net/projects/hacd/). </div><div style="font-family: Helvetica;"><br />
</div><div style="font-family: Helvetica;">The new version:</div><br />
<ul style="text-align: left;"><li style="font-family: Helvetica;">uses John's <a href="http://code.google.com/p/microallocator/">Micro Allocator </a>to avoid intensive dynamic memory allocation (thanks John for the great work),</li>
<li><span class="Apple-style-span" style="font-family: Helvetica;">exploits a simplified versi</span><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;">on of an axis-aligned-bounding-volume AABB tree</span><span class="Apple-style-span" style="font-family: Helvetica;"> to accelerate dual graph generation (the code is inspired by <a href="http://codesuppository.blogspot.com/2011/08/raycasting-using-aabb-axis-aligned.html">John's post</a> on this subject, thanks again John :) )</span></li>
<li style="font-family: Helvetica;">has an integrated mesh simplification pre-processing step, which makes it possible to handle dense meshes.</li>
</ul></div><div style="font-family: Helvetica;">In this post, I'll give more details about this last feature.<br />
<br />
To enable mesh decimation, the user specifies the target number of triangles that should be produced before running the convex decomposition. HACD will handle automatically the simplification and the decomposition processes. For the details of the mesh decimation algorithm, have a look at Michael Garland's webpage <a href="http://mgarland.org/research/thesis.html">http://mgarland.org/research/thesis.html</a>. To turn this feature off just set the parameter targetNTrianglesDecimatedMesh=0.<br />
<br />
</div><div style="font-family: Helvetica;">I have tested the updated HACD algorithm on the 3D model <a href="http://graphics.stanford.edu/data/3Dscanrep/">"Bunny"</a>, which has 70K triangles. The HACD's parameters were set as follows:</div><div style="font-family: Helvetica;"><div><ul style="text-align: left;"><li>minNClusters = 12</li>
<li>maxConcavity = 1000</li>
<li>addExtraDistPoints = 1</li>
<li>addFacesPoints = 1</li>
<li>ConnectedComponentsDist = 30</li>
<li>targetNTrianglesDecimatedMesh = 500, 1000, 2000, 4000, 8000 and 16000.</li>
</ul></div></div><div style="font-family: Helvetica;"><br />
</div><div style="font-family: Helvetica;">The snapshots of the produced convex decompositions are reported below. The computation times on my machine (Mac Intel Core 2 Duo, 4 GB RAM DDR3) ranged between 3 sec. for 500 triangles and 200 sec. for 16000 triangles (cf. Table 1 for the details).</div><div style="font-family: Helvetica;"><br />
</div><div style="font-family: Helvetica; text-align: center;">----------------------------------------</div><div style="font-family: Helvetica; text-align: center;"># triangles <span class="Apple-tab-span" style="white-space: pre;"> </span>Time (sec.)</div><div style="font-family: Helvetica; text-align: center;">----------------------------------------</div><div style="font-family: Helvetica; text-align: center;">500<span class="Apple-tab-span" style="white-space: pre;"> </span>2.8</div><div style="font-family: Helvetica; text-align: center;">1000<span class="Apple-tab-span" style="white-space: pre;"> </span>4.6</div><div style="font-family: Helvetica; text-align: center;">2000<span class="Apple-tab-span" style="white-space: pre;"> </span>10</div><div style="font-family: Helvetica; text-align: center;">4000<span class="Apple-tab-span" style="white-space: pre;"> </span>21</div><div style="font-family: Helvetica; text-align: center;">8000<span class="Apple-tab-span" style="white-space: pre;"> </span>70</div><div style="font-family: Helvetica; text-align: center;">16000<span class="Apple-tab-span" style="white-space: pre;"> </span>192</div><div style="font-family: Helvetica; text-align: center;">----------------------------------------</div><div style="font-family: Helvetica;">Table 1. Computation times for targetNTrianglesDecimatedMesh= 500, 1000, 2000, 4000, 8000 and 16000 </div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzb4Q2cGcqhtfhrnsrAbZtNh6Qo-SEgifeQeFi3M-s7yRLPIM9JlsvyY2s7EVjzskg7gYg4iSnQsRiYvJf0lG0GI59msRaGor6x3gmd9JF-_MHkcyDAKGfQ_aYECpjYuzOSmDK72nWXOgW/s1600/bunny_500.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzb4Q2cGcqhtfhrnsrAbZtNh6Qo-SEgifeQeFi3M-s7yRLPIM9JlsvyY2s7EVjzskg7gYg4iSnQsRiYvJf0lG0GI59msRaGor6x3gmd9JF-_MHkcyDAKGfQ_aYECpjYuzOSmDK72nWXOgW/s320/bunny_500.jpg" width="313" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"># triangles after simplification - 500</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGQs0wx37f3mUkWbI93i3PVyEiQa8uLaBm5IWpiJYGvebBikRxA5wAAw7_j91lD_EOMCnH6CTZ2rY4Dx98uQKv89nDfddNdX2uFMFZA83xuUjHdROxnN5ph_xAFkMsbY8dGrdQ1kj0bDZ-/s1600/bunny_1000.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGQs0wx37f3mUkWbI93i3PVyEiQa8uLaBm5IWpiJYGvebBikRxA5wAAw7_j91lD_EOMCnH6CTZ2rY4Dx98uQKv89nDfddNdX2uFMFZA83xuUjHdROxnN5ph_xAFkMsbY8dGrdQ1kj0bDZ-/s320/bunny_1000.jpg" width="292" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"># triangles after simplification - 1000</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLu1rungcNJjekvFhboyojdI38a-BZYQV_FQqy1W7k2iW1voq3rlikIAuKxCLk9Geahpn2IckQwxXKGom8DJNG8V-wL6OTp3XKEAL0EZ7p7peYVEVbUKFT8MwiLTMVIwatJoQv6X1Ad2E/s1600/bunny_2000.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLu1rungcNJjekvFhboyojdI38a-BZYQV_FQqy1W7k2iW1voq3rlikIAuKxCLk9Geahpn2IckQwxXKGom8DJNG8V-wL6OTp3XKEAL0EZ7p7peYVEVbUKFT8MwiLTMVIwatJoQv6X1Ad2E/s320/bunny_2000.jpg" width="300" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"># triangles after simplification - 2000</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNyg6kzr1y6y7GYLB8-fZgvLYEMqUep1MhAsfvdX7nDUbodU8dSJRnt-2Pzs6mHpM-WTyjumezWH0UNXkzFDRIF1ZAkx_oBtLArY7XkS3x4YRued8gGjudfeVnhBknME1djhWZTEp_cV0v/s1600/bunny_4000.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNyg6kzr1y6y7GYLB8-fZgvLYEMqUep1MhAsfvdX7nDUbodU8dSJRnt-2Pzs6mHpM-WTyjumezWH0UNXkzFDRIF1ZAkx_oBtLArY7XkS3x4YRued8gGjudfeVnhBknME1djhWZTEp_cV0v/s320/bunny_4000.jpg" width="304" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"># triangles after simplification - 4000</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOtlnn3MVXsSN7ciUQ-eLAZwLb7PZelQ_wh9KHD2db6h2lqZSdyzDc21Sn37qqLNG9F3cqFd-KWTCQAsy5B0B41L3OCg_ZqYuZCiIZS6MIihB5gf_AQKp2Bkw4bXF7iOf77lH_k81q_Wu5/s1600/bunny_8000.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOtlnn3MVXsSN7ciUQ-eLAZwLb7PZelQ_wh9KHD2db6h2lqZSdyzDc21Sn37qqLNG9F3cqFd-KWTCQAsy5B0B41L3OCg_ZqYuZCiIZS6MIihB5gf_AQKp2Bkw4bXF7iOf77lH_k81q_Wu5/s320/bunny_8000.jpg" width="307" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"># triangles after simplification - 8000</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUW9I2W9GRIAd2IC46rHGOIncfF7TC2w_gmrfbxzpzmVwX9-0NQ7icofEnpctv7pmDONmslYcaK-5ewFKkD31yVYKRBMovQvCqpkULJJedSX2RfCM-MnRazz_bs3ldpVFdun4vDpXSywsM/s1600/bunny_16000.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUW9I2W9GRIAd2IC46rHGOIncfF7TC2w_gmrfbxzpzmVwX9-0NQ7icofEnpctv7pmDONmslYcaK-5ewFKkD31yVYKRBMovQvCqpkULJJedSX2RfCM-MnRazz_bs3ldpVFdun4vDpXSywsM/s320/bunny_16000.jpg" width="304" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"># triangles after simplification - 16000</td></tr>
</tbody></table><br />
</div>kmamouhttp://www.blogger.com/profile/17685414348658321601noreply@blogger.com0