<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Progress marches onward at a stately pace. Here is not the sexiest of screen shots, but an important one, as boundary edges of open meshes start to be integrated into the mix. The tetrahedron is cut by a flat surface of three triangles. The cut starts at a boundary edge and ends on the same boundary edge on a different plane. Somehow, the arc tracing algorithm is able to find its way through the forest of edges and planes from. It seems a little magical that it can do this reliably given the number of opportunities for wrong turns. I am sure that not all the details are correct yet, but it is getting there.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">This is not a boolean solid operation because one of the objects is clearly not solid. It is something else, that may or may not be useful in modeling, but is definitely a case that needs to be handled. For one thing, the plan for handling coplanar faces depends on being able to intersect arbitrary open meshes.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Speaking of coplanar faces, that problem is starting to crack. I struggled for a while with the concept of finding coplanar domains by searching outward to neighbours of coplanar faces, or parts of them, and that approach was just getting very messy and hard to understand. Then it occurred to me that I shouldn't be trying to join up groups of faces, instead I should just be searching for boundaries of those domains. Such boundaries form open and closed arcs just like the intersections of non-coplanar faces we are already seeing. In fact, those arcs can be traced out by a method that is remarkably similar to finding arcs of intersection. The main thing that changes is, instead of finding edge/face intersections we are must look for the endpoints of certain face/face intersections. I haven't gone into much more detail than that, but it seems like a breakthrough. I am pretty sure now there is an elegant and general algorithm in there, as opposed to the messy hack that it easily could be.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">I now have a rough idea of how complex the coplanar face extraction phase of the algorithm will be: roughly as complex as the other five steps put together. In other words, totally nontrivial. But well worth doing because it will complete this work. It now looks like the full, usable boolean combination algorithm will come in at not much more than a thousand lines, making it an order of magnitude smaller than libcarve, which is in turn much tighter than something like CGAL. I shudder to think what kind of code base 3D Max must have for this.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">So where this is going in the near future is... hopefully we are going to pop the stack and get back to some higher level modeling. I can actually see modeling up the much anticipated (by me) catapult, complete with its beams, axle holes and other mechanical structure, as a demonstration.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Actually, I could have done that long ago just using ring modeling, but that would require a bit too much cleverness for my taste. Ring modeling has a lot of promise for scripting up modeling algorithms, but as a way to work interactively, it could get boring. Fast. Better than shooting individual triangles, but not much.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Boolean combination eliminates the requirement for cleverness. We just say: here is a horizontal beam and a couple of vertical ones, you figure out where they intersect, and please cut them up appropriately then glue them together and don't bug me about it. If we want a diagonal cross brace, we just provide a beam object of approximately the right length and let the boolean combination algorithms figure out how to cut it up to fit exactly with the other beams. Making a perfectly clean axle hole in a wheel is a matter of subtracting a cylinder from it, and hole in the superstructure for the throwing arm pivot is done in exactly the same way. So boolean combination is a way to let the designer be lazy and not think hard. Which is why I am putting so much effort into it, so somebody else can be lazy. It always seems to be that way with computers.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Regards,</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Daniel</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p></body></html>