Boat Project, Part 2: “Reinventing the Keel” with Parametric Design
Last time I opened with an overview of why I’m spending my weekends trying to needlessly reinvent the keel of an ancient process: Wooden boat design. Partly, it came from a genuine aspiration to build a tool to help anyone design and build their own boat with minimal engineering knowledge. Partly it came from some strange internal desire to participate in an ancient process humans have been replicating and perfecting for thousands of years…
…But a lot of it probably just stems from my being a stereotypical male who doesn’t like reading someone else’s instructions on how to do things…
Today, I’m going to dive a little more into the details of how I’m computing boat schematics. It’s a little technical, but I’ll try to lighten the nerd load. Calvin and Hobbes always help.
So if I want to automate the boat design process, it begins with defining a boat parametrically — that is, describing all the parts of a boat as parameters in relation to one another, so that by specifying a few key dimensions, an entire boat schematic can be computed.
When my brother and I first sat down to sketch our original boat, we basically started like this anyway. You begin with the basics: overall length, beam (widest part of the boat), heights for the bow, stern, a midpoint, and a handful of others:
The interesting thing (to me) with this approach is how you pick your parameters, because there comes a point where you start over-describing the boat, and parameters begin contradicting one other.
For example (above), by defining a stern angle, bow angle, height, and overall length, I’m inferring the length of the bottom of the boat. In mathy terms, the length of the floorboard becomes a dependent variable. If we decided the floor length was important to parameterize, we’d have to sacrifice one of the other four variables. So part of the art here is deciding what parameters might be interesting to play with, and which can be left to be inferred.
That was the easy part. The real math comes in when computing the hull shape from these parameters. How do you come up with two-dimensional cuts of wood which, when bent into place, make the three-dimensional hull shape you described with a bunch of simple lengths and angles?
This was when I realized I was going to have to open up the laptop. While I certainly could just bust out a sheet of draft paper, and figure out each plank’s curvature and dimensions with a pencil, slide-rule, protractor, and… who the fuck am I kidding? It’s 2016, and I haven’t used a protractor since 8th grade. Plus, I wasn’t going to repeat this process manually every time we decided to change something.
A quick aside: Lots of CAD suites have programmatic hooks into their software for exactly this reason. However, for a lot of reasons (not least of which being fig 1), I’ve tried to avoid them as much as possible. Mostly, it felt like bringing a tank to a knife fight. This was simple enough that I should be able to script it with a few hundred lines of code, and have something lightweight and lightning fast, with no external dependencies. That said, I still use Blender for a couple of processes that are just too involved (and purely graphical/aesthetic) to replicate myself. I do however want to leave the door open to third party integrations in the future.
Details of Computing the Hull
Time to get into the meat of the process. Here’s the basic steps for the hull calculation, with fig 4 to help make sense of it:
- Start by defining a total length, maximum beam at some chord/midpoint, and specifying a stern beam (width at top edge and floor).
- Define an angle the hull makes with the waterline when viewed head-on, as well as angles the bow and stern make with respect to the waterline when viewed from the side.
- Define some number of planks that will constitute the hull. Could just be one, could be many. The more planks you use, the more complexity, but the less each plank bends/twists.
- Compute the shape of each plank in the hull (essentially iterating on the vertical/z axis) by fitting curves using three points: The stern, midpoint, and bow. We know that the bow meets in the middle (y=0) and the x-location of each plank’s bow point depends on the bow angle and z position. The stern width (y-dimension) is a simple linear interpolation from top width to base width, and likewise uses the stern angle and z position to compute x location. The mid-beam y position is computed from the max beam and the hull angle. By computing two curves, one for the “top” edge of the plank, and one for the “bottom”, we can connect them together into a 3d surface that accurately describes the required plank.
Next we need to “flatten” these 3d surfaces into 2d, millable shapes of wood. We do this by normalizing along the length of the plank. We squash the Y-axis, extending the shape proportionally along X to match the shape/length of the 3-dimensional, curved plank. That’s really the best I’m capable of explaining it.
Since the shape of the hull was going to be by far the trickiest part of the design to get right, I decided to have the remaining parts (structural ribs, floorboards, etc) flow from the hull shape.
This could have been reversed — define the structural elements first, wrap a shell around them, and flatten that hull back into millable planks of wood. But all the artistry and science goes into the shape of the hull. As the analysis gets more sophisticated, I wanted the rest of the boat to “just fall into place” once a hull is described.
Thinking beyond flat-bottom boats, the ribs can be extended into a triangular/trapezoidal base to allow for deadrise, common in boats designed to plow through water at significant speed. While this breaks the floorboard into 2–3 new planks, it also open up a lot of other options for sailboat/powerboat bottoms.
Some of this fancy hull curvature would be damned near impossible for someone to cut manually in their garage. The plan is to experiment with CNC milling first, which is a computer-driven and very precise way to cut wood, and once I’ve put together a boat or two with near-perfect machinery, start to work the designs backwards into simpler and simpler shapes that can eventually be cut easily enough manually.
Another aside: Some funny things start happening when you let math take the wheel, ESPECIALLY when curve-fitting polynomials. Reasonable limits need to be put in place for a lot of the boat parameters, otherwise you leave the door open to some pretty awesome Salvador Dali-esque, acid-trip space-boat schematics (Fig 8).
In subsequent posts, I’ll dig more into the structural and non-structural elements glossed over or ignored here: floor boards, a bow “nose beam”, seating, railing, stern board, etc, eventually culminating in a fully described design.
I’m also pretty excited to dive into the analysis that drives all these decisions: stability criteria, buoyant center calculation/relation to CG, prismatic coefficients, wetted area, displacement/length ratios, the list of interesting concepts in naval architecture goes on and on. There’s also a bunch of practical considerations related to woodworking I need to account for, particularly regarding plywood, that I haven’t touched on yet. I suspect, if any naval architects or woodworkers are reading this, they anxiously await to see the extent to which I’ve done my homework on the matter. Super pumped to disappoint them.