This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | Previous revision Next revision Both sides next revision | ||
rhino:booleanfaq [2016/03/03] |
rhino:booleanfaq [2023/11/19] mitch_heynick [Known Rhino limitations] |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Boolean Frequently Asked Questions ====== | ||
+ | |||
+ | > **Summary: | ||
+ | |||
+ | Boolean operations can be great time saving procedures for constructing objects in Rhino. | ||
+ | |||
+ | **//To understand why Booleans fail, first you must understand how they work.// | ||
+ | * **Intersect** two or more objects | ||
+ | * **Split** them at the found intersections | ||
+ | * **Delete** (discard) the parts not wanted | ||
+ | * **Join** everything back together | ||
+ | Everything you can do with Boolean operations you can also do manually by using the above four commands. | ||
+ | |||
+ | So, the first thing to keep in mind is that a **// | ||
+ | =====Boolean operation failed...===== | ||
+ | OK, why do Booleans fail? First, it is the intersection operation that will determine the success or failure of a Boolean operation. | ||
+ | |||
+ | Intersecting two closed (solid) objects should produce at least one completely closed intersection curve (i.e. a loop). It’s possible there may be more than one loop if the object intersects in multiple spots -– no problem if they’re all closed. | ||
+ | |||
+ | > **Note:** //Doing Boolean operations on open objects is also possible, but a bit more complicated, | ||
+ | |||
+ | So, taking the above into account, if your Boolean operation fails, the first thing you should do is check the intersection of the objects. | ||
+ | |||
+ | //Note also that using the manual Split or Trim / Delete / Join procedure instead of a Boolean operation will likely run into the same problem, as the Split or Trim operation will fail. Intersect can again help find the problem spot(s).// | ||
+ | |||
+ | =====Intersection problems, solutions, and limitations===== | ||
+ | What causes gaps or problems in your intersection? | ||
+ | |||
+ | If you think your intersection should be closed, but it’s not, select the curve, and call **CrvStart**, | ||
+ | |||
+ | If you can’t get Rhino to automatically produce a closed intersection curve, even after you have fixed your object the best you can, it may be time to go back to manual. | ||
+ | |||
+ | ====Known Rhino limitations==== | ||
+ | |||
+ | **Coincident seam and other edges** – All polysurface objects have joined edges and seams. Sometimes when the joints on two objects are at exactly the same place, Rhino has trouble with the intersection. | ||
+ | |||
+ | **Coplanar faces** – If two faces of an object are on the same plane, Rhino may not be able to calculate the intersection. This is a fairly | ||
+ | |||
+ | **Nearly tangent surfaces** – Like the intersection of two equal diameter pipes at an angle. | ||
+ | |||
+ | **Invalid objects** – If one of the objects you're trying to work with is invalid, Boolean operations will often fail. Check for invalid objects by using the command **SelBadObjects**. | ||
+ | |||
+ | **Non-manifold polysurfaces** – Although Rhino doesn' | ||
+ | |||
+ | =====Manual construction and editing is sometimes needed===== | ||
+ | |||
+ | Animated illustrations showing manual surface construction and editing when Boolean operations fail: | ||
+ | |||
+ | **[[http:// | ||
+ | |||
+ | **[[http:// | ||
+ | |||
+ | This is an example of a solid that can not be constructed with solid primitives and surface editing techniques are required. | ||
+ | |||
+ | * The main problem is the condition of the side surfaces that are coincidental and do not share a volume with the main solid piece. When Booleans fail, rely on using surface editing techniques described in the steps in the linked document. | ||
+ | * Download the [[http:// | ||
+ | {{: | ||
+ | |||
+ | ---- | ||
+ | =====Boolean operations on open objects===== | ||
+ | |||
+ | As mentioned above, Boolean operations can also be performed on open objects. | ||
+ | |||
+ | ====Surface direction==== | ||
+ | |||
+ | First, it is necessary to understand the concept of surface normals and direction. | ||
+ | |||
+ | For each surface, you can flip the direction of the normals (i.e. invert the sided-ness of the surface. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | > **Note:** //Curves in Rhino also have a direction which can be shown by the **Dir** command. | ||
+ | |||
+ | When surfaces are joined, Rhino tries to standardize the surface normals of the object. That is, it tries to keep all adjacent surfaces having the same front/back orientation. | ||
+ | |||
+ | > **Experiment 1:** //Make a square. | ||
+ | |||
+ | When an object is closed in Rhino, the program automatically flips all the surfaces to the outside. | ||
+ | |||
+ | > **Experiment 2:** // | ||
+ | |||
+ | ====How surface direction affects Boolean operations==== | ||
+ | |||
+ | OK, now you understand surface normals and direction. | ||
+ | |||
+ | Booleans with solids (closed polysurfaces) are predictable, | ||
+ | |||
+ | > **Note:** //If you are doing Boolean operations on closed polysurfaces and they don't react the way you think they should (i.e. the wrong parts disappear), probably one or more of your objects aren't really closed and have the normals pointing inward. | ||
+ | |||
+ | > **Tip:** //One way to always know which way surfaces are facing is to set up your display to show backfaces in a different color from front faces. | ||
+ | |||
+ | Let's imagine the simplest open Boolean operation. | ||
+ | |||
+ | Now, try **BooleanDifference** (BD). Select the solid as the first set and the cut plane as the second. | ||
+ | |||
+ | You can't know unless you call **Dir** on the surface. | ||
+ | |||
+ | In general, if you want to BD between an open (poly) surface and a solid to work as if it was two solids, the surface normals of the open object should point towards the solid object, as if it were also a solid. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | From Rhino V4 on, [[rhino: | ||
+ | |||
+ | |||
+ | |||
+ | |||