Hull surface from point cloud measurements

I want to make the hull surface of a 12m traditional wooden boat from point cloud measurements.

In order to do that, Ihave experimented both taking intersections directly in the point cloud with the pointcloudcontour and pointsection commands, and taking intersections through a mesh, produced with the help of cockroach plug in.

The sections (frames) and waterlines taken both from the pointcloud and the mesh, are far from perfect.
As you can see in the picture, the pink frames (produced by the pointcloudcontour command) are comprised of two lines, one is smoother and the other is chunckier. The black frames (produced by the the contour command) have been taken from the mesh and seem a little better than the lines produced directly from the pointcloud.

In the other two pics you can see the mesh and point cloud respectively.

I tried to use “quad remesh” to improve the mesh without success.

Does anyone has experience with these procedures?

It looks like - excuse my language - “garbage in/garbage out”. Your point cloud will be noisy because of the measurement uncertainty. Whether you make it into a mesh or not does not really matter, the result is also noisy when you make sections, as you have experienced.

Maybe using Fair command, or FitCrv will help here, after converting to degree-3 curves (it looks like polylines?).


I have created many hull surfaces starting with a dense point cloud from photogrammetry. I usually export the point cloud as a textured mesh from the photogrammetry software (Metashape). I separate the stem, keel, sternpost, etc from the planking.

I usually have the point cloud/mesh in one file and create the model in a separate file. I use Worksession with both files attached which lets me use the point clould/mesh as reference while keeping the model file smaller.

The basics of the procedure are:

Orient the point cloud in the coordinate system as desired. I use the YZ plane as the centerplane. Waterlines are parallel to the XY plane.

Contour the surface. Typically I create stations (normal to the X axis), waterlines (normal to the Z axis) and buttocks (normal to the Y axis). The spacing is closer than what is typically used for a lines plane. For a 12m boat such as in the image above I typically use 0.3m to 0.5m spacing for the stations, and 0.2m to 0.4m spacing for the waterlines and buttocks.

Decide if a single surface can be used for the entire hull or if multiple surfaces will be needed. For a stem which smoothly curves into keel I usually used Method C of Boat hulls with smoothly curve stems - how to model

Create curves for the boundaries of the surfaces. InterpCrv by clicking on the contour curves where desired; or Points to create points on the contours and CurveThroughPt to create the curves. Fair the curves as desired.

Extend or DynamicExtend curves as needed to create bounding curves for four sided surfaces. Sometimes but not always I will also create some intermediate section curves to use with Sweep1.

EdgeSrf to create initial surfaces. Or if there are intermediate station curves then Sweep2 to create initial surfaces. These surfaces will probably have major deviations for the point cloud/mesh. This is okay. They only need to be close enough to the point cloud/mesh at the boundaries.

Divide the contour curves and the edge curves using the Length option to obtain input points for patch. For a 12m boat I typically use a 25mm to 100mm spacing for the points.

Next Patch command will be used to have the surfaces conform to the point cloud/mesh/
Patch command
Select the input points for a surface.
“Select starting surface” option
Select the initial surface for that set of input points.
Check “Preserve edges” box.
“Starting surface pull” of 0.1 or less.
Enter to complete.

Repeat Patch proeceedure for each surface.

Match and fair the surfaces as desired.

PointDeviation can be used to check how closely the surfaces conform to the input points.

Perhaps I should make a video demonstrating this proceedure.


I find RebuildCrvNonUniform or Rebuild usually give better results than Fair. Deviation of the rebuilt curve from the input can be checked using CrvDeviation. Some experimentation with command parameters may be need to balance smoothing, accuracy and number of control points.


Worksession probably…

1 Like

Correct. Worksession

1 Like

heritage-05-00067-v2.pdf (9.5 MB)

Dear David,

Thank you for your substatial reply!
As I understand, you never use the point cloud, as it is, to take contours but a high quality mesh, that is generated outside Rhino, which allows you to produce clean and accurate “contours”. So, as I understand, you don’t need to fair these produced lines, but they are ready to be used for surfacing.

Attached is a paper about the "reconstruction & Modeling of a wooden traditional hull. What puzzled me a little, is that they use a somewhat anorthodox procedure,as the take contours throughthe point cloud and then interpolates these lines with new smooth ones. Do you think, this procedure as appropriate?

@george Incorrect. I start with a dense point cloud or a mesh with roughness similar to yours. When I contour it the contours have roughness similar to your contours. I then follow the procedure I described to obtain smooth surfaces using these contours as input. The Patch command will take an initial starting surface and adjust it to the best fit to a set of input points. The number of input points can be orders of magnitude greater than the number of surface control points.

1 Like

I have also used a procedure very similar to the one described in the paper. Why do you describe it a s “anorthodox”?

1 Like

If you don’t mind me asking (this will help with some workflow suggestions) - what is the end goal for your surfaces/model?

1 Like

Rhino 8 ShrinkWrap command automatically transforms any point cloud into very clean mesh.

Sometimes it is useful to divide original point cloud into smaller point clouds before running the ShrinkWrap command. SelVolumeObject command seems to be the best command for this purpose.

1 Like

The purpose is:

  • To produce full lines and constructional plans of the boat.

  • To study the hydrostatics,stability and resistance mainly with the help of Rhino + Orca.

  • List item

I tried Rhino 8 ShrinkWrap, a few days ago. Indeed the the produced mesh is very clean!
However, if I undestood well, the shrinkwrap command, is always wrapping a mesh around the point cloud. I tinkered with the “target edge Length” in the command’s menu, but I couldnt make the distance between the two layers of the mesh infinitely small, so when I applied the contour command, I took two lines, within a distance between them. Maybe , I am something here?

Because, when we make a new line, following the path of another line, trying to eliminate the imperfections of this line, we may alter somewhat the original shape of the hull we measured

Ah you should be good then! I’d just say that it’s entirely possible you end up making two models. I’d suggest working on the ShrinkWrap workflow for the CFD work - that should get you something useable and water tight - albeit very dense. For the lines/plans work, it sounds like you’re more after documenting what’s there, and so for that, realize that maybe a full 3d model is not even necessary?

1 Like

It’s so much easier starting from scratch in Rhino!!!


Dear David, I am just wondering, and I would like to ask you, if we consider, that the contours taken from the pointCloud directly are acceptable, then why bother take a mesh from the pointcloud?

I have been importing and contouring meshes instead of point clouds for several reasons:

The photogrammetry software I use, Metashape, can generate point clouds with tens of millions of points. The large number of points helps with defining details such as rail edges but can significantly slow Rhino. Metashape effectively and efficiently can create a decimated mesh with a user requested number of faces. The mesh generation in Metashape does a reasonable but not great job of retaining detail in tightly curve areas, corners and edges while using larger faces in flatter areas.

I usually photo texture the mesh in Metashape. When imported into Rhino the result is sharper definition of details such as rabbets and plank seams than is available using only point colors. I frequently will select manually points on contours in the middle of a seam or at the bottom of rail when creating bounding curves for surface generation.

1 Like