A biomechanical model of the human tongue for understanding speech production and other lingual behaviors

Adam Baker
Department of Linguistics
University of Arizona

How I made the meshes

There doesn't seem to be an established way to create a 3D mesh from a volumetric representation. So, what I did was fairly ad hoc. For the most part, I was constrained by the software that I had (that my institution had), and by my imagination. The proprietary software I had access to was: Amira, Abaqus, SolidWorks, Matlab. (I ended up using the demo version of Rhino3D as well.)

The general procedure

Volumetric to triangular mesh

Amira will convert a volumetric object into a nice triangular surface mesh. Crucially, most (>90%) of the nodes it produces are on integer coordinates. So if you take all of the nodes, and then take the subset where the y-coordinate is 100, then you get all of the points on the mesh that lie on that plane. (I forget if it's the y-coordinate that gives you the axial slices, but whatever.) It's essentially a cross-section of your smoothed object.

Triangular mesh to splines

Since you've got cross-sections, you can connect the dots and make splines. You can turn your cross-section into a nice loop. The trick is that the points you have from Amira are not sorted, and you need to connect the dots in an appropriate order. I didn't do this very well. I think I started with a single point, and then picked the point closest, and then the point closest to that, etc. It mostly worked, but there were a few slices I had to discard because that's just a bad heuristic (see “Discarding splines” below). I'm certain there's a better way to do it. In any event, the crucial thing is to have an ordered list of coordinates that you can connect with a spline (or, a list of “control points,” as the spline people say).

Lofting between splines

You need 3D modeling software that can handle NURBS surfaces. I know of SolidWorks and Rhino3D. Both of these programs have a scripting interface. (For SolidWorks, it's clunky VB Script; for Rhino3D, it's a more elegant homegrown command line interface, and you can just paste long blocks of commands in.) So you enter in all of your splines, select them in order somehow (I don't recall this part of it being difficult, though you can imagine it might be), and then loft between the splines to create your solid. Now, the loft will create a surface but not a solid. You just cap the top and bottom splines to make a solid.

Now, my experience is that Rhino3D did this quite easily. SolidWorks was very, very slow. Lofting between even two splines took a long time, and I was never actually able to loft between all of the splines in my dataset. I don't know what the difference is, but Rhino3D's algorithm was much, much better.

I mentioned that I only had the demo version of Rhino3D. The demo I had allowed 25 saves. Since I only had eight or nine parts to make, this wasn't a problem for me. I saved all of my parts in ACIS SAT format.


I had access to Abaqus, so I used that to make mesh the parts. Abaqus was only able to make a tetrahedral mesh; it never gave the option to hex-mesh it. Since hex meshes are better for finite element solutions, I tried really hard to get it (partitioning the solid model, etc.), but it never worked. Having looked at a lot of other mesh options, I'm also fairly confident that Abaqus has the most robust mesher out there. Once I had my tongue in Abaqus, I was able to make meshes at a lot of different precisions.

Some nitty-gritty


My volumetric representation of the mucosa actually represents the thickness of the mucosa; that is, the mucosa model is like a shell around the tongue (as it is in real life). When I created the solid model I didn't really want to deal with that. So, I used Amira to “fill in,” the mucosa. I did this by applying the “Fill,” command to each axial slice.

The parts I made

I made parts (3D solid representations) of the tongue mucosa and all of the tongue muscles. I thought at first that I could use the muscles to introduce boundaries during meshing, but this never worked. The boundaries between the muscles were not crisp by the time they were SATS. There would be thin gaps, and thin overlaps; these wrought havoc with the mesher. In the end, the object I actually meshed was the union of the mucosa, genioglossus, hyoglossus, and styloglossus. Those last three muscles are included because they protruded from my muscosa model.

Choosing a plane of section

For each muscle you chose whether you want splines in axial, coronal, or sagittal planes. I chose different planes of section for different muscles. The only criterion I used was that the resulting splines were single blobs. What do I mean? Well, if you cut genioglossus in axial planes, there are places (posterior places) where you'll cut off two pieces. If you cut it on sagittal planes you'll always get one piece. Always having one piece makes lofting possible.

Discontinuous paired muscles

A detail I left out in the above description was that for paired discontinuous muscles, I split the points into two sets along the midsaggital plane, before further processing.

Discarding splines

Because my heuristic for ordering the points for the splines was stupid, I had cases where splines had small loops in them. That of course ruined the lofting procedure, so I just deleted these. There weren't many of them, and the splines represented the solid with such high precision that I really don't think anything was lost.

Things that didn't work

There is some research software that purports to create a mesh from a volumetric representation. I was never able to get this software to work, but presumably it will become more user-friendly in time.

Amira will actually produce a tetrahedral mesh from a volumetric object. The problem is that their mesh generation is not constrained in any way, so the tetrahedra they create tend to be misshapen (and therefore inappropriate for use in a finite-element simulation, since oddly-shaped tetrahedra introduce error, and constrain the extent to which the mesh can safely deform). I was looking into software that “healed” meshes by adjusting the nodal coordinates, but wasn't able to find an easy solution. I believe, though, that some C or C++ library is available through some defense-related lab (Sandia, or Lawrence Livermore, or something; sorry, that's not much to go on).

All contents copyright © 2008 Adam Baker