Surfacing · Tutorial

Reverse Engineer a Scanned Mesh

Rebuild the front fender and hood of a scanned car body into clean, manufacturable surfaces. Use Gumball Control Polygon and SoftTransform to pull every surface back onto the scan without breaking continuity.

60–90 minRhino 9 for Windows / MacAdvanced
Reverse Engineer a Scanned Mesh

A 3D scan gives you a dense, noisy mesh. It’s not a model you can hand off for manufacturing, analysis, or further development. This tutorial reconstructs the front fender and hood of a scanned car body as eight clean, continuity-matched surfaces, using a handful of Rhino 9’s new surfacing tools: Rebuild to fit curves to the scan, Gumball: Control Polygon to massage control points directly on the surface, and SoftTransform to keep neighboring surfaces from drifting apart while you do it.

What you'll learn

Get Started

  1. Download and open the reference.3dm file. It contains the scanned mesh and nothing else. Every curve and surface in this tutorial gets built from scratch.
  2. Make sure the Mesh Osnap ( SnapToMeshObject ) is enabled and the Mesh layer is unlocked. You’ll be pulling and projecting onto the scan constantly, and both Pull and Project need to be able to snap to it.

This tutorial builds the panel as eight separate surfaces, shown below. Work through them roughly in order. Later, we will match a surface’s continuity against the ones before them.

The eight surfaces this tutorial reverse engineers, in order.

The eight surfaces this tutorial reverse engineers, in order.

Throughout, you’ll check each surface against the scan using cross-section curves generated in Grasshopper, comparing the mesh’s cross-sections (plum) against the surface’s (green) as you adjust control points.

The first surface

  1. Download and open the reference.3dm file. It contains the scanned mesh and nothing else. Every curve and surface in this tutorial gets built from scratch.
  2. Run InterpCrv with Degree=5 and Knots=Uniform, and enable the Vertex Osnap . Click four points on the mesh to draw the first free-form curve.
  3. Run SetPt and align it to Y=0, the panel’s symmetry line. Make sure to set Copy=Yes in the prompt .
  4. Run EditPtOn on the aligned copy to turn on its edit points,
  5. Select all the edit points, then use Pull to pull them back onto the mesh. Set DeleteInput=Yes.
  6. Select the pulled curve and use Gumball Extrude along the positive Y axis, to create a surface.
  7. Run Loft , using the edge of the extruded surface and the curve from step 1 as the two rail curves. Check Match start tangent.
  8. To check the surface against the scan, open cross-sections.gh in Grasshopper. It displays cross-section curves through both the mesh and the surface so you can compare them directly. Double-click the Grasshopper window’s title bar to roll it up out of the way once it’s running.
    Opening cross-sections.gh in Grasshopper.

    Opening cross-sections.gh in Grasshopper.

  9. Run ChangeDegree and set the surface’s U-direction degree to 4. Turn on its Control Points and use Gumball Move to adjust their heights, keeping the surface’s cross-section curves (green) as close as possible to the mesh’s (plum).
Keep these points in place
Don’t move the two rows of control points along the U axis closest to the extruded surface. We want to keep it tangent to the extruded surface. Moving these points would break the tangency constraint.
Reading the cross-sections
The Grasshopper-generated mesh sections are the main reference for the surface’s shape. Leave Grasshopper running in the background and re-check the surface sections after every batch of control point edits.

The second surface

This time around we will build a surface from 4 curves using EdgeSrf . The method here is similar to the first surface: draw curves, build a surface between them, then adjust control points until the surface’s cross-sections match the mesh’s. We will reuse the edge curve of the surface created in step one, which will be adjacent to this surface.

  1. Continue with your file or download and open the Re-01.3dm file.
  2. Run InterpCrv (Degree=5, Knots=Uniform) with the Vertex Osnap to draw the curve running over the hood in Y direction.
  3. Run InterpCrv (Degree=5, Knots=Uniform) again to draw the next curve, on the window side of the hood (this curve’s end point should be at the end of the first surface’s edge)
  4. Use Extend to lengthen the curves until they visually intersect in top view, then Trim away the extra segments past the intersection. Turn on their control points and use Move to make the two endpoints coincide exactly.
  5. Draw a third curve on the front side of the hood, connecting the left endpoints of the first curve and the end of the edge of the first surface.
  6. Run EdgeSrf , selecting the three curves and the adjacent edge, to create the second surface.
  7. Open the SoftTransform panel (Windows menu: Panels > SoftTransform). Enable Enabled and Boundary constraints, and set the edge shared with the first surface to G0.
  8. Use the Radius parameter to set Soft Transform’s falloff range to about 120, then adjust the second surface’s control points row by row along the V direction. Just as before, aim to keep the surface’s cross-sections as close as possible to the mesh. This step takes patience and usually a few passes.
  9. Switch to the Top viewport and use Curve to draw a trim curve, then trim away the part of the surface that extends past the reference mesh.

The third surface

Like the second surface, the third is a five-sided patch rather than a four-sided one: build a four-sided surface that covers the whole region first, then trim it down to size.

  1. Continue with your file or download and open the Re-02.3dm file.
  2. Run InterpCrv with the Vertex Osnap to draw two curves, and use the same extend/trim/coincide process as step 2 to join their endpoints.
  3. Run InterpCrv once more to draw a short connecting curve, then run EdgeSrf to create the third surface.
  4. Run PointsOn to turn on the surface’s control points.
  5. In the SoftTransform panel, set the edge shared with the second surface to G0.
  6. Switch the Gumball Settings from Align to CPlane to Align to Control Polygon. This aligns the Gumball arrows with the control point’s own U, V, and N (surface normal) direction instead of the world axes. Adjust the control points row by row along N, again matching the surface’s cross-sections to the mesh’s. This still takes patience.
  7. Use Curve to draw a trim curve and trim away the part of the surface beyond the reference mesh.

The side surfaces

The creation method for the side surfaces is basically the same as before: Create surfaces and then adjust their shapes. They have a distinct characteristic: They smoothly transition from the top surface to the circular hub cap.

  1. Continue with your file or download and open the Re-03.3dm file.
  2. In the Front viewport, run Circle to draw a full circle.
  3. Use SubCrv to keep only half of it.
  4. Project the half-circle onto the reference mesh.
  5. Rebuild to rebuild it to degree 5 with 6 control points.
  6. Move the result -2 units along Y with Gumball Move . This pulls it slightly away from the radius.
  7. Run InterpCrv to draw two more curves, then EdgeSrf to create the fourth surface. Turn on its control points with PointsOn and refine the shape with Gumball, as with the previous surfaces.
  8. Use Line to draw the fifth surface’s side edge and Extend to lengthen it.
  9. Draw the fifth surface’s long edge with InterpCrv
  10. Match this curve curvature-continuous (G2) with the adjacent fourth surface’s edge.
  11. Run EdgeSrf to create the fifth surface.
  12. Use MatchSrf to make its left side curvature-continuous with the fourth surface. Enable the following two options: Match by closest points and Preserve isocurve direction.
  13. Turn on its Control Points and adjust with Gumball. In SoftTransform , set the fifth surface’s left edge to G2 and its top edge to G0 so both stay constrained while you edit.
  14. The sixth surface is flatter and simpler. In the Front viewport, draw two straight lines.
  15. Unlock the Mesh layer.
  16. Project the two curves onto the reference mesh.
  17. Rebuild both to degree 5 with 6 control points. The vertical curve will need its own control point tweaks; temporarily disable SoftTransform while you do that.
  18. Match and Move to connect every curve endpoint with G0 continuity.
  19. Finally, create the sixth surface with EdgeSrf and tune as before using Gumball Move , with SoftTransform enabled.

The final two surfaces

The last two surfaces need relatively little adjustment compared to the rest.

  1. Continue with your file or download and open the Re-04.3dm file.
  2. Run InterpCrv to draw a straight line.
  3. Run EdgeSrf to create the seventh surface.
  4. Run MatchSrf to make the seventh surface’s bottom edge curvature continuous with the sixth surface’s top edge. Turn on its Control Points control points and adjust with Gumball Move . Constrain both the top and bottom edges this time, since both are shared with a neighbor.
  5. Run EdgeSrf once more to create the eighth and final surface. It needs little to no adjustment.
  6. Run GlobalEdgeContinuity and window-select the fourth through eighth surfaces. Notice that the eighth surface currently only has G0 continuity with its neighbors.
  7. Run MatchSrf to make the eighth surface’s right side curvature-continuous with the seventh surface’s left side, then again to match its left side to the fourth surface’s right side.
    Matching several edges at once
    The eighth surface’s other two edges only need G0 continuity with their neighboring surfaces and curves. Since you’re matching several edges at once, the MultipleMatches option lets you pick them all in a single MatchSrf run instead of repeating the command.
  8. Run Zebra and EMap to check the smoothness of the finished surfaces.

Detail adjustments

With all eight surfaces built and matched, go back over the panel and refine the local fit where it needs it. Use SoftTransform ’s boundary constraints to lock in the continuity you’ve already established between surfaces, then use Gumball to nudge control points until every cross-section, mesh and surface alike, lines up. Re-check with GlobalEdgeContinuity as you go. You can continue with your file or download and open the Re-05.3dm file.

Finished
Congratulations on completing this tutorial! If you run into trouble, ask on the Rhino forum.