<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5333957751769755809</id><updated>2012-01-12T16:08:09.103-08:00</updated><category term='Cultural Heritage'/><category term='PDF'/><category term='mesh conversion'/><category term='latex'/><category term='3D printing'/><category term='U3D'/><category term='Movie15'/><category term='art'/><category term='normal'/><category term='mesh'/><category term='vertex'/><category term='MeshPad'/><category term='internal face'/><category term='voronoi'/><category term='mesh cleaning'/><category term='3D'/><category term='watertight'/><category term='color'/><category term='Eurographics'/><category term='Archeology'/><category term='Siggraph'/><category term='ambient occlusion'/><category term='3D scanning'/><category term='mesh processing'/><category term='sampling'/><category term='offset'/><title type='text'>MeshLab Stuff</title><subtitle type='html'>Practical Mesh Processing Experiments</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-871911288745928722</id><published>2011-09-26T00:46:00.000-07:00</published><updated>2011-09-26T00:46:24.124-07:00</updated><title type='text'>MeshLab for iOS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dCVaT3O_8Uk/ToArmGmNBoI/AAAAAAAAAk8/aRm9DQbIYdI/s1600/sshot07.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-dCVaT3O_8Uk/ToArmGmNBoI/AAAAAAAAAk8/aRm9DQbIYdI/s320/sshot07.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;2 Big News:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;MeshPad has changed name: now its official name is &lt;a href="http://www.meshpad.org/"&gt;MeshLab for iOS&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;MeshLab for iOS is available on the &lt;a href="http://itunes.apple.com/app/meshlab-for-ios/id451944013?mt=8"&gt;App Store&lt;/a&gt;!&lt;br /&gt;And it is free :)&lt;/li&gt;&lt;/ol&gt;If you have a iPad or an iPhone you can't miss it, go download it and share the news...&lt;br /&gt;&lt;br /&gt;We are investing in it, so expect frequent updates.&amp;nbsp;We feel that this kind of support (i.e. tablet) is really great for showing off results to a really broad spectrum of non technically skilled people. Every time that I give to some CH-only guy an iPad to with a gorgeous model ready to be browsed, well, it really pay off &lt;b&gt;much more&lt;/b&gt; than asking him to sit down in front of a PC and passing him a mouse...&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-871911288745928722?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/871911288745928722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=871911288745928722' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/871911288745928722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/871911288745928722'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2011/09/meshlab-for-ios.html' title='MeshLab for iOS'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-dCVaT3O_8Uk/ToArmGmNBoI/AAAAAAAAAk8/aRm9DQbIYdI/s72-c/sshot07.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-4711915859792060468</id><published>2011-08-03T16:08:00.000-07:00</published><updated>2011-08-03T16:08:37.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MeshPad'/><title type='text'>MeshPad</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://www.meshpad.org/img/sshot01.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://www.meshpad.org/img/sshot01.png" width="150" /&gt;&lt;/a&gt;If you liked MeshLab and you have an iPad or an iPhone, you cannot miss this: an intuitive, cool 3D viewer to show your models. It is able to sustain the interactive browsing of detailed models (usable up to 2M triangles). Perfect for boldly show hi quality 3D scanned stuff to non-technical guys. Soon to be released.&lt;br /&gt;&lt;br /&gt;More info can be found both on &lt;a href="http://www.meshpad.org/"&gt;MeshPad official web page&lt;/a&gt;&amp;nbsp;or on the &lt;a href="http://www.facebook.com/pages/MeshPad/124026831024220"&gt;facebook MeshPad page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The viewer is well integrated in iOs, so it is automatically started whenever you encounter a 3D model in a recognized format (currently just ply stl obj off). It works with models on the web (see the second video) or with other cloud storage services like DropBox.&lt;br /&gt;&lt;br /&gt;So for example it is easy to put a bunch of model on your dropbox account, to boldly show off them just when you need on your iPad.&lt;br /&gt;&lt;br /&gt;Here are two videos showing MeshPad in action:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/36Ujy17QAsk/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/36Ujy17QAsk?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/36Ujy17QAsk?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/tn_3ROW-vJI/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tn_3ROW-vJI?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/tn_3ROW-vJI?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Stay tuned for the official release of the app!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-4711915859792060468?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/4711915859792060468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=4711915859792060468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4711915859792060468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4711915859792060468'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2011/08/meshpad.html' title='MeshPad'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-5365961223330352800</id><published>2011-03-15T10:45:00.000-07:00</published><updated>2011-03-15T10:46:14.029-07:00</updated><title type='text'>MeshLab Video Tutorial</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This blog has been quite lazy recently. But now great news!&lt;br /&gt;We are proud to announce the birth of a dedicated YouTube channel for MeshLab tutorials.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&lt;a href="http://www.youtube.com/user/MrPMeshLabTutorials#g/p" style="font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;Mr P.'s MeshLab Tutorials&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;We will upload some new tutorials in the next days. The first one is already online, and it's a basic one about navigation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/Sl0vJfmj5LQ/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Sl0vJfmj5LQ&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/Sl0vJfmj5LQ&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Stay in touch for news, and if you want to collaborate, you are welcome!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-5365961223330352800?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/5365961223330352800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=5365961223330352800' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/5365961223330352800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/5365961223330352800'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2011/03/this-blog-has-been-quite-lazy-recently.html' title='MeshLab Video Tutorial'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1979702663017581676</id><published>2010-09-07T06:37:00.000-07:00</published><updated>2010-09-07T06:37:01.796-07:00</updated><title type='text'>VAST 2010 MeshLab Tutorial</title><content type='html'>&lt;a href="http://www.vast2010.org/sites/default/files/acquia_slate_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.vast2010.org/sites/default/files/acquia_slate_logo.png" /&gt;&lt;/a&gt;At &lt;a href="http://www.vast2010.org/"&gt;VAST 2010&lt;/a&gt; the 11&lt;sup&gt;&lt;small&gt;th&lt;/small&gt;&lt;/sup&gt;&amp;nbsp; International Symposium on &lt;b&gt;&lt;i&gt;Virtual Reality, Archaeology and Cultural Heritage&lt;/i&gt;&lt;/b&gt;. (Louvre, Paris, 21-24 Sept. 2010) there will be &lt;a href="http://www.vast2010.org/workshop/meshlab"&gt;a full day tutorial of MeshLab&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It will be held by Marco Callieri and Guido Ranzuglia and will cover almost everything of MeshLab, from basic navigation hint to advanced remeshing, measuring and processing tasks. Obviously with a bit of Cultural Heritage pepper here and there. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Target Audience&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;People interested in a simple but powerful opensource tool for mesh processing.&lt;/li&gt;&lt;li&gt;People who need to visualize, edit and convert 3D models.&lt;/li&gt;&lt;li&gt;People who need small editing, batch process and mesh cleaning.&lt;/li&gt;&lt;li&gt;People trying to integrate/replace an existing mesh processing pipeline.&lt;/li&gt;&lt;li&gt;People interested in advanced, custom measuring/processing of 3D models, exploiting state-of-the-art algorithms.&lt;/li&gt;&lt;/ul&gt;Participants will be given the latest build of the tool plus some test dataset to experiment with the presented features. Bring your own laptop!&lt;br /&gt;&lt;br /&gt;RSVP at the &lt;a href="http://www.facebook.com/MeshLab?v=app_2344061033#%21/event.php?eid=129053717141860&amp;amp;index=1"&gt;FaceBook Event Page&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1979702663017581676?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1979702663017581676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1979702663017581676' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1979702663017581676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1979702663017581676'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/09/vast-2010-meshlab-tutorial.html' title='VAST 2010 MeshLab Tutorial'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-5438731973204077843</id><published>2010-07-20T16:57:00.000-07:00</published><updated>2010-07-20T16:57:41.798-07:00</updated><title type='text'>Remeshing and Texturing (1)</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/TEYdnQa31TI/AAAAAAAAAgA/TY4xkKXXQOs/s1600/snap_1_skull_1M_color_snap01.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="181" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/TEYdnQa31TI/AAAAAAAAAgA/TY4xkKXXQOs/s200/snap_1_skull_1M_color_snap01.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;In the pipeline of processing 3D data, after you have aligned and merged your range maps, you ofter require to get a &lt;i&gt;&lt;b&gt;nice clean textured&lt;/b&gt;&lt;/i&gt; mesh. In the last release of MeshLab we included our state-of-the-art parametrization/remeshing algorithm based on abstract parametrization. Now some a two-part tutorial on his practical usage. &lt;br /&gt;Let's start from a medium complexity mesh of a skull (kindly provided and scanned for the VCG Lab by Marco Callieri). You can see it depicted in the two small figures on the right. &lt;br /&gt;The mesh of the skull is composed by 1.000.000 triangles, it has a meaningful per-vertex color (recovered from a set of photos) and, as it often happens, it is topologically dirty. &lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/TEYdXcQfNhI/AAAAAAAAAf4/WL4r9wT_Hn8/s1600/snap_0_skull_1M_color_snap00.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="181" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/TEYdXcQfNhI/AAAAAAAAAf4/WL4r9wT_Hn8/s200/snap_0_skull_1M_color_snap00.png" width="200" /&gt;&lt;/a&gt;First of all it is non 2-manifold (there are 7 edges where more than two face are incident) than there are many small holes and handles that make difficult any kind of parametrization. &lt;br /&gt;&lt;br /&gt;So the first step is to build a watertight, coarser but topologically sound model.&amp;nbsp; Poisson surface reconstruction is a perfect filter for this task. A reconstruction at depth 9 is usually good, that generates a mesh of 1.3M of faces.&amp;nbsp; For this kind of processing a quite faithful geometric representation is not needed, but it is strongly needed that the overall topology is the right one. In this case some portions of the skull are remarkably thin and at low resolutions the poisson surface reconstruction can create unwanted holes.&amp;nbsp; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/TEYd1zRyqDI/AAAAAAAAAgI/UD90jSc01HE/s1600/snap_2_skull_poisson_snap05.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="181" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/TEYd1zRyqDI/AAAAAAAAAgI/UD90jSc01HE/s200/snap_2_skull_poisson_snap05.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;After that a further simplification step is needed to bring the model size to a number reasonable for the Isoparametrization engine.&amp;nbsp; Remember that the when building an abstract parametrization you do not need the full accuracy model but just a model that shares the overall shape and the same topology. For the purpose of the parametrization small details have a very small influence on the overall quality of the parametrization. Side figure depict the watertight Poisson reconstructed surface, note how the nostril cavity was filled (as expected because it was a hole with boundary). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/TEYeAWa9laI/AAAAAAAAAgQ/0ttx04TX1Qk/s1600/snap_3_skull_poisson_para60k_snap.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="181" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/TEYeAWa9laI/AAAAAAAAAgQ/0ttx04TX1Qk/s200/snap_3_skull_poisson_para60k_snap.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;So simplify it our watertight skull up to 50000 triangles. Take care to check Normal Preservation and Topology preservation Flag. The second one is particularly important, infact the basic edge collapse simplification algorithms can during simplification change the topology of the mesh, and while this is usually a nice feature (it allows for example the closure of very small holes) when you start from a mesh that is surely clean (a 2-manifold watertight model) it is better to be sure that such properties are preserved. &lt;br /&gt;&lt;br /&gt;After that you can start with creating the &lt;i&gt;Abstract Isoparametrization&lt;/i&gt;, a technique we introduced in:&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Nico Pietroni, Marco Tarini, Paolo Cignoni&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5333957751769755809&amp;amp;postID=5438731973204077843"&gt;Almost isometric mesh parameterization through abstract domains&lt;/a&gt;  &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;IEEE Transaction on Visualization and Computer Graphics, Volume 16, Number 4, page 621-635 - July/August 2010&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Without going into details, that you will find in the above paper, the main idea is rather simple. Usually textures are defined in a dominion that is just the (0,0)-(1,1) square on the plane. In our approach as a domain of the parametrization we use a different 2-dimensional domain, the surface of a very coarse simplicial complex that has the same topology of the original mesh and it is composed by just a few hundred triangles. Such an approach is interesting because this abstract parametrization can be used for a number of things, like for example remeshing, texturing, tangent space smoothing etc.&lt;br /&gt;&lt;br /&gt;To build the abstract isoparametrization just start the corresponding filter called "&lt;i&gt;Isoparametrization"&lt;/i&gt;, (default params are ok, you can lower convergence precision to a '1' to speedup a bit and try to change a bit the targeted size of the abstract domain). It is a bit slow so wait some minutes for the processing. At the end of the process, you do not see anything directly but the structure is attached to the mesh and you can use it in the other filters. If you want re-use it for a later use you have to save both the processed mesh and as a separate step the isoparametrization using the "&lt;i&gt;Isoparametrization Save Abstract Domain Filter&lt;/i&gt;".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/TEYe0AwLJ9I/AAAAAAAAAgY/zaff6zrFb6I/s1600/snap_4_skull_10k.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="181" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/TEYe0AwLJ9I/AAAAAAAAAgY/zaff6zrFb6I/s200/snap_4_skull_10k.png" width="200" /&gt;&lt;/a&gt;The created isoparametrization can be used to build a standard parametrization over any mesh that is reasonably close to the original one.&lt;br /&gt;In our example we take a simplified version of the original mesh, composed by just 10000 triangles ("Skull_10k.ply"). We transfer over this simplifed mesh the just build isoparametrization&lt;br /&gt;and then using the filter "&lt;i&gt;Iso Parametrization transfer between meshes&lt;/i&gt;", setting as source mesh the one with the abstract parametrization (skull_60k_isoparam.ply) and skull_10k.ply as target.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/TEYe9K1HPAI/AAAAAAAAAgg/376nByXpmXg/s1600/snap_5_skull_10k_param.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="181" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/TEYe9K1HPAI/AAAAAAAAAgg/376nByXpmXg/s200/snap_5_skull_10k_param.png" width="200" /&gt;&lt;/a&gt;Now we can transform the transferred isoparametrization into a standard atlased parametrization using the "&lt;i&gt;Isoparametrization Build Atlased Mesh&lt;/i&gt;" filter. The two image on the right seems equal but you can see that in the lower one the triangles of the mesh have been cut along the triangles of the abstract parametrization in order to get proper atlas regions. At this point your mesh has a standard texture parametrization and it is ready for use it for a variety of operation.&lt;br /&gt;&lt;br /&gt;The First thing that we can do is just to transfer the color of the original 1M vertexes color onto a texture according this parametrization. This can be done by using the filter &lt;i&gt;"Transfer color to texture (between 2 meshes)", &lt;/i&gt;choose a reasonable texture size (2048x2048 is good) and you will obtain a simplified textured mesh that looks strikingly similar to the original heavy 1M tri model (try to compare the first and last snapshots).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/TEY0vm4X0jI/AAAAAAAAAgo/f4xcrqir5Iw/s1600/snap_6_skull_10k_param_tex.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="181" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/TEY0vm4X0jI/AAAAAAAAAgo/f4xcrqir5Iw/s200/snap_6_skull_10k_param_tex.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;Summarized Recipe&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/TEY3adryAgI/AAAAAAAAAgw/hPUztJadmBU/s1600/teschio_color_simp_10k_param_color.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="100" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/TEY3adryAgI/AAAAAAAAAgw/hPUztJadmBU/s200/teschio_color_simp_10k_param_color.png" width="100" /&gt;&lt;/a&gt;&lt;li&gt;take a 1M tri colored model &lt;/li&gt;&lt;li&gt;make the model watertight using Poisson&lt;/li&gt;&lt;li&gt;Simplify it to a 50k model (preserving topology)&lt;/li&gt;&lt;li&gt;Build the Isoparametrization&lt;/li&gt;&lt;li&gt;build another very simple 10k model from the original 1M model&lt;/li&gt;&lt;li&gt;transfer the isoparametrization over the very simple model&lt;/li&gt;&lt;li&gt;convert the isoparametrization into a standard atlased texture&lt;/li&gt;&lt;li&gt;generate a texture with the color from the original 1M model&lt;/li&gt;&lt;/ol&gt;Next part of the tutorial with remeshing and other hints in a few days... &lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-5438731973204077843?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/5438731973204077843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=5438731973204077843' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/5438731973204077843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/5438731973204077843'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/07/remeshing-and-texturing-1.html' title='Remeshing and Texturing (1)'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/TEYdnQa31TI/AAAAAAAAAgA/TY4xkKXXQOs/s72-c/snap_1_skull_1M_color_snap01.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1261966423418407761</id><published>2010-07-16T01:27:00.000-07:00</published><updated>2010-07-16T13:51:38.656-07:00</updated><title type='text'>First MeshLab 1.3.0 beta out!</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/TEAWVzgkk1I/AAAAAAAAAfo/ggzWbqZM4jg/s1600/radiancescaling.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/TEAWVzgkk1I/AAAAAAAAAfo/ggzWbqZM4jg/s400/radiancescaling.png" width="191" /&gt;&lt;/a&gt;The first Beta version of MeshLab 1.3.0 is out. A lot of work has been done under the hood and many new features have been added. In the followings some of the notable improvements: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Totally restructured view/window mechanism. Now you can have: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; multiple views of the same mesh.&amp;nbsp; &lt;/li&gt;&lt;li&gt; standard orthographic viewing directions (up/down etc) &lt;/li&gt;&lt;li&gt; copy/paste of current viewing parameters (you can even save  them for later re-use...); &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; The Isoparametrization works. Really! A detailed tutorial on how to practically use it will appear in a day or two!&lt;/li&gt;&lt;li&gt; new &lt;a href="http://iparla.labri.fr/publications/2010/VPBGS10/"&gt;&lt;i&gt;Radiance Scaling&lt;/i&gt;&lt;/a&gt; rendering mode, (thanks to  Romain Vergne, Romain Pacanowski, Pascal Barla, Xavier Granier and Christophe Schlick for providing the code and to Gaël Guennebaud for helping out!). More on this new rendering mode on another post, as it deserves more space, for now just look at the side image...  &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1261966423418407761?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1261966423418407761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1261966423418407761' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1261966423418407761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1261966423418407761'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/07/first-meshlab-130-beta-out.html' title='First MeshLab 1.3.0 beta out!'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HhP1_0uO1dY/TEAWVzgkk1I/AAAAAAAAAfo/ggzWbqZM4jg/s72-c/radiancescaling.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1362478923714820207</id><published>2010-04-28T11:04:00.000-07:00</published><updated>2010-04-28T13:59:18.213-07:00</updated><title type='text'>MeshLab on Facebook</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/S9hyxB4mgUI/AAAAAAAAAfA/Mj1awXClM6w/s1600/facebook-icon.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="128" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/S9hyxB4mgUI/AAAAAAAAAfA/Mj1awXClM6w/s200/facebook-icon.png" width="128" /&gt;&lt;/a&gt;&lt;/div&gt;Just a short shameless plug to the &lt;a href="http://www.facebook.com/pages/MeshLab/323420321688"&gt;MeshLab&lt;/a&gt; page on &lt;a href="http://www.facebook.com/pages/MeshLab/323420321688"&gt;facebook&lt;/a&gt; (thanks to Marco Callieri who had the idea and set up the page!). Yet another place for disseminating news and bits on MeshLab (like the MeshLab tutorial at the forthcoming  &lt;a href="http://www.archeologiadigitale.it/archeofoss/2010.html"&gt;ArcheoFoss&lt;/a&gt; workshop in Foggia).&lt;br /&gt;&lt;br /&gt;Still on the social side I have been happy to discover that the old-style, web 1.0, IRC channel &lt;a href="irc://freenode/meshlab"&gt;#meshlab&lt;/a&gt; on freenode.net is still alive and kicking, with a few generous developers hanging on it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1362478923714820207?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1362478923714820207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1362478923714820207' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1362478923714820207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1362478923714820207'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/04/meshlab-on-facebook.html' title='MeshLab on Facebook'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/S9hyxB4mgUI/AAAAAAAAAfA/Mj1awXClM6w/s72-c/facebook-icon.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-2307537711518024595</id><published>2010-03-26T00:13:00.000-07:00</published><updated>2010-03-26T00:13:00.558-07:00</updated><title type='text'>Assessing open source software as a scholarly contribution</title><content type='html'>A post that is not strictly related to Computer Graphics, 3D or Cultural Heritage.&lt;br /&gt;Just a small note/rant to point out a recent paper:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_473044561"&gt;Lou Hafer and Arthur E. Kirkpatrick&lt;/a&gt;&lt;br /&gt;&lt;i&gt;&lt;a href="http://www.blogger.com/goog_473044561"&gt;"Assessing open source software as a scholarly contribution"&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_473044561"&gt;Communications of the ACM, Volume 52 ,&amp;nbsp; Issue 12&amp;nbsp; (December 2009) &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is an interesting discussion on the fact that &lt;i&gt;"Academic computer science has an odd relationship with software:  Publishing papers about software is considered a distinctly stronger  contribution than publishing the software".&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt; &lt;br /&gt;Being a senior researcher before being the lead developer of MeshLab, I have to say that I totally agree with those feelings. I have often thought that devoting a significant portion of my time to the MeshLab project is not a 100% wise move from a career point of view; probably writing a bunch of easy minor-variation papers is much more rewarding and is evaluated better when running for higher positions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The sad thing is that there are people thinking that the citations coming from the paper you have written about your software are more than enough to reward you for your effort of writing it. Usually these considerations came from computer scientists who do not have perfectly clear what means writing and maintaining real software tools. &lt;br /&gt;Some bare facts:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you write and maintain significant software tools/library then you are serving the research community in a way that is more significant that writing a paper.&lt;/li&gt;&lt;li&gt;The time required to develop and maintain sw tools is much larger than the time required to write one paper.&lt;/li&gt;&lt;li&gt;Assessing the importance/significance of software is more difficult than assessing the value of papers, no common bibliometric tools (obviously download count is not a good metric).&lt;/li&gt;&lt;li&gt;Commissions evaluating people careers usually ignore sw and concentrate on other, more standard, research products (papers, editorial boards, commitee, teaching, prizes, etc).&lt;/li&gt;&lt;/ol&gt;As a simple consequence, of 2,3,4 and despite of 1, with current career evaluation habits, developing and maintaining sw tools that are significantly useful for the research community is NOT a career maximizing move. And this is, in my humble opinion, definitely, completely, utterly &lt;b&gt;WRONG&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;Now when you stumble upon a discontinued piece of code that you would have loved to have maintained, you have an hint of why the original author abandoned it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-2307537711518024595?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/2307537711518024595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=2307537711518024595' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/2307537711518024595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/2307537711518024595'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/03/assessing-open-source-software-as.html' title='Assessing open source software as a scholarly contribution'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-6542022856528025903</id><published>2010-03-23T17:56:00.000-07:00</published><updated>2010-03-23T17:56:18.072-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ambient occlusion'/><category scheme='http://www.blogger.com/atom/ns#' term='3D scanning'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><title type='text'>Mean Curvature, Cavity Map, ZBrush and nice tricks for enhancing surface shading</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/S6lapq1uZvI/AAAAAAAAAd4/hAsJm8v4Wbk/s1600-h/pazuzu_poiss_1Snap_plain.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/S6lapq1uZvI/AAAAAAAAAd4/hAsJm8v4Wbk/s200/pazuzu_poiss_1Snap_plain.png" width="125" /&gt;&lt;/a&gt;There are many many techniques for enhancing the look of a surface by mean of smart shaders. Without touching &lt;i&gt;Non photo-realistic&lt;/i&gt; rendering techniques there are many tricks that can helps the perception of the features and the fine details of the surface of an object. ZBrush has popularized one of these techniques with the name of &lt;b&gt;&lt;i&gt;cavity mapping&lt;/i&gt;&lt;/b&gt;. The main idea is that you detect 'pits' on the surface and you make them of a different color and, very important, very dull. In practice it simulates in a rough way all those materials where in low accessibility regions dust/rust/oxide accumulates while in the most exposed parts the use make them shiny. You can do such effects in MeshLab and they can be very useful for making quick nice renderings of scanned objects; let make a &lt;br /&gt;a practical example using a 3D scanned model of ancient statuette of the Assyrian demon &lt;a href="http://en.wikipedia.org/wiki/Pazuzu"&gt;Pazuzu&lt;/a&gt; (courtesy of &lt;a href="http://denics.free.fr/"&gt;Denis Pitzalis&lt;/a&gt; C2RMF/Louvre). The plain model (shown on the right) is rather dull and not very readable and at a first glance you cannot appreciate the scale of the scanned details.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/S6la0ZKZ_oI/AAAAAAAAAeA/geiIblGQ44g/s1600/pazuzu_poiss_1Snap_AO.png" imageanchor="1" style="float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/S6la0ZKZ_oI/AAAAAAAAAeA/geiIblGQ44g/s200/pazuzu_poiss_1Snap_AO.png" width="125" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/S6la8m_maGI/AAAAAAAAAeI/u4V_NayVInc/s1600-h/pazuzu_poiss_1Snap_SSAO.png" imageanchor="1" style="float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/S6la8m_maGI/AAAAAAAAAeI/u4V_NayVInc/s200/pazuzu_poiss_1Snap_SSAO.png" width="125" /&gt;&lt;/a&gt;&lt;/div&gt;You can improve it a bit by adding a bit of ambient occlusion. In MeshLab you can do it in a couple of ways, either computing an actual ambient occlusion term (e.g. a &lt;a href="http://en.wikipedia.org/wiki/Steradian"&gt;steradian&lt;/a&gt; denoting the portion of sky that you can see from a given point) for each vertex (&lt;i&gt;Filter-&amp;gt;Color-&amp;gt;Vertex ambient occlusion&lt;/i&gt;) or just resort to a quick and dirty &lt;i&gt;Screen Space Ambient Occlusion&lt;/i&gt; (SSAO) approximation (&lt;i&gt;render-&amp;gt;Screen Space Ambient Occlusion&lt;/i&gt;).In the first case as a bonus you are able to tweak the computed value as you want (by playing with the quality mapping tools), in the second you have just an approximation, but the nice fact is that it is a &lt;i&gt;decoration&lt;/i&gt; e.g. it is blended over the current frame buffer and therefore it mix up with whatever rendering you have. In the two pictures&amp;nbsp; per vertex AO vs SSAO.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/S6ldQ84mhkI/AAAAAAAAAeg/7GgNB6OYCRc/s1600-h/pazuzu_poiss_1Snap_curv.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/S6ldQ84mhkI/AAAAAAAAAeg/7GgNB6OYCRc/s200/pazuzu_poiss_1Snap_curv.png" width="125" /&gt;&lt;/a&gt;&lt;/div&gt;Not enough. Lets try to find out and enhance the pits. &lt;a href="http://en.wikipedia.org/wiki/Mean_curvature"&gt;Mean Curvature&lt;/a&gt; is what you need, you can think it as the divergence of the normals over the surface and it captures well the concept of characterizing local variation of the surface. There is a vast literature on computing curvatures on discrete triangulated surface and MeshLab exposed a few different methods (and it has also a couple of methods for computing them on Point Clouds). The fastest one (a bit resilient on the quality of the mesh) is &lt;i&gt;filter-&amp;gt;color-&amp;gt;Discrete Curvature. &lt;/i&gt;On the right you can see the result of such filter mapped into a red-green-blu colormap. &lt;br /&gt;if you want expmeriment you can try the various options under &lt;i&gt;filter-&amp;gt;normal-&amp;gt;compute curvature principal direction&lt;/i&gt; (be careful some of these filters can be VERY SLOW). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S6lhBgpdS4I/AAAAAAAAAew/te6WjJzIcr8/s1600-h/pazuzu_poiss_1Snap_Zb2.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S6lhBgpdS4I/AAAAAAAAAew/te6WjJzIcr8/s320/pazuzu_poiss_1Snap_Zb2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/S6lg7d34UPI/AAAAAAAAAeo/rFP-gc6HFLI/s1600-h/pazuzu_poiss_1Snap_Zb.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/S6lg7d34UPI/AAAAAAAAAeo/rFP-gc6HFLI/s320/pazuzu_poiss_1Snap_Zb.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now the final step is just to use this value for the shading. Just start the shader called ZBrush and play a bit with the parameters and then, hopefully, you can get the desired result. Some notes. It happens that curvature has some outliers so clamping the quality values before starting the filter can be a good idea (filter-&amp;gt;quality-&amp;gt;clamp). Similarly the range can be very large so playing with the "transition_speed" parameter of the shader can be a quite useful. To vary the amount of "pits" use the "transition center" slider.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-6542022856528025903?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/6542022856528025903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=6542022856528025903' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/6542022856528025903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/6542022856528025903'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/03/mean-curvature-cavity-map-zbrush-and.html' title='Mean Curvature, Cavity Map, ZBrush and nice tricks for enhancing surface shading'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HhP1_0uO1dY/S6lapq1uZvI/AAAAAAAAAd4/hAsJm8v4Wbk/s72-c/pazuzu_poiss_1Snap_plain.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-2524928776942548775</id><published>2010-03-02T16:18:00.000-08:00</published><updated>2010-07-06T01:31:10.463-07:00</updated><title type='text'>Measuring the distance between two meshes (2)</title><content type='html'>Second part of the "&lt;i&gt;metro&lt;/i&gt;" tutorial, the first part is &lt;a href="http://meshlabstuff.blogspot.com/2010/01/measuring-difference-between-two-meshes.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Remember that MeshLab uses a sampling approach to compute the Hausdorff distance taking a set of points over a mesh X and for each point x on X it searches the closest point y on the other mesh Y. That means that the result is strongly affected on how many points do you take over X. Now assume that we want color the mesh X (e.g. the low resolution one) with the distance from Y. &lt;br /&gt;In this case the previous trick of using per vertex color will yeld poor results, given the low resolution quality of the mesh. &lt;br /&gt;Let's start again with our two HappyBuddha, full resolution and simplified to 50k faces. &lt;br /&gt;Therefore first of all we need a denser sampling over the low res mesh, that means that we compute the Hausdorff distance we set the simplified mesh as sample mesh, the original happybuddha as target, we set a face sampling with a reasonable high number of sampling points (10^6 is ok) and, very important, we ask to save the computed samples by checking the appropriate option.&lt;br /&gt;&lt;br /&gt;After a few secs you will see in the layer window two new layers that contains the point clouds representing respectively to the sample taken over the simplified mesh and the corresponding closest points on the original meshes. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S42n-5aA71I/AAAAAAAAAcw/Y_K3w7MV-Dk/s1600-h/happy_vripSnap200.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S42n-5aA71I/AAAAAAAAAcw/Y_K3w7MV-Dk/s320/happy_vripSnap200.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S42oDPMbdMI/AAAAAAAAAc4/d0gJhFI8SRA/s1600-h/happy_vripSnap201.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S42oDPMbdMI/AAAAAAAAAc4/d0gJhFI8SRA/s320/happy_vripSnap201.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To see and inspect these point clouds you have to manually switch to point visualization and turn off the other layers. Below two snapshots of the point cloud (in this case just 2,000,000 of point samples) at different zoom level to get a hint of the cloud density)&lt;br /&gt;&lt;br /&gt;Then, just like in the previous post, use the &lt;i&gt;Color-&amp;gt;Colorize by quality&lt;/i&gt; filter to map the point cloud of the sample points (the one over the simplified mesh) with the standard red-green-blue colormap. &lt;br /&gt;&lt;br /&gt;Now to better visualize these color we use a texture map. As a first step we need a simple parameterization of the simplified mesh. MeshLab offers a couple of parametrization tools. the first one is a rather simple trivial independent right triangle packing approach while the other one is the state of the art &lt;a href="http://meshlabstuff.blogspot.com/2009/07/almost-isometric-mesh-parameterization.html"&gt;almost isometric approach &lt;/a&gt;. Let's use the first one (more on the latter in a future post...) simply by starting &lt;i&gt;Texture-&amp;gt;Trivial Per-Triangle Parametrization&lt;/i&gt;. This kind of parametrization is quite trivial, with a lot of problems (distorsion, fragmentation etc) but on the other hand is quite fast, simple and robust and in a few cases can even be useful.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/S42qCafhLQI/AAAAAAAAAdA/qHtNgRKosCI/s1600-h/happy_vripSnap202.png" imageanchor="1" style="margin-left: 0.3em; margin-right: 0.3em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/S42qCafhLQI/AAAAAAAAAdA/qHtNgRKosCI/s320/happy_vripSnap202.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/S42qFJHoi3I/AAAAAAAAAdI/gAJNGZ8HJ2k/s1600-h/happy_vripSnap203.png" imageanchor="1" style="margin-left: 0.3em; margin-right: 0.3em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/S42qFJHoi3I/AAAAAAAAAdI/gAJNGZ8HJ2k/s320/happy_vripSnap203.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S42qGUQaXQI/AAAAAAAAAdQ/KH13kQcfx_Y/s1600-h/happy_vripSnap204.png" imageanchor="1" style="margin-left: 0.3em; margin-right: 0.3em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S42qGUQaXQI/AAAAAAAAAdQ/KH13kQcfx_Y/s320/happy_vripSnap204.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/S42qIt1ONnI/AAAAAAAAAdY/CqoRa7tCxpI/s1600-h/happy_vripSnap205.png" imageanchor="1" style="margin-left: 0.3em; margin-right: 0.3em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/S42qIt1ONnI/AAAAAAAAAdY/CqoRa7tCxpI/s320/happy_vripSnap205.png" /&gt;&lt;/a&gt;&lt;/div&gt;Now you have just to fill the texture with the color of the sampled point cloud; you can do this with the filter &lt;i&gt;texture-&amp;gt;Transfer color to texture&lt;/i&gt; and choosing an adequate texture size (be bold and use a large texture size...). Below the result with a comparison about error color coded&amp;nbsp; using a texture or simply the color-per-vertex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-2524928776942548775?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/2524928776942548775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=2524928776942548775' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/2524928776942548775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/2524928776942548775'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/03/measuring-distance-between-two-meshes-2.html' title='Measuring the distance between two meshes (2)'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HhP1_0uO1dY/S42n-5aA71I/AAAAAAAAAcw/Y_K3w7MV-Dk/s72-c/happy_vripSnap200.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-571261327240015810</id><published>2010-01-10T17:09:00.000-08:00</published><updated>2010-07-06T01:29:20.599-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='sampling'/><title type='text'>Measuring the difference between two meshes</title><content type='html'>Computing the geometric difference between two 3D models is a quite common task in mesh processing. In our lab, many years ago (11 !), we developed and freely distributed the standard tool for such task, &lt;i&gt;&lt;b&gt;Metro&lt;/b&gt;&lt;/i&gt;, whose &lt;a href="http://www3.interscience.wiley.com/journal/119117847/abstract"&gt;paper&lt;/a&gt; has been cited &lt;a href="http://scholar.google.com/scholar?q=metro"&gt;more than 500 times &lt;/a&gt;. While Metro is still a small open source standalone command line program &lt;a href="http://vcg.sourceforge.net/index.php/Metro"&gt;available at our web site&lt;/a&gt;, its functionality have been integrated into MeshLab in the filter &lt;i&gt;Sampling-&amp;gt;Hausdorff Distance&lt;/i&gt;, and they can be used in a variety of ways.&lt;br /&gt;So here is a short basic tutorial. &lt;br /&gt;&lt;br /&gt;Start with a mesh (in the following the well known Stanford Happy Buddha (1087716 triangles). Aggressively simplify it in a significant way to just 50k tris (e.g. 1/20 of the original size). Reload the original mesh as a new layer. At this point you should have two approximation of the same shape well aligned in the same space. Toggling the visibility on and off of each mesh you should easily see the difference between the two meshes (tip: &lt;i&gt;ctrl+click&lt;/i&gt; over the eye icon in the &lt;i&gt;layers&lt;/i&gt; window turn off all the other layers).&lt;br /&gt;&lt;br /&gt;Now you are ready to start the Hausdorff distance filter.&amp;nbsp; First of all remember that the &lt;a href="http://en.wikipedia.org/wiki/Hausdorff_distance"&gt;Hausdorff Distance&lt;/a&gt; between two meshes is a the maximum between the two so-called one-sided Hausdorff distances (technically not they are not a distance): &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0pjR64flII/AAAAAAAAAa8/_TzR2I-tlzQ/s1600-h/Screen+shot+2010-01-11+at+12.30.43+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0pjR64flII/AAAAAAAAAa8/_TzR2I-tlzQ/s640/Screen+shot+2010-01-11+at+12.30.43+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;These two measures are not symmetric (e.g. the results depends on what mesh you set as X or Y).&lt;br /&gt;In the Hausdorff filters MeshLab computes only the one-sided version&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0plPULN9LI/AAAAAAAAAbE/6xY2Qj1-q4k/s1600-h/Screen+shot+2010-01-11+at+12.31.39+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0plPULN9LI/AAAAAAAAAbE/6xY2Qj1-q4k/s200/Screen+shot+2010-01-11+at+12.31.39+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;leaving the task of getting the maximum of the two to the user.&lt;br /&gt;&lt;br /&gt;Now on the practical side. MeshLab uses a sampling approach to compute the above formula taking a bunch of points over a mesh &lt;i&gt;X&lt;/i&gt; and searching for each &lt;i&gt;x&lt;/i&gt; the closest point &lt;i&gt;y&lt;/i&gt; on a mesh &lt;i&gt;Y&lt;/i&gt;. That means that the result is strongly affected on how many points do you take over X and there are a lot of option on for that. A common very simple approach is just to use the vertexes of the highest density mesh as sampling points (e.g. the original Buddha vertexes): to do this simply leave checked only the "&lt;i&gt;vertex sampling&lt;/i&gt;" option in the filter dialog and be sure that the number of samples is greater or equal than the vertex number. After a few secs the filter ends writing down in the layers log windows the collected info. Something like:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;: Hausdorff Distance computed&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;: Sample 543652&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;: min  : 0.000000 max 0.001862&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;: mean : 0.000029 RMS : 0.000083&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;: Values w.r.t. BBox Diag (0.229031)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;: min  : 0.000000 max 0.008128&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;: mean : 0.000126 RMS : 0.000361&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;For sake of human readability the filter reports the values in the mesh units (whatever they are) and with respect to the diagonal of the bounding box of the mesh that is something you are always able to understand without knowing anything about the model units. For example in this case you can see that the maximum error between the two mesh is approximately 1% of the bbox diag, but on the average the two meshes are almost in the 1/10000 range.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/S0pzko0hXpI/AAAAAAAAAbM/uGEfKZxKXv0/s1600-h/happy_vripSnap00.png" imageanchor="1" style="margin-left: 0.25em; margin-right: 0.25em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/S0pzko0hXpI/AAAAAAAAAbM/uGEfKZxKXv0/s320/happy_vripSnap00.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/S0pzrtyZUcI/AAAAAAAAAbU/MkyWBAn6Hrw/s1600-h/happy_vripSnap01.png" imageanchor="1" style="margin-left: 0.25em; margin-right: 0.25em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/S0pzrtyZUcI/AAAAAAAAAbU/MkyWBAn6Hrw/s320/happy_vripSnap01.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/S0pz4BP9o6I/AAAAAAAAAbc/EWBvGx5zX4g/s1600-h/happy_vripSnap03.png" imageanchor="1" style="margin-left: 0.25em; margin-right: 0.25em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/S0pz4BP9o6I/AAAAAAAAAbc/EWBvGx5zX4g/s320/happy_vripSnap03.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The filter save in the all-purpose &lt;i&gt;quality&lt;/i&gt; field of the vertexes of the sampled mesh the computed distance values.  To better visualize the error you can simply convert these values (for the high resolution mesh) into colors using the&lt;i&gt; Color-&amp;gt;Colorize by quality&lt;/i&gt; filter that maps them in to a rather red-green-blue colormap. Usually given the non uniform distribution of the values you have to play a bit with the filter parameters clamping the mapping range to something meaningful (only a few points have the maximum so with a linear mapping of the values over the whole range will result into a almost uniform red mesh. Note that it is a red-green-blu map, so red is min and blue is max, so in our case red means zero error (good) and blue high error (bad).&lt;br /&gt;The next image sequence report just a small detail of the one of the points with higher error. During the simplification we removed some &lt;i&gt;topological noise, &lt;/i&gt;(the thin tubes connecting the two side of the hole)&amp;nbsp; from a Hausdorff point of view it is a rather large error: the points in the middle of the thin tubes has nothing in the simplified mesh that is close to them; so they bring up the maximum error significantly. Luckily enough they represent only a small portion of the whole mesh so the average error remains low.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0p3J5XX5nI/AAAAAAAAAbk/7QCjgBlAzMY/s1600-h/happy_vripSnap04.png" imageanchor="1" style="margin-left: 0.15em; margin-right: 0.15em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0p3J5XX5nI/AAAAAAAAAbk/7QCjgBlAzMY/s200/happy_vripSnap04.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/S0p3PtaBrII/AAAAAAAAAbs/C1YRPPyNX84/s1600-h/happy_vripSnap05.png" imageanchor="1" style="margin-left: 0.15em; margin-right: 0.15em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/S0p3PtaBrII/AAAAAAAAAbs/C1YRPPyNX84/s200/happy_vripSnap05.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0p3Wfd5BuI/AAAAAAAAAb0/Q1adPyyI1uk/s1600-h/happy_vripSnap06.png" imageanchor="1" style="margin-left: 0.15em; margin-right: 0.15em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0p3Wfd5BuI/AAAAAAAAAb0/Q1adPyyI1uk/s200/happy_vripSnap06.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/S0p3bGTRxxI/AAAAAAAAAb8/QpipPUmGT1w/s1600-h/happy_vripSnap07.png" imageanchor="1" style="margin-left: 0.15em; margin-right: 0.15em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/S0p3bGTRxxI/AAAAAAAAAb8/QpipPUmGT1w/s200/happy_vripSnap07.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0p3cYEJPiI/AAAAAAAAAcE/bxLlenskSf4/s1600-h/happy_vripSnap08.png" imageanchor="1" style="margin-left: 0.15em; margin-right: 0.15em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/S0p3cYEJPiI/AAAAAAAAAcE/bxLlenskSf4/s200/happy_vripSnap08.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Note that if you measure the other one-sided Hausdorff distance, that specific mesh portion will not denote any particular error, because in that case you sample the simplified mesh and for each point of the simplified mesh there are points of the original mesh that are quite close to them. In other words, in this case the simplified mesh is &lt;i&gt;close&lt;/i&gt; to the original one, but the original one is &lt;i&gt;not close&lt;/i&gt; to the simplified one.&lt;br /&gt;&lt;br /&gt;Next post will discuss some remaining issues including the sampling of the surface, looking at all the taken samples and the found closest points and how to colorize the low resolution mesh...&lt;br /&gt;Second part of the tutorial &lt;i&gt;&lt;b&gt;&lt;a href="http://meshlabstuff.blogspot.com/2010/03/measuring-distance-between-two-meshes-2.html"&gt;here.&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-571261327240015810?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/571261327240015810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=571261327240015810' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/571261327240015810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/571261327240015810'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/01/measuring-difference-between-two-meshes.html' title='Measuring the difference between two meshes'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HhP1_0uO1dY/S0pjR64flII/AAAAAAAAAa8/_TzR2I-tlzQ/s72-c/Screen+shot+2010-01-11+at+12.30.43+AM.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-4253613899858054975</id><published>2010-01-06T10:53:00.000-08:00</published><updated>2010-01-06T10:53:39.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D printing'/><category scheme='http://www.blogger.com/atom/ns#' term='3D scanning'/><title type='text'>Desktop Manifacturing</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/S0TbJSfRsXI/AAAAAAAAAac/qt_i5btz4tc/s1600-h/Screen+shot+2010-01-06+at+7.46.42+PM.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/S0TbJSfRsXI/AAAAAAAAAac/qt_i5btz4tc/s200/Screen+shot+2010-01-06+at+7.46.42+PM.png" /&gt;&lt;/a&gt;The January 2010 number of &lt;a href="http://makezine.com/magazine/"&gt;Make&lt;/a&gt; will contains a lot of stuff about Desktop Manufacturing, a field where MeshLab has always been useful as an all purpose repairing tooling (and it is often cited as a handy free stl viewer...). In particular in the "3D Fabbing state of the art" of Make, they refer MeshLab as a&lt;i&gt; &lt;a href="http://www.make-digital.com/make/vol21/?pg=75&amp;amp;search=meshlab&amp;amp;per_page=5&amp;amp;results_page=1&amp;amp;doc_id=-1"&gt;"really high quality free software"&lt;/a&gt;&lt;/i&gt;. That's flattering :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-4253613899858054975?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/4253613899858054975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=4253613899858054975' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4253613899858054975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4253613899858054975'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2010/01/desktop-manifacturing.html' title='Desktop Manifacturing'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/S0TbJSfRsXI/AAAAAAAAAac/qt_i5btz4tc/s72-c/Screen+shot+2010-01-06+at+7.46.42+PM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1393051460027155002</id><published>2009-12-22T16:41:00.000-08:00</published><updated>2010-01-02T00:50:50.736-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mesh conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='Eurographics'/><title type='text'>Practical Quad Mesh Simplification</title><content type='html'>Just a shameless plug to our last &lt;a href="http://www.eurographics2010.se/"&gt;EG&lt;/a&gt; paper that will find is way inside MeshLab:&lt;br /&gt;&lt;br /&gt;&lt;i&gt; Marco Tarini, Nico Pietroni, Paolo Cignoni, Daniele Panozzo, Enrico Puppo&lt;/i&gt;&lt;br /&gt;&lt;a href="http://vcg.isti.cnr.it/Publications/2010/TPCPP10"&gt;&lt;b&gt;Practical Quad Mesh Simplification&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;Computer Graphics Forum, Volume 29, Number 2, EuroGraphics 2010&lt;br /&gt;&lt;br /&gt;In our community it is well know the old religious war between quad vs. triangle meshes, each approach has its own merits and I not discuss them here. &lt;br /&gt;Moving back and forth between the two approaches is often useful but the issue of getting a good quad mesh from a highly irregular tri mesh is a tough one. &lt;br /&gt;&lt;br /&gt;In the above paper we present a novel approach to the problem of quad mesh simplification, striving to use practical local operations, while maintaining the same goal to maximize tessellation quality. We aim to progressively generate a mesh made of convex, right-angled, flat, equally sided quads, with a uniform distribution of vertices (or, depending on the application, a controlled/adaptive sample density) having regular valency wherever appropriate. &lt;br /&gt;&lt;br /&gt;In simple words we start from a tri mesh, we convert into a dense quad mesh using a new Triangle-to-Quad conversion algorithm and then we simplify it using a new progressive quad simplification algorithm. The nice side is that the quad simplification algorithm actually improves the quality of the quad mesh. Below a small example.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SzFkNWjQB_I/AAAAAAAAAaM/Ncob7dB0QOo/s1600-h/ultimo_dei_moai.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SzFkNWjQB_I/AAAAAAAAAaM/Ncob7dB0QOo/s400/ultimo_dei_moai.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;We are currently adding this stuff inside MeshLab. The first things that will appear are the triangle to quad conversion algorithms and some functions for measuring the quality of a quad mesh according to some metrics. More info in the next posts....&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;(2/1/10 edit: if the above link for the paper does not work try this:&amp;nbsp; &lt;b&gt;&lt;a href="http://www.cignoni.org/PracticalQuadMeshSimplification.pdf"&gt;&lt;b&gt;Practical Quad Mesh Simplification&lt;/b&gt;&lt;/a&gt;&lt;/b&gt;)&lt;/i&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1393051460027155002?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1393051460027155002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1393051460027155002' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1393051460027155002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1393051460027155002'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/12/practical-quad-mesh-simplification.html' title='Practical Quad Mesh Simplification'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/SzFkNWjQB_I/AAAAAAAAAaM/Ncob7dB0QOo/s72-c/ultimo_dei_moai.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-5778976298943011902</id><published>2009-12-03T00:34:00.000-08:00</published><updated>2010-02-05T05:16:24.819-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D scanning'/><category scheme='http://www.blogger.com/atom/ns#' term='Archeology'/><category scheme='http://www.blogger.com/atom/ns#' term='Cultural Heritage'/><title type='text'>MeshLab on YouTube</title><content type='html'>Just a short post of a video created by Nicolò dell'Unto (&lt;a href="http://www.imtlucca.it/phd_programs/alumni.php"&gt;a PhD student at IMT&lt;/a&gt;)&lt;br /&gt;about the use of MeshLab and Arc3D for building up a 3D model of an archeological excavation and showing it inside a &lt;a href="http://en.wikipedia.org/wiki/Cave_Automatic_Virtual_Environment"&gt;cave&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="265"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xvTfg2Vxx88&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xvTfg2Vxx88&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Side note, the data was collected during a  workshop of the &lt;a href="http://www.3d-coform.eu/"&gt;3DCOFORM&lt;/a&gt; training series on “&lt;a href="http://www.cyi.ac.cy/node/578"&gt;3D acquisition and post-processing&lt;/a&gt;” that took place at The Cyprus Institute in Nicosia on 2-6 November 2009 and that, among other things focused on the use of MeshLab for Cultural Heritage related activities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-5778976298943011902?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/5778976298943011902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=5778976298943011902' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/5778976298943011902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/5778976298943011902'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/12/meshlab-on-youtube.html' title='MeshLab on YouTube'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-4062996912801556441</id><published>2009-11-03T01:09:00.000-08:00</published><updated>2009-11-04T05:29:24.996-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D printing'/><category scheme='http://www.blogger.com/atom/ns#' term='3D scanning'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='Archeology'/><category scheme='http://www.blogger.com/atom/ns#' term='Cultural Heritage'/><title type='text'>3D scanning and unrolling an ancient seal</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/Su_u7caPTrI/AAAAAAAAAZE/ekKZijjZE4E/s1600-h/sceau.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/Su_u7caPTrI/AAAAAAAAAZE/ekKZijjZE4E/s200/sceau.jpg" /&gt;&lt;/a&gt;A few lines on an interesting recent project I participated and that exploited MeshLab processing abilities. &lt;br /&gt;The project whose results are now shown in a exhibition at the Louvre involved the scanning with non traditional technologies of the very small and wonderful ancient &lt;a href="http://www.louvre.fr/llv/oeuvres/detail_notice.jsp?CONTENT%3C%3Ecnt_id=10134198673225280&amp;amp;CURRENT_LLV_NOTICE%3C%3Ecnt_id=10134198673225280&amp;amp;FOLDER%3C%3Efolder_id=9852723696500800&amp;amp;baseIndex=37&amp;amp;bmLocale=en"&gt;Cylinder Seal of Ibni-Sharrum&lt;/a&gt; (photo © CRMF / D. Pitzalis), a precious antique mesopotamic artifact that is considered one of the absolute masterpieces of &lt;a href="http://en.wikipedia.org/wiki/Ancient_glyptic_art"&gt;glyptic art&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This small seal was digitally acquired at &lt;a href="http://www.c2rmf.fr/"&gt;CRMF&lt;/a&gt; at a very high resolution and with a variety of 3D scanning techniques (microprofilometry, x-ray Tomography, photogrammetric techniques) and, obviously, the results were processed and integrated entirely with MeshLab.&lt;br /&gt;&lt;br /&gt;Among the nice things that we did inside MeshLab was the &lt;i&gt;virtual unrolling&lt;/i&gt; of the seal, e.g. getting the inverse shape that you get when you roll the seal over a soft substance like clay or wax.&amp;nbsp; It was quite easy from a technical point of view, but very appreciated by the restorers that disregard invasive plaster based techniques that often can leave small residuals over the precious artifacts.&amp;nbsp; You can find more details on the whole acquisition and processing of the seal on this VAST conference &lt;a href="http://vcg.isti.cnr.it/Publications/2008/PCMA08/"&gt;paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/Su_v2oztyiI/AAAAAAAAAZU/NvQr_nVoo1U/s1600-h/sceau_unwrap_shader.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/Su_v2oztyiI/AAAAAAAAAZU/NvQr_nVoo1U/s320/sceau_unwrap_shader.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/Su_vuIGAY-I/AAAAAAAAAZM/GzyeaAjqNFM/s1600-h/sceau_unwrap_flat.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/Su_vuIGAY-I/AAAAAAAAAZM/GzyeaAjqNFM/s320/sceau_unwrap_flat.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;On the side you can see a couple of renderings of the 2-million of triangle model of the unrolled seal; the renderings were done inside MeshLab, the first one is a simple flat shaded rendering, while the second one exploit a nice shader that I have recently added to the MeshLab shading arsenal, it mimics in a shameless way the ZBrush technique of varying shininess and color according to the "cavities" of the geometric model (they use it for the famous zbrush wax and bronze materials).&amp;nbsp; It is nice to see how the shading vastly improve the shape perception of the 3D model.&lt;br /&gt;I have not seen many correct discussion on how to perform these kind of shading, so expects a post on that... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A massive physical reproduction (4 meters long!) of the unrolled seal is at the center of "&lt;i&gt;&lt;b&gt;OnLab&lt;/b&gt;&lt;/i&gt;" a thematic &lt;a href="http://www.louvre.fr/llv/exposition/detail_exposition_print.jsp?CONTENT%3C%3Ecnt_id=10134198674147803&amp;amp;CURRENT_LLV_EXPO%3C%3Ecnt_id=10134198674147803&amp;amp;pageId=1"&gt;exhibition of Michel Paysant&lt;/a&gt;, that will open in the next days at Louvre, Denis Pitzalis worked a lot on this project and you can find&amp;nbsp; more details and photos in his &lt;a href="http://www.pitzalis.org/index.php/2009/10/30/michel-paysant-onlab-thematic-exhibition-at-the-louvre-museum-26-11-2009-01-03-2010/"&gt;blog.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-4062996912801556441?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/4062996912801556441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=4062996912801556441' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4062996912801556441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4062996912801556441'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/11/3d-scanning-and-unrolling-ancient-seal.html' title='3D scanning and unrolling an ancient seal'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HhP1_0uO1dY/Su_u7caPTrI/AAAAAAAAAZE/ekKZijjZE4E/s72-c/sceau.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1096944551382286621</id><published>2009-09-08T08:09:00.001-07:00</published><updated>2009-09-08T08:09:37.043-07:00</updated><title type='text'>MeshLab V1.2.2 Released!</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Yet another &lt;a href='https://sourceforge.net/projects/meshlab/files/' target='_blank'&gt;minor release of MeshLab&lt;/a&gt;. This time a lot of large internal changes (we redesigned the parameter mechanism of the filters for a better previewing mechanism)&lt;img width='200' height='167' src='http://lh6.ggpht.com/_HhP1_0uO1dY/SqZnAATDaEI/AAAAAAAAAYU/dX0pJlvP6cI/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;'/&gt; and we added a few new features:&lt;br/&gt;* &lt;a href='http://en.wikipedia.org/wiki/Protein_Data_Bank' target='_blank'&gt;pdb&lt;/a&gt; molecular importing to build up meshes from molecular description. It feature various ways of building meshes from pdb description. &lt;br/&gt;* Weighted simplification; you can now weight the simplification process with a generic scalar value (e.g. simplify more the internal regions, preserve better the face of a character, etc, etc.).&lt;br/&gt;* Improved the vertex attribute transfer filter (the filter that allows you to transfer color, vertex, position, quality from a mesh to another one) to support the management&lt;br /&gt;of point cloud data and to limit the attribute transfer to a limited&lt;br /&gt;distance.&lt;br/&gt;*&lt;img width='200' height='174' src='http://lh4.ggpht.com/_HhP1_0uO1dY/SqZshZOkXXI/AAAAAAAAAYg/Esy3e-6EYe4/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;'/&gt; The new &lt;a href='http://vcg.isti.cnr.it/Publications/2009/PTC09/' target='_blank'&gt;abstract surface parametrization algorithm&lt;/a&gt; in now inside MeshLab; currently it is a bit slow and buggy (well it is the first release) so sometime it can crash. The current version of the filter support only the remeshing side of the technique, e.g. you can create an abstract texture and then use it to remesh your model in a very nice way. Full texture parametrization of meshes ahead in the next version. &lt;br/&gt;* And obviously a lot of small bug issues....&lt;br/&gt;As usual release notes are &lt;a href='http://meshlab.sourceforge.net/wiki/index.php/Release_Notes_1.2.2' target='_blank'&gt;here&lt;/a&gt; in the wiki.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1096944551382286621?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1096944551382286621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1096944551382286621' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1096944551382286621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1096944551382286621'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/09/meshlab-v122-released.html' title='MeshLab V1.2.2 Released!'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_HhP1_0uO1dY/SqZnAATDaEI/AAAAAAAAAYU/dX0pJlvP6cI/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-8168311524999455887</id><published>2009-09-07T06:11:00.000-07:00</published><updated>2010-03-12T15:32:23.110-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D scanning'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='normal'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='Cultural Heritage'/><category scheme='http://www.blogger.com/atom/ns#' term='sampling'/><title type='text'>Meshing Point Clouds</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div style="text-align: justify;"&gt;One of the most requested tasks when managing 3D scanning data is the conversion of point clouds into more practical triangular meshes. Here is a step-by-step guide for transforming a raw point cloud into a colored mesh.&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SqRZbuHcfZI/AAAAAAAAAW8/Nrjd8wQW0QM/s1600-h/Teatro00.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378522187757813138" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SqRZbuHcfZI/AAAAAAAAAW8/Nrjd8wQW0QM/s200/Teatro00.png" style="cursor: pointer; float: right; height: 104px; margin: 0pt 0pt 10px 10px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Let's start from a colored point cloud (typical output of many 3D scanning devices), each point has just color and no normal information. The example dataset that we will use is a medium sized dataset of 9 millions of points. Typical issues of such a dataset dataset: it is non uniform (comes from an integration of different datasets), has some strongly biased error (alignment error, some problem during data integration), it comes without normals (hard to be shaded).&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Subsampling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SqRdJsk6OWI/AAAAAAAAAX0/BEwue1EaneQ/s1600-h/Teatro06.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378526276153391458" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/SqRdJsk6OWI/AAAAAAAAAX0/BEwue1EaneQ/s200/Teatro06.png" style="cursor: pointer; float: right; height: 104px; margin: 0pt 0pt 10px 10px; width: 200px;" /&gt;&lt;/a&gt; As a first step we reduce a bit the dataset in order to have amore manageable dataset. Many different options here. Having a nicely spaced subsampling is a good way to make some computation in a faster way. The &lt;i&gt;Sampling-&amp;gt;Poisson Disk Sampling&lt;/i&gt; filter is a good option. While it was designed to create Poisson disk samples over a mesh, it is able to also compute Poisson disk subsampling of a given point cloud (remember to check the 'subsampling' boolean flag). For the curious ones, it uses an algorithm very similar to the dart throwing paper presented at  &lt;a href="http://kesen.huang.googlepages.com/egsr2009Papers.htm"&gt;EGSR2009&lt;/a&gt; (except that we have released code for such an algorith long before the publication of this article :) ). In the invisible side figure a Poisson disk subsampling of just 66k vertices.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Normal Reconstruction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/SqRZc9nQfDI/AAAAAAAAAXM/Be0S71DQ5kc/s1600-h/Teatro02.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378522209097645106" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/SqRZc9nQfDI/AAAAAAAAAXM/Be0S71DQ5kc/s200/Teatro02.png" style="cursor: pointer; float: right; height: 104px; margin: 0pt 0pt 10px 10px; width: 200px;" /&gt;&lt;/a&gt; Currently inside MeshLab the construction of normals for a point cloud is not particularly optimized (I would not apply it over 9M point cloud) so starting from smaller mesh can give better, faster results. You can use this small point cloud to issue a fast surface reconstruction (using&lt;i&gt; Remeshing-&amp;gt;Poisson surface reconstruction&lt;/i&gt;) and then transfer the normals of this small rough surface to the original point cloud. Obviously in this way the full point cloud will have a normal field that is by far smoother than necessary, but this is not an issue for most surface reconstruction algorithms (but it is an issue if you want to use these normals for shading!).&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Surface reconstruction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/_HhP1_0uO1dY/SqRZdQL-H7I/AAAAAAAAAXU/xVEIprNkovM/s1600-h/Teatro03.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378522214083469234" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/SqRZdQL-H7I/AAAAAAAAAXU/xVEIprNkovM/s200/Teatro03.png" style="cursor: pointer; float: right; height: 104px; margin: 0pt 0pt 10px 10px; width: 200px;" /&gt;&lt;/a&gt;Once rough normals are available Poisson surface reconstruction is a good choice. Using the original point cloud with the computed normals we build a surface at the highest resolution (recursion level 11). Roughly clean it removing large faces filter, and eventually simplify it a bit (remove 30% of the faces) using classical &lt;i&gt;Remeshing-&amp;gt;Quadric edge collapse simplification&lt;/i&gt; filter (many implicit surface filters rely on marching cube like algorithms and leave useless tiny triangles).&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Recovering original color&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://4.bp.blogspot.com/_HhP1_0uO1dY/SqRZeKnZ9WI/AAAAAAAAAXc/C4J1AEX048s/s1600-h/Teatro04.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378522229767796066" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/SqRZeKnZ9WI/AAAAAAAAAXc/C4J1AEX048s/s200/Teatro04.png" style="cursor: pointer; float: right; height: 104px; margin: 0pt 0pt 10px 10px; width: 200px;" /&gt;&lt;/a&gt;Here we have two options, recovering color as a texture or recovering color as per-vertex color. Here we go for the latter, leaving the former to a next post where we will go in more details on the new automatic parametrization stuff that we are adding in MeshLab. Obviously if you store color onto vertexes you need to have a very dense mesh, more or less of the same magnitudo of the original point cloud, so probably refining large faces a bit could be useful. After refining the mesh you simply transfer the color attribute from the original point cloud to the reconstructed surface using the &lt;i&gt;vertex attribute transfer&lt;/i&gt; filter.&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Cleaning up and assessing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SqReuyiR3uI/AAAAAAAAAX8/o9XiQiXj42c/s1600-h/Teatro07.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378528012919758562" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/SqReuyiR3uI/AAAAAAAAAX8/o9XiQiXj42c/s200/Teatro07.png" style="cursor: pointer; float: right; height: 104px; margin: 0pt 0pt 10px 10px; width: 200px;" /&gt;&lt;/a&gt;The &lt;i&gt;vertex attribute transfer&lt;/i&gt; filter uses a simple closest point heuristic to match the points between the two meshes. As a side product it can store (in the all-purpose per-vertex scalar quality) the distance of the matching points. Now just selecting the faces having vertices whose distance is larger than a given threshold we can easily remove the redundant faces created by the Poisson Surface Reconstruction.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This pipeline is only one of the many possible way of ending up into a nice mesh. For example different choices could have been done for step 2/3. There are reconstruction algorithms that do not need surface normals, like for example the "Voronoi Filtering" that is an interpolating reconstruction algorithm (e.g. it build up only triangles on the given input points) but usually these filters works better on very clean datasets, without noise or alignment errors. Otherwise on noisy datasets it is easy that they create a lot of non manifold situations.  Final thanks to &lt;a href="http://www.cyi.ac.cy/user/1"&gt;Denis Pitzalis&lt;/a&gt; for providing me this nice dataset of a Cypriot theater.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-8168311524999455887?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/8168311524999455887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=8168311524999455887' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/8168311524999455887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/8168311524999455887'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/09/meshing-point-clouds.html' title='Meshing Point Clouds'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/SqRZbuHcfZI/AAAAAAAAAW8/Nrjd8wQW0QM/s72-c/Teatro00.png' height='72' width='72'/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-4062347025852193259</id><published>2009-08-18T16:43:00.000-07:00</published><updated>2009-08-19T18:01:12.728-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='Cultural Heritage'/><category scheme='http://www.blogger.com/atom/ns#' term='Siggraph'/><title type='text'>Computation &amp; Cultural Heritage  Siggraph Course</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SoyVOAUgRvI/AAAAAAAAAW0/ya7PnonA_TQ/s1600-h/Ripoll_poisson_10full.jpg"&gt;&lt;img style="margin: 0pt 0pt 1px 1px; float: right; cursor: pointer; height: 400px;" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/SoyVOAUgRvI/AAAAAAAAAW0/ya7PnonA_TQ/s400/Ripoll_poisson_10full.jpg" alt="" id="BLOGGER_PHOTO_ID_5371832523382867698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Shameless linking of the &lt;a href="http://vcg.isti.cnr.it/%7Ecignoni/CHCourse/"&gt;Computation &amp;amp; Cultural Heritage Siggraph Course&lt;/a&gt; where, a week ago, I gave my contribution. The course surveyed several practical CG techniques for applications in cultural heritage, archeology, and art history. Topics include: efficient/advanced/cheap techniques for 2D/3D digital capture of heritage objects, appropriate uses in the heritage field, an end-to-end pipeline for processing archeological reconstructions (with special attention to incorporating archeological data and review throughout the process), how digital techniques are actually used in cultural heritage projects, and an honest evaluation of progress and challenges in this field.&lt;br /&gt;&lt;br /&gt;Specifically to this blog in my first presentation I described a free &lt;span style="font-weight: bold; font-style: italic;"&gt;photo to 3D&lt;/span&gt; pipeline that relies on the free web-based service &lt;a style="font-style: italic;" href="http://www.arc3d.be/"&gt;&lt;span style="font-weight: bold;"&gt;Arc3D&lt;/span&gt;&lt;/a&gt; (&lt;span style="font-size:small;"&gt;developed during the &lt;a href="http://www.epoch-net.org/"&gt;Epoch&lt;/a&gt; EU project by &lt;a href="http://www.esat.kuleuven.be/psi/visics/"&gt;Visic&lt;/a&gt; of KUL&lt;/span&gt;) for &lt;a href="http://en.wikipedia.org/wiki/Structure_from_motion"&gt;Structure-from-Motion&lt;/a&gt; reconstruction and (obviously) on &lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;a href="http://www.meshlab.org"&gt;MeshLab&lt;/a&gt;&lt;/span&gt; for the processing of the generated 3D range maps. In practice it is a pipeline that allows to cheaply reconstruct nice accurate 3D models from just a set of high resolution photos. Obviously not all the subject fit with this kind of  approaches (forget moving subjects and glassy, shiny, fluffy, iridescent stuff), but for stable, dull, textured objects, it works surprisingly well, giving results with a quality not far from traditional laser based 3D scanning. More info on the process in the &lt;a href="http://vcg.isti.cnr.it/%7Ecignoni/CHCourse/"&gt;slides&lt;/a&gt; (and eventually in other posts here). In the top right picture a typical example of the results that you can obtain when starting from a reasonable set of photos of a detail of a weathered stone romanesque high relief (&lt;span style="font-size:small;"&gt;&lt;a href="http://commons.wikimedia.org/wiki/Category:P%C3%B3rtico_de_Ripoll"&gt;Monasterio de Santa María de Ripoll&lt;/a&gt;&lt;/span&gt;). The model is untextured, with just a bit of ambient occlusion: all you see is geometry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-4062347025852193259?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/4062347025852193259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=4062347025852193259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4062347025852193259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4062347025852193259'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/08/computation-cultural-heritage-siggraph.html' title='Computation &amp; Cultural Heritage  Siggraph Course'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HhP1_0uO1dY/SoyVOAUgRvI/AAAAAAAAAW0/ya7PnonA_TQ/s72-c/Ripoll_poisson_10full.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-7836144444158188459</id><published>2009-07-31T04:48:00.000-07:00</published><updated>2009-07-31T05:50:00.986-07:00</updated><title type='text'>Almost isometric mesh parameterization</title><content type='html'>A short post after a long inactivity just before going to Siggraph.&lt;br&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SnLeITmr7jI/AAAAAAAAAWM/ehLZeSC2yDY/s1600-h/total.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 196px; height: 200px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SnLeITmr7jI/AAAAAAAAAWM/ehLZeSC2yDY/s200/total.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364594340434538034" /&gt;&lt;/a&gt;&lt;br /&gt;Many users of MeshLab complained the lack of texturing tools. As you probably know perfect, nice, clean, robust, automatic texture parametrization is a kind of 'holy grail' in CG. There are many many solutions around and a huge literature on that, but no silver bullet.&lt;br /&gt;We (mostly &lt;a href="http://vcg.isti.cnr.it/~pietroni/"&gt;Nico&lt;/a&gt; and &lt;a href="http://vcg.isti.cnr.it/~tarini/"&gt;Marco&lt;/a&gt;) added our 5 cents to the literature with yet another approach [1] that is able to produce parametrizations that exhibit a very low distortion and are composed by a small number of large regular patches. The parametrization domain is a collection of equilateral triangular 2D regions enriched with explicit adjacency relationships (we call it abstract because no explicit 3D embedding is necessary). It is tailored in order to minimize the distortion, resulting in excellent parametrization qualities, even when meshes with complex shapes and topology are mapped into domains composed of a small number of large contiguous regions. &lt;br /&gt;&lt;br /&gt;&lt;object style="float:right; margin:0 0 10px 10px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/t4RC3H3Ab0Y&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/t4RC3H3Ab0Y&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="212" height="172"&gt;&lt;/embed&gt;&lt;/object&gt; An interesting consequence of having a texturing domain that is composed by 'abstract' equilateral triangles is that you can exploit this parametrization to build high quality remeshing that are better that the current state of the art. Look at the top figures to get an idea of the quality of the produced meshes. As usual all the gory details of the technique in the below paper preprint and a working open source implementation in the next versions of MeshLab. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;[1] Nico Pietroni, Marco Tarini, Paolo Cignoni, &lt;a href="http://vcg.isti.cnr.it/Publications/2009/PTC09/"&gt;Almost isometric mesh parameterization through abstract domains&lt;/a&gt;, IEEE Transaction on Visualization and Computer Graphics, Volume In press - 2009&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-7836144444158188459?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/7836144444158188459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=7836144444158188459' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/7836144444158188459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/7836144444158188459'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/07/almost-isometric-mesh-parameterization.html' title='Almost isometric mesh parameterization'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/SnLeITmr7jI/AAAAAAAAAWM/ehLZeSC2yDY/s72-c/total.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-6947502690349445064</id><published>2009-06-02T01:31:00.000-07:00</published><updated>2009-06-02T01:57:56.702-07:00</updated><title type='text'>MeshLab V1.2.1 Released!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SiTpdSHFRuI/AAAAAAAAAUA/pBnv8fzP8VM/s1600-h/MeshLab_AlphaShape.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 187px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SiTpdSHFRuI/AAAAAAAAAUA/pBnv8fzP8VM/s200/MeshLab_AlphaShape.png" alt="" id="BLOGGER_PHOTO_ID_5342651747255273186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Initially this release was planned just as a bug fixing release (a really needed one!): a couple of really annoying bugs infiltrated the 1.2.0 release, causing crashes for all the tools that involved a &lt;a href="http://en.wikipedia.org/wiki/Marching_cubes"&gt;marching cube&lt;/a&gt; processing and malfunctioning of the &lt;a href="http://en.wikipedia.org/wiki/U3D"&gt;U3D&lt;/a&gt; exporting. Now they should work well.&lt;br /&gt;&lt;br /&gt;In practice it is a feature rich release: as a bonus we have added some new nice functionalities (thanks to M. Sottile for implementing them): &lt;a href="http://meshlab.sourceforge.net/wiki/index.php/Qhull_Filter" title="Qhull Filter"&gt;Convex Hull, Alpha shape, Voronoi Filtering, and Visible points&lt;/a&gt; filters. These filters rely on the well known &lt;a href="http://www.qhull.org/"&gt;Qhull&lt;/a&gt; convex hull library.&lt;br /&gt;Convex hulls and Alpha shapes do not need extensive introduction, but a few notes on the two other filters are probably needed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Voronoi filtering&lt;/span&gt; implements the homonym surface reconstruction algorithm by &lt;a href="http://portal.acm.org/citation.cfm?id=276889"&gt;Nina Amenta and Marshall Bern&lt;/a&gt; that is able to reconstruct a nice interpolating triangulated mesh from a point clouds. It requires nicely sampled, low noise point clouds, but it works well.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;Visible Points&lt;/span&gt; filter implements a nice algorithm of  &lt;a href="http://portal.acm.org/citation.cfm?id=1276407"&gt;Sagi Katz, Ayellet Talfor and Ronen Basri&lt;/a&gt; for computing direct visibility of point clouds. It is a really really simple and smart trick that works well and it is really easy to be implemented (once you have a convex hull implementation).&lt;br /&gt;&lt;br /&gt;As usual, release notes are &lt;a href="http://meshlab.sourceforge.net/wiki/index.php/Release_Notes_1.2.1"&gt;here&lt;/a&gt; in the wiki.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-6947502690349445064?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/6947502690349445064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=6947502690349445064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/6947502690349445064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/6947502690349445064'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/06/meshlab-v121-released.html' title='MeshLab V1.2.1 Released!'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/SiTpdSHFRuI/AAAAAAAAAUA/pBnv8fzP8VM/s72-c/MeshLab_AlphaShape.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-3812560064045240518</id><published>2009-04-30T14:35:00.001-07:00</published><updated>2009-04-30T14:40:13.782-07:00</updated><title type='text'>MeshLab V1.2.0 Released!</title><content type='html'>After more than one year from version 1.1.1, the long, long waited MeshLab v.1.2.0 has&lt;br /&gt;been released! Jump over the main page and download it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.meshlab.org/"&gt;http://www.meshlab.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A sincere thank-you to every contributor and, in particular, to Guido Ranzuglia&lt;br /&gt;that has willingly taken the demanding and onerous task of coordinating&lt;br /&gt;(e.g. actually performing) the whole release process.&lt;br /&gt;Next release cycles, in particular for bug fixing releases, will be much&lt;br /&gt;shorter...&lt;br /&gt;With respect to v1.1.1 the list of new features is very very long, now more than 100 different filtering actions are provided. In the next post I will spot some of the most interseting algorithm that have been added.  In the meantime just download and try it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-3812560064045240518?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/3812560064045240518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=3812560064045240518' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/3812560064045240518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/3812560064045240518'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/04/meshlab-v120-released.html' title='MeshLab V1.2.0 Released!'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-6084398534768431380</id><published>2009-04-29T01:25:00.000-07:00</published><updated>2009-04-29T03:32:19.189-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cultural Heritage'/><title type='text'>MeshLab at Archeo-Foss (2)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SfghRyiNzBI/AAAAAAAAAT4/k2AzZeM9M2U/s1600-h/ArcheoFOSS_sala.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 139px;" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/SfghRyiNzBI/AAAAAAAAAT4/k2AzZeM9M2U/s200/ArcheoFOSS_sala.jpg" alt="" id="BLOGGER_PHOTO_ID_5330046748499758098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Yet another non technical post :)&lt;br /&gt;I have just returned from the Rome &lt;a href="http://www.archeo-foss.org/"&gt;ArcheoFoss workshop&lt;/a&gt;. Being one of the organizers I can be proud of the success of the event, more than 150 people from the archeological field attended to the event crowding the main room of the &lt;a href="http://www.cnr.it"&gt;CNR&lt;/a&gt; central building. I did not think that such a strictly focused event could attract such a wide audience; it seems that the intersection of people that have a genuine interest in Archeology, believe in open solutions, and live in Italy is a significant set :).&lt;br /&gt;We (&lt;a href="http://vcg.isti.cnr.it/joomla/index.php?option=com_content&amp;amp;task=view&amp;amp;id=167&amp;amp;Itemid=29" guido="" ranzuglia=""&gt;Guido Ranzuglia&lt;/a&gt; was the speaker) kept a short (40 min) tutorial on MeshLab, to a very interested, non computer scientist, audience; hopefully in a short time there should be a video available.&lt;br /&gt;Pleasant discoveries:  MeshLab is already well known in the field as a low cost alternative of the well known big names in 3D scanning processing tools. I also discovered that MeshLab was included in a &lt;a href="http://www.arc-team.com/archeos/wiki/doku.php"&gt;ArcheoOS&lt;/a&gt; a linux distribution targeted to Archeological people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-6084398534768431380?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/6084398534768431380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=6084398534768431380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/6084398534768431380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/6084398534768431380'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/04/meshlab-at-archeo-foss-2.html' title='MeshLab at Archeo-Foss (2)'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HhP1_0uO1dY/SfghRyiNzBI/AAAAAAAAAT4/k2AzZeM9M2U/s72-c/ArcheoFOSS_sala.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-4517940229995665958</id><published>2009-04-24T13:45:00.000-07:00</published><updated>2009-04-26T08:32:30.022-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Archeology'/><category scheme='http://www.blogger.com/atom/ns#' term='Cultural Heritage'/><title type='text'>MeshLab at Archeo-Foss</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HhP1_0uO1dY/SfIrN9tSBpI/AAAAAAAAATo/J-JELm0dq0g/s1600-h/logo_grande.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 170px;" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/SfIrN9tSBpI/AAAAAAAAATo/J-JELm0dq0g/s320/logo_grande.png" alt="" id="BLOGGER_PHOTO_ID_5328368828035499666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Just a short news about one of the many public presentation of MeshLab.&lt;br /&gt;This time we will talk about MeshLab at the &lt;a href="http://www.archeo-foss.org/"&gt;Archeo-Foss Workshop&lt;/a&gt;, the fourth Italian workshop on Free software, Open source and Open formats in the archaeological field. The workshop will be held in Rome on April 27-28, and it will be centered on the importance of open source sw and process in archaeology, not only considering the price issues, but also taking into account, long term sustainability and process documentation issues.&lt;br /&gt;&lt;br /&gt;As you can imagine in this field MeshLab well cover the role of the open source alternative of the various high priced systems for 3D scanning data processing (most of them are priced in the 10k~30k $ range). In the Cultural Heritage environment budget resources are ofter very scarce and cost issues are seriously considered. Here source solutions play a very important role.&lt;br /&gt;&lt;br /&gt;We often collaborate with many different CH institutions, working on wonderful ancient masterpieces. Something that often fully repay the effort done in the processing...&lt;br /&gt;&lt;br /&gt;Below a few of the Lunigiana &lt;a href="http://en.wikipedia.org/wiki/Statue_menhir"&gt;statue menhir&lt;/a&gt; that we recently acquired and processed (precisely &lt;a href="http://vcg.isti.cnr.it/joomla/index.php?option=com_content&amp;amp;task=view&amp;amp;id=14&amp;amp;Itemid=29"&gt;he&lt;/a&gt; did most of the job, thanks Marco!).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/SfIt0KAj2II/AAAAAAAAATw/r3TDdx1D8rc/s1600-h/modelli.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer; width: 275px; height: 184px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/SfIt0KAj2II/AAAAAAAAATw/r3TDdx1D8rc/s320/modelli.jpg" alt="" id="BLOGGER_PHOTO_ID_5328371683195869314" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-4517940229995665958?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/4517940229995665958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=4517940229995665958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4517940229995665958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4517940229995665958'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/04/meshlab-at-archeo-foss.html' title='MeshLab at Archeo-Foss'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HhP1_0uO1dY/SfIrN9tSBpI/AAAAAAAAATo/J-JELm0dq0g/s72-c/logo_grande.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-4385209558991821808</id><published>2009-04-15T15:07:00.000-07:00</published><updated>2009-04-15T16:00:00.307-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ambient occlusion'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh cleaning'/><category scheme='http://www.blogger.com/atom/ns#' term='internal face'/><title type='text'>How to remove internal faces with MeshLab</title><content type='html'>A very common situation that often arise the cleaning of a model with a detailed interior in&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SeZe8lKa16I/AAAAAAAAATU/xPccEGczoOA/s1600-h/LEGO1.jpg"&gt;&lt;img style="margin: 0px auto 10px; float: right; text-align: center; cursor: pointer; width: 230px; height: 193px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SeZe8lKa16I/AAAAAAAAATU/xPccEGczoOA/s320/LEGO1.jpg" alt="" id="BLOGGER_PHOTO_ID_5325048004273166242" border="0" /&gt;&lt;/a&gt; which you are &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; interested in (and you want to remove it once for ever!). For example consider this nice LEGO model: 200k faces. Most of the faces are hidden inside the model, used to describe the internal pieces and pegs: not very useful in most cases. We can remove them with MeshLab.&lt;br /&gt;&lt;br /&gt;After starting the filter &lt;span style="font-style: italic;"&gt;color-&gt;vertex ambient occlusion&lt;/span&gt; over the mesh (and after waiting a few seconds) we have computed both a per-vertex gray color and stored for each vertex an attribute with a occlusion value. Side note: MeshLab has a general purpose per vertex and per face scalar quantity that are used and interchanged by many different algorithms with a variety of different semantic; we call this scalar quantity &lt;span style="font-style: italic;"&gt;"quality"&lt;/span&gt; for no good reason (lazyness), it is a&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/SeZfRVNmyMI/AAAAAAAAATg/-PhFjmK-w6E/s1600-h/LEGO2.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 230px; height: 181px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/SeZfRVNmyMI/AAAAAAAAATg/-PhFjmK-w6E/s320/LEGO2.jpg" alt="" id="BLOGGER_PHOTO_ID_5325048360768817346" border="0" /&gt;&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;generic&lt;/span&gt; scalar quantity, it could be occlusion value (like in this case), a geodesic distance from border, gaussian curvature.&lt;br /&gt;&lt;br /&gt;Second note: &lt;a href="http://en.wikipedia.org/wiki/Ambient_occlusion"&gt;Ambient occlusion&lt;/a&gt; greatly enhance the perception of 3D shapes! Nowadays everyone recognizes it, but a few years ago not a lot of people was really aware of that (I am a proud user of AO since 2001 for &lt;a style="font-style: italic;" href="http://portal.acm.org/citation.cfm?id=585013"&gt;nice renderings of Cultural Heritage stuff&lt;/a&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;:) and, more recently, for &lt;a href="http://qutemol.sourceforge.net/"&gt;nice renderings of molecules&lt;/a&gt; ).&lt;br /&gt;&lt;br /&gt;Back to the topic of removal of internal faces.&lt;br /&gt;&lt;br /&gt;We now can exploit this per-vertex occlusion value to select all the faces that have all their three vertices with a very low occlusion value. That means that we remove all the faces that has no visible vertices. This is not an perfect solution, there are easy &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HhP1_0uO1dY/SeZbiqRXcxI/AAAAAAAAATM/r3W5nRORIxo/s1600-h/LEGO3.jpg"&gt;&lt;img style="margin: 0px auto 10px; float: right; text-align: center; cursor: pointer; width: 230px; height: 155px;" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/SeZbiqRXcxI/AAAAAAAAATM/r3W5nRORIxo/s320/LEGO3.jpg" alt="" id="BLOGGER_PHOTO_ID_5325044260432999186" border="0" /&gt;&lt;/a&gt;counter-examples where this approach could remove visible faces (but with hidden vertices): in most cases it works wells but a bit of caution is always recommended.&lt;br /&gt;In the side figure you can see the &lt;span style="font-style: italic;"&gt;select by vertex quality&lt;/span&gt; filter in action with the all the selected internal faces: 130k faces out of 200k were totally internal and can be safely removed leaving just 70k faces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-4385209558991821808?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/4385209558991821808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=4385209558991821808' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4385209558991821808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4385209558991821808'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/04/how-to-remove-internal-faces-with.html' title='How to remove internal faces with MeshLab'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/SeZe8lKa16I/AAAAAAAAATU/xPccEGczoOA/s72-c/LEGO1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-4567674591855476963</id><published>2009-04-10T13:17:00.000-07:00</published><updated>2009-04-14T16:41:17.573-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='normal'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex'/><title type='text'>On the computation of vertex normals</title><content type='html'>Computing per-vertex normal is usually a rather neglected task. There is a very popular solution that is usually considered reasonable and good for all purposes, until you hit some nasty counter-examples... Short summary of the most common approaches:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Compute an area weighted average of the normals of all the faces  incident on the vertex. This is the classical approach, very handy, just because if you compute your face normals using a simple cross product between two edges of a triangle, you get for free a normal vector whose length is twice the triangle area. So just summing the un-normalized cross products gives you the right weights. Referred many many times as THE method for computing per vertex normals.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Compute an angle weighted average of the normals of all the faces  incident on the vertex. Probably first seen on [1]. Mathematically sound, in the sense that it catch the limit behavior of the surface in a local neighborhood of the vertex.  Simple, but it requires some trigonometric computations, so it is usually neglected by hard core optimization fans.&lt;/li&gt;&lt;li&gt;Use the "Mean Weighted by Sine and Edge Length Reciprocal" proposed by N. Max [2]. One of the many possible variations of smart weighting with the nice property of NOT using trigonometric computations.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Without going into gory details (that you can find in [3]), you should know that the classical approach can give rise to some VERY counter-intuitive normals. Below a practical example of the difference between the above three algorithms. Note how the direction of the normals on the top of the thin up-wedges is strongly biased by the underlying tessellation. Yes this is a rather badly triangulated nasty example, but this stuff happens.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SeUcW-GOwBI/AAAAAAAAAS0/0tYrbWAc2FE/s1600-h/normals.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 489px; height: 253px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SeUcW-GOwBI/AAAAAAAAAS0/0tYrbWAc2FE/s320/normals.jpg" alt="" id="BLOGGER_PHOTO_ID_5324693315387310098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Just for fun (and to overcome a bug in another algorithm) we have added the three explicit methods for computing normals in the latest beta of MeshLab. Personal, un-scientific, subjective feelings:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;simple but dangerous&lt;/li&gt;&lt;li&gt;good&lt;/li&gt;&lt;li&gt;almost good&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] G. Thurmer, C. A. Wuthrich, "&lt;span style="font-style: italic;"&gt;Computing vertex normals from polygonal facets&lt;/span&gt;"&lt;br /&gt;Journal of Graphics Tools, 3 1998&lt;br /&gt;[2] Nelson Max, "&lt;span style="font-style: italic;"&gt;Weights for Computing Vertex Normals from Facet Normals&lt;/span&gt;", Journal of Graphics Tools, 4(2) (1999)&lt;br /&gt;[3] S. Jin, R.R. Lewis, D. West, "&lt;span style="font-style: italic;"&gt;A comparison of algorithms for vertex normal computations&lt;/span&gt;", The Visual Computer, 2005 - Springer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-4567674591855476963?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/4567674591855476963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=4567674591855476963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4567674591855476963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/4567674591855476963'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/04/on-computation-of-vertex-normals.html' title='On the computation of vertex normals'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/SeUcW-GOwBI/AAAAAAAAAS0/0tYrbWAc2FE/s72-c/normals.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1145123746718643815</id><published>2009-04-07T05:24:00.001-07:00</published><updated>2009-04-07T16:00:12.445-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D printing'/><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='voronoi'/><category scheme='http://www.blogger.com/atom/ns#' term='offset'/><title type='text'>Creating Voronoi Sphere (2)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvJ7US-U0I/AAAAAAAAAQo/eDxyyEBoZhw/s1600-h/Image6.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 182px; height: 200px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvJ7US-U0I/AAAAAAAAAQo/eDxyyEBoZhw/s200/Image6.png" alt="" id="BLOGGER_PHOTO_ID_5322069405566128962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Second part of the description of how &lt;a href="http://www.shapeways.com/model/14323/voronoi_sphere_100mm.html"&gt;this voronoi sphere&lt;/a&gt; was created.&lt;br /&gt;&lt;br /&gt;At the end of the &lt;a href="http://meshlabstuff.blogspot.com/2009/03/creating-voronoi-sphere.html"&gt;previous post&lt;/a&gt; we ended with a thin surface representing a sphere holed with a voronoi pattern.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; convert the paper-thin surface to a solid structure. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HhP1_0uO1dY/SdvKFfyPo8I/AAAAAAAAAQw/cSKINUKUNGQ/s1600-h/Image7.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 182px; height: 200px;" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/SdvKFfyPo8I/AAAAAAAAAQw/cSKINUKUNGQ/s200/Image7.png" alt="" id="BLOGGER_PHOTO_ID_5322069580448768962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This can be done by exploiting the offsetting capabilities of MeshLab. The filter "&lt;span style="font-style: italic;"&gt;Remeshing-&gt;Uniform Mesh Resampling&lt;/span&gt;". In this filter a mesh is re-sampled by building a uniform &lt;a href="http://en.wikipedia.org/wiki/Distance_field"&gt;distance-field &lt;/a&gt;volumetric representation where each voxel contains the signed distance from the original surface. The surface is then reconstructed using the &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Marching_cubes"&gt;marching cube&lt;/a&gt;&lt;/b&gt; algorithm over this volume. Resolution of the volume obviously affects the resolution (and the processing time!) of the final mesh. The distance field representation allows to easily create offset surfaces. There are various options for building offset surfaces, I will discuss them deeply in another post, for now just set the "Precision" parameter to 1.0%, and the offset value to 53.0% and check the "Absolute Distance" flag. After a few tens of secs you should get something like the side figure.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvKlt2R5GI/AAAAAAAAAQ4/uAqY7wB2J-8/s1600-h/Image8.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 182px; height: 200px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvKlt2R5GI/AAAAAAAAAQ4/uAqY7wB2J-8/s200/Image8.png" alt="" id="BLOGGER_PHOTO_ID_5322070133979604066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;simplify a bit to get rid of the bad triangulation quality of a Marching Cube (there are a lot of thin bad shaped triangles around), a percentage reduction of .75 is usually enough to both reduce a bit the size of the mesh and to improve its quality without affecting in a significant way the precision of the result.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HhP1_0uO1dY/SdvK8hTWi_I/AAAAAAAAARA/JTrgrUPL9KI/s1600-h/Image9.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 182px; height: 200px;" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/SdvK8hTWi_I/AAAAAAAAARA/JTrgrUPL9KI/s200/Image9.png" alt="" id="BLOGGER_PHOTO_ID_5322070525748874226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Apply a few times the &lt;span style="font-style: italic;"&gt;Filter Remeshing-&gt;Curvature flipping optimization&lt;/span&gt;, that improves how the triangles adapt to the shape of the curvature without increasing their number.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvLlcgscGI/AAAAAAAAARI/ZtdOryB6a7c/s1600-h/Image10.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 182px; height: 200px;" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvLlcgscGI/AAAAAAAAARI/ZtdOryB6a7c/s200/Image10.png" alt="" id="BLOGGER_PHOTO_ID_5322071228837294178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Refine and smooth up to a mesh of approx 1.000.000 triangles.&lt;br /&gt;A rather overtessellated mesh is needed here to guarantee a good approximation of the geodesic distance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;At this point we repeat no this dense mesh the same steps we did on the original sphere. E.g. all the steps described in the previous post:&lt;/li&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; Generate 1000 poisson samples over the surface (it takes a bit of time this time...)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvMnLOn_ZI/AAAAAAAAARQ/jZBHQm30F_c/s1600-h/Image11.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 64px; height: 71px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvMnLOn_ZI/AAAAAAAAARQ/jZBHQm30F_c/s200/Image11.png" alt="" id="BLOGGER_PHOTO_ID_5322072358069468562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Color the mesh according to the back distance from these samples (voronoi coloring filter)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvM1cb8yOI/AAAAAAAAARY/qnacF4Jqb64/s1600-h/Image13.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 64px; height: 70px;" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvM1cb8yOI/AAAAAAAAARY/qnacF4Jqb64/s200/Image13.png" alt="" id="BLOGGER_PHOTO_ID_5322072603206928610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; select the faces with quality in the range 0..epsilon&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvM1cb8yOI/AAAAAAAAARY/qnacF4Jqb64/s1600-h/Image13.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HhP1_0uO1dY/SdvM9tduLWI/AAAAAAAAARg/1QrpWnQ2Xng/s1600-h/Image14.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 64px; height: 70px;" src="http://2.bp.blogspot.com/_HhP1_0uO1dY/SdvM9tduLWI/AAAAAAAAARg/1QrpWnQ2Xng/s200/Image14.png" alt="" id="BLOGGER_PHOTO_ID_5322072745216716130" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvM1cb8yOI/AAAAAAAAARY/qnacF4Jqb64/s1600-h/Image13.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt; invert selection and delete&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvNaAmV4qI/AAAAAAAAARo/PyQZRJY5u8A/s1600-h/Image16.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 64px; height: 70px;" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/SdvNaAmV4qI/AAAAAAAAARo/PyQZRJY5u8A/s200/Image16.png" alt="" id="BLOGGER_PHOTO_ID_5322073231389483682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; offset the thin surface to convert it into a watertight solid object. This final offsetting obviously require an higher precision (and higher processing times).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/SdvNhytTMpI/AAAAAAAAARw/opkQCCX-BRI/s1600-h/Image18.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 64px; height: 70px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/SdvNhytTMpI/AAAAAAAAARw/opkQCCX-BRI/s200/Image18.png" alt="" id="BLOGGER_PHOTO_ID_5322073365099524754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some iteration of simplify-optimize-refine-smooth just to beautify the final mesh.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;And that's all! Varying a bit the parameters in the middle of the whole process greatly affect the final result. For example you can easily get a fat  donut style by increasing the offsetting value. Below a high res snap done with meshlab with ambient occlusion, and thin antialiased wire frame lines.  A real, touchable 3D print of the object can be obtained on &lt;a href="http://www.shapeways.com/model/14323/voronoi_sphere_100mm.html"&gt;Shapeways&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvPY4cIolI/AAAAAAAAAR4/h2o_3NkYzaE/s1600-h/voronoi2Snap01.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer; width: 200px; height: 191px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvPY4cIolI/AAAAAAAAAR4/h2o_3NkYzaE/s200/voronoi2Snap01.png" alt="" id="BLOGGER_PHOTO_ID_5322075411042574930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1145123746718643815?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1145123746718643815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1145123746718643815' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1145123746718643815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1145123746718643815'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/04/creating-voronoi-sphere-2.html' title='Creating Voronoi Sphere (2)'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/SdvJ7US-U0I/AAAAAAAAAQo/eDxyyEBoZhw/s72-c/Image6.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1859404908492461611</id><published>2009-03-29T13:58:00.000-07:00</published><updated>2009-03-29T15:21:38.817-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mesh conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='sampling'/><title type='text'>On the storage of Color in meshes</title><content type='html'>A very short post to clarify a bit the ways in which people can store color (and other) information on a mesh. AFAIK there are mostly three ways to keep color:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Per-vertex&lt;/span&gt;: each vertex stores a color. A triangular face can have vertexes of different color and inside a triangle the color is linearly interpolated. Color is smooth across the surface.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Per face&lt;/span&gt;: each face has a distinct color. You can easily see the discontinuity of colors among the faces (no interpolation is usually done.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;As texture&lt;/span&gt;: the most general way that is reasonably decoupled from the mesh itself. You only need a good parametrization.&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;In MeshLab most of the algorithms (painting, color processing etc.) manage per-vertex color, but a few conversion tools are provided.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;per-vert -&gt; per -face&lt;br /&gt;&lt;/li&gt;&lt;li&gt;per-face -&gt; per-vert&lt;/li&gt;&lt;li&gt;texture -&gt; per-vert&lt;/li&gt;&lt;/ul&gt;A per-vert -&gt; texture is strikingly missing :). To be added in the very near future. Obviously assuming the previous existence of a parametrization...&lt;br /&gt;A fourth technique could be mentioned, keeping stuff per wedge, i.e. for each corner of the face we can store different colors (or other attributes), but this approach is rather unused (it can be simulated by duplicating vertices).&lt;br /&gt;Below a few images showing the difference between the three modes on a small (40k tri) mesh; respectively: no color (to give you an idea of mesh density), color by texture, per vertex color, per face color.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;                                     &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc_vJuTRN_I/AAAAAAAAAQA/g_vRsHPjq7Y/s1600-h/texturedknotSnap02.png"&gt;&lt;img style="margin: 0px auto 10px; display: inline; text-align: center; cursor: pointer; width: 200px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc_vJuTRN_I/AAAAAAAAAQA/g_vRsHPjq7Y/s200/texturedknotSnap02.png" alt="" id="BLOGGER_PHOTO_ID_5318732635274557426" border="0" /&gt;&lt;/a&gt;           &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc_yaqdcRFI/AAAAAAAAAQg/LIS766bVuKQ/s1600-h/texturedknotSnap04.png"&gt;&lt;img style="margin: 0px auto 10px; display: inline; text-align: center; cursor: pointer; width: 200px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc_yaqdcRFI/AAAAAAAAAQg/LIS766bVuKQ/s200/texturedknotSnap04.png" alt="" id="BLOGGER_PHOTO_ID_5318736224836142162" border="0" /&gt;&lt;/a&gt;            &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc_vKk4sdLI/AAAAAAAAAQQ/F-KN9a94j5c/s1600-h/texturedknotSnap01.png"&gt;&lt;img style="margin: 0px auto 10px; display: inline; text-align: center; cursor: pointer; width: 200px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc_vKk4sdLI/AAAAAAAAAQQ/F-KN9a94j5c/s200/texturedknotSnap01.png" alt="" id="BLOGGER_PHOTO_ID_5318732649927046322" border="0" /&gt;&lt;/a&gt;            &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/Sc_vLPmlIMI/AAAAAAAAAQY/ejuC94wlMgQ/s1600-h/texturedknotSnap00.png"&gt;&lt;img style="margin: 0px auto 10px; display: inline; text-align: center; cursor: pointer; width: 200px;" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/Sc_vLPmlIMI/AAAAAAAAAQY/ejuC94wlMgQ/s200/texturedknotSnap00.png" alt="" id="BLOGGER_PHOTO_ID_5318732661393793218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1859404908492461611?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1859404908492461611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1859404908492461611' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1859404908492461611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1859404908492461611'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/03/on-storage-of-color-in-meshes.html' title='On the storage of Color in meshes'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc_vJuTRN_I/AAAAAAAAAQA/g_vRsHPjq7Y/s72-c/texturedknotSnap02.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-7737632266859367035</id><published>2009-03-27T15:49:00.000-07:00</published><updated>2009-03-27T17:30:18.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D printing'/><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='voronoi'/><category scheme='http://www.blogger.com/atom/ns#' term='sampling'/><title type='text'>Creating Voronoi Sphere</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc1bGs-DNTI/AAAAAAAAAPI/Egt7VOlqPc4/s1600-h/sferaB.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 174px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc1bGs-DNTI/AAAAAAAAAPI/Egt7VOlqPc4/s200/sferaB.JPG" alt="" id="BLOGGER_PHOTO_ID_5318006905703183666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;MeshLab is quite useful for a lot of classical mesh processing tasks, but sometimes it can be used for more weird things. A few weeks ago, after stumbling upon the cool &lt;a href="http://www.shapeways.com/shops/aloopingicon"&gt;Shapeways &lt;/a&gt;3D printing service I uploaded there a few &lt;span style="font-style: italic;"&gt;artsy &lt;/span&gt;mathematical sculptures that I created with MeshLab. Here is how I did &lt;a href="http://www.shapeways.com/model/14323/voronoi_sphere_100mm.html"&gt;this one&lt;/a&gt;, called Voronoi sphere.&lt;br /&gt;It is a double &lt;a href="http://en.wikipedia.org/wiki/Voronoi"&gt;Voronoi &lt;/a&gt;diagram, in the sense that there is a coarse Voronoi diagram over the sphere surface but also the surface that creates the edges of this diagram has been carved to create another finer Voronoi diagram. Such a shape is really very light and thin but much more robust that you could imagine.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1pM79ZVJI/AAAAAAAAAPQ/u9IRiipQh18/s1600-h/Image1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 100px; height: 109px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1pM79ZVJI/AAAAAAAAAPQ/u9IRiipQh18/s200/Image1.png" alt="" id="BLOGGER_PHOTO_ID_5318022405968974994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Start from a sphere (&lt;span style="font-style: italic;"&gt;file-&gt;new-&gt;Sphere&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc1pqYwsqcI/AAAAAAAAAPY/cffm5w01fSU/s1600-h/Image2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 100px; height: 109px;" src="http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc1pqYwsqcI/AAAAAAAAAPY/cffm5w01fSU/s200/Image2.png" alt="" id="BLOGGER_PHOTO_ID_5318022911916550594" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Refine it using  &lt;span style="font-style: italic;"&gt;Filter&gt;Remeshing&gt;Loop Subdivision surfaces&lt;/span&gt;. repeat without shame (lowering the edge threshold parameter) until it becomes reasonably well tessellated. 300k faces are enough.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create some well distributed samples over the surface using &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1p-A64iGI/AAAAAAAAAPg/wSj5goxeuZk/s1600-h/Image3.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 100px; height: 109px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1p-A64iGI/AAAAAAAAAPg/wSj5goxeuZk/s200/Image3.png" alt="" id="BLOGGER_PHOTO_ID_5318023249114204258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Filter&gt;Sampling&gt;Poisson&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Disk Sampling&lt;/span&gt;. 50 points are a good choice. Apparently the filters does nothing, but if you reveal the layer panel (guess the icon in the toolbar :)), you can see that there are two layers. Make invisible the first layer and switch the rendering mode to points: you will see the well distributed Poisson samples (hint: &lt;span style="font-style: italic;"&gt;alt+mouse wheel &lt;/span&gt;change the drawn size of the points).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create the actual Voronoi diagram by simply choosing the filter &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1qayAt4FI/AAAAAAAAAPo/EcRLSq251vs/s1600-h/Image4.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 100px; height: 109px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1qayAt4FI/AAAAAAAAAPo/EcRLSq251vs/s200/Image4.png" alt="" id="BLOGGER_PHOTO_ID_5318023743328346194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Color&gt;Voronoi Vertex &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Coloring&lt;/span&gt;. As reported in the top of the parameter window, this filter,  given a mesh &lt;span style="font-style: italic;"&gt;M&lt;/span&gt; and a point-set &lt;span style="font-style: italic;"&gt;P&lt;/span&gt;, project the points of &lt;span style="font-style: italic;"&gt;P&lt;/span&gt; over &lt;span style="font-style: italic;"&gt;M&lt;/span&gt; and color each vertex of &lt;span style="font-style: italic;"&gt;M&lt;/span&gt; according to the geodesic distance from these projected points. Marking the &lt;span style="font-style: italic;"&gt;backdistance &lt;/span&gt;flag in the parameter window the filter computes the distance from the borders of the Voronoi diagram instead of the projected sites itself.  This filter, beside coloring the mesh, writes on each vertex of the mesh the distance value itself, in the all-purpose attribute named '&lt;span style="font-style: italic;"&gt;quality&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HhP1_0uO1dY/Sc1qkUfCkEI/AAAAAAAAAPw/cjN5dmQg9lM/s1600-h/Image5.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 100px; height: 109px;" src="http://3.bp.blogspot.com/_HhP1_0uO1dY/Sc1qkUfCkEI/AAAAAAAAAPw/cjN5dmQg9lM/s200/Image5.png" alt="" id="BLOGGER_PHOTO_ID_5318023907201159234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make the mesh layer active, and start the &lt;span style="font-style: italic;"&gt;Select by vertex Quality &lt;/span&gt;filter. enable the preview option and enable visualization of selected faces. Play with the slider until you get something similar to the image on the right; in practice, exploiting the &lt;span style="font-style: italic;"&gt;quality &lt;/span&gt;value stored onto the vertices that code the distance from the border of the Voronoi diagram we have just selected the faces very near to these borders.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1qlHUohGI/AAAAAAAAAP4/bcTot6SC1Ck/s1600-h/Image6.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 100px; height: 109px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/Sc1qlHUohGI/AAAAAAAAAP4/bcTot6SC1Ck/s200/Image6.png" alt="" id="BLOGGER_PHOTO_ID_5318023920847717474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apply the &lt;span style="font-style: italic;"&gt;Filter&gt;Selection&gt;Invert Selection &lt;/span&gt;and then delete the selected faces. Edges are probably quite jaggy, so apply a couple of times the simplest of all the smoothing filter, the old classical laplacian filter (Filter&gt;Smoothing&gt;Laplacian Smoothing). &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Now stop and save the mesh. Next post will show you how to continue by transforming the current mesh, that is a surface, into a solid object ready to be printed. In the meantime if you like the sculpture, you can buy a small (10 cm) and cheap (less than 20$) copy of this sculpture &lt;a href="http://www.shapeways.com/model/14323/voronoi_sphere_100mm.html"&gt;here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-7737632266859367035?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/7737632266859367035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=7737632266859367035' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/7737632266859367035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/7737632266859367035'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/03/creating-voronoi-sphere.html' title='Creating Voronoi Sphere'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HhP1_0uO1dY/Sc1bGs-DNTI/AAAAAAAAAPI/Egt7VOlqPc4/s72-c/sferaB.JPG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-1708069771209744412</id><published>2009-03-25T01:51:00.001-07:00</published><updated>2009-03-25T17:57:21.460-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='latex'/><category scheme='http://www.blogger.com/atom/ns#' term='Movie15'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh'/><category scheme='http://www.blogger.com/atom/ns#' term='U3D'/><title type='text'>Creating Interactive 3D objects inside a PDF</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/Scn8a3RlRSI/AAAAAAAAAOw/KVpArFXOkwE/s1600-h/LauranaPDF.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 190px; height: 266px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/Scn8a3RlRSI/AAAAAAAAAOw/KVpArFXOkwE/s320/LauranaPDF.png" alt="" id="BLOGGER_PHOTO_ID_5317058373532075298" border="0" /&gt;&lt;/a&gt;One of the nice feature of MeshLab is its ability of saving meshes, in a variety of formats. Support for saving meshes in &lt;a href="http://en.wikipedia.org/wiki/U3D"&gt;U3D&lt;/a&gt; format is useful for creating, using &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/LaTeX"&gt;LaTeX&lt;/a&gt;, cool appealing PDFs with embedded 3D models.&lt;br /&gt;&lt;br /&gt;Yes, that means that when, using a plain Acrobat Reader, you open a pdf like &lt;a href="http://meshlab.sourceforge.net/wiki/images/c/cc/Laurana.pdf"&gt;this one&lt;/a&gt;, you will be able to freely interact with the &lt;span style="font-weight: bold; font-style: italic;"&gt;3D&lt;/span&gt; model, directly inside the text.&lt;br /&gt;&lt;br /&gt;To generate such a pdf you simply need to convert your mesh into u3d format, and include the small snip of latex code generated by MeshLab with the right viewing parameters, in your latex document and simply compile it with pdflatex. Thanks to the &lt;a href="http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=movie15"&gt;Movie15&lt;/a&gt; latex package, you will have your u3D embedded in the pdf. Note that the u3d file format is quite compact; for an example you can look at this &lt;a href="http://meshlab.sourceforge.net/wiki/images/c/cc/Laurana.pdf" class="internal" title="Laurana.pdf"&gt;pdf&lt;/a&gt; that contains the 50k triangle mesh of the Laurana's bust squeezed to less than 250 kb. A zip with sources (latex and u3d file) can be found &lt;a href="http://meshlab.sourceforge.net/wiki/images/b/bb/Laurana_tex.zip" class="internal" title="Laurana tex.zip"&gt;here&lt;/a&gt;. &lt;p&gt;A couple of notes. The conversion process is done through the use of the Universal 3D Sample Software by directly using the IDTF converter provided with the sample library. The conversion process can take a fairly long processing time (many seconds for a mesh composed by 50k triangles) so be patient! Moreover be careful that the process can fail when involving pathnames with non trivial chars. Moreover very large meshes take a LONG time to be converted, be patient...  Acrobat reader support this kind of files since ver. 7.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-1708069771209744412?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/1708069771209744412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=1708069771209744412' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1708069771209744412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/1708069771209744412'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/03/creating-interactive-3d-objects-inside.html' title='Creating Interactive 3D objects inside a PDF'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HhP1_0uO1dY/Scn8a3RlRSI/AAAAAAAAAOw/KVpArFXOkwE/s72-c/LauranaPDF.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-360190752316026926</id><published>2009-03-23T14:55:00.000-07:00</published><updated>2009-03-27T17:32:16.178-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mesh processing'/><category scheme='http://www.blogger.com/atom/ns#' term='mesh cleaning'/><category scheme='http://www.blogger.com/atom/ns#' term='watertight'/><title type='text'>On the subtle art of mesh cleaning</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HhP1_0uO1dY/ScgVUDRlwKI/AAAAAAAAAOg/WSeffDhzgdc/s1600-h/DuplicatedVertices.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 127px; height: 153px;" src="http://4.bp.blogspot.com/_HhP1_0uO1dY/ScgVUDRlwKI/AAAAAAAAAOg/WSeffDhzgdc/s320/DuplicatedVertices.png" alt="" id="BLOGGER_PHOTO_ID_5316522794331521186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Most mesh processing algorithms usually require nice two-manifold, watertight, intersection free, well-shaped, clean meshes. Obviously in the real world this does not happen with a great frequency (apart in scientific papers). Common meshes are the most horrible mix of all the possible almost catastrophic degenerate situations.&lt;br /&gt;&lt;br /&gt;MeshLab can help the tedious tasks of cleaning meshes in a variety of ways. Let's start with some simple examples involving vertices.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Unreferenced Vertices&lt;/span&gt;. Very common issue. Your mesh has some vertices that are not referenced by any triangle. A variety of cause can create these situations (algorithms deleting faces in a non careful way can create them).  This situation can be more dangerous than it seems, because they can bring in trash uninitialized data in algorithms that initialize vertex data performing face-based traversal (e.g. normals computations...).&lt;br /&gt;An easy way to look at the presence of these vertices is simply switching to a point based rendering mode (evenually turning the lighting off, because, by default, unreferenced vertices have null normals). As always happens, sometime this situation is not an error but could be a feature (think to &lt;a href="http://en.wikipedia.org/wiki/Point_cloud"&gt;point clouds&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Duplicated vertices&lt;/span&gt;. Adjacent triangles does not share the vertices with the same coordinates. Sometimes it is an issue that come directly from some file formats (&lt;a href="http://en.wikipedia.org/wiki/STL_%28file_format%29"&gt;STL  &lt;/a&gt;for example store triangles duplicating each vertex). This situation is easy to be detected:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Smooth_shading#Flat_vs_smooth_shading"&gt;Smooth shading&lt;/a&gt; is the same of flat shading: the duplicated vertices do not allow the averagin of normals between adjacent faces that is necessary for smooth shading.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Poor man version of &lt;a href="http://en.wikipedia.org/wiki/Euler_characteristic#Polyhedra"&gt;Euler Characteristic&lt;/a&gt; does not work: instead of having:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;[&lt;/span&gt;&lt;span style="font-style: italic;"&gt;face number] ~ 2 *  &lt;/span&gt; [&lt;span style="font-style: italic;"&gt;vertex&lt;/span&gt;&lt;span style="font-style: italic;"&gt; number]&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;you have:&lt;br /&gt;&lt;div style="text-align: center;"&gt; [&lt;span style="font-style: italic;"&gt;face number] &lt;/span&gt;&lt;span style="font-style: italic;"&gt;~ 1/3 * &lt;/span&gt;[&lt;span style="font-style: italic;"&gt;vertex&lt;/span&gt;&lt;span style="font-style: italic;"&gt; number]&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;Again this could be a feature and not an error. Sometimes, duplicating vertices can be used to impose sharp angles when you do not have simple techniques to store multiple normals for the same vertex.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;The above cases can be cured, if necessary, by invoking in MeshLab the two filters, &lt;span style="font-style: italic;"&gt;Remove Unreferenced Vertices&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Remove Duplicated Vertices&lt;/span&gt; in the menu named: &lt;span style="font-style: italic;"&gt;Filters-&gt;Cleaning and Repairing&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-360190752316026926?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/360190752316026926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=360190752316026926' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/360190752316026926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/360190752316026926'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/03/on-subtle-art-of-mesh-cleaning.html' title='On the subtle art of mesh cleaning'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HhP1_0uO1dY/ScgVUDRlwKI/AAAAAAAAAOg/WSeffDhzgdc/s72-c/DuplicatedVertices.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5333957751769755809.post-868802275458978869</id><published>2009-03-23T07:14:00.000-07:00</published><updated>2009-03-23T07:44:52.642-07:00</updated><title type='text'>First Post</title><content type='html'>A bit of introduction on the purpose of this blog.&lt;br /&gt;The most common comment that I receive from people that see MeshLab in use is&lt;span style="font-style: italic;"&gt; "wow, I did'nt know it could be done..." &lt;/span&gt;&lt;br /&gt;The main idea is to report here examples of trivial and less trivial uses of MeshLab in real, on the field (more or less), practical, applications.&lt;br /&gt;&lt;br /&gt;A first note. All the posts will refer to stuff done with the latest available betas, e.g. the ones that you can download from the &lt;a href="http://meshlab.sourceforge.net/wiki"&gt;Wiki&lt;/a&gt; of MeshLab:&lt;br /&gt;&lt;a href="http://meshlab.sourceforge.net/wiki/index.php/Betabuilds"&gt;Beta Version of MeshLab&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5333957751769755809-868802275458978869?l=meshlabstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://meshlabstuff.blogspot.com/feeds/868802275458978869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5333957751769755809&amp;postID=868802275458978869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/868802275458978869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5333957751769755809/posts/default/868802275458978869'/><link rel='alternate' type='text/html' href='http://meshlabstuff.blogspot.com/2009/03/first-post.html' title='First Post'/><author><name>ALoopingIcon</name><uri>http://www.blogger.com/profile/10223359091507522354</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
