Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

zh:rhino:booleanfaq [2015/09/14]
zh:rhino:booleanfaq [2020/08/14] (current)
Line 1: Line 1:
 +====== 布尔运算 问与答 ======
 +> **摘要:** //此篇文章将会尝试着解说布尔运算操作上的问题,解释如何操作及其原理、为何操作失败、如何修复问题使操作上更加一致并了解如何在开放性的对象上执行工作。//
 +======简介======
 +在Rhino中,布尔运算指令可节省大量的时间在架构对象上,但对于初学者来说,操作常常无故失败而且很难了解为何失败。希望透过问与答的解释可以有点帮助,如果不想阅读下列所有的信息,也可以试着参照John Brock对于[[rhino:jbbooleanfix|如何修复布尔运算问题]]简介
 +
 +**//要了解为何布尔运算会失败,首先你要先了解他们的是如何运算的//**,布尔运算并非某种可把两个对象结合在一起的神奇工具,他们是在一个运算过程中结合数个”手动”指令的简单半自动操作指令。布尔运算基本上可以做4件事情:**交集**两个或两个以上的物件;**分割**对象的交叉部分;**差集** (丢弃)不要的部分;**联集**物件。你可以用布尔运算做任何事情,也可以依序”手动”操作以上四个指令,使用布尔操作只是在工作中利用一个过程使速度加快….。
 +
 +因此,必须牢记的是**//透彻//**了解布尔”成分”如何操作是必要的,当所有指令都失败时,可以试着使用这些指令–**交集**、**分割**、**联集**以及**差集**。试着做一个不成功的布尔操作接着手动操作这几个指令,你会发现如果布尔尝试失败,这几个指令总是会让你得到你想要的结果。
 +
 +=====布尔操作失败...=====
 +
 +为什么布尔会失败?首先,交点的运作将会决定布尔操作的成功与失败,如果可以找到正确的交点将会很容易执行,无论如何,如果Rhino在找交叉部分有问题,那么布尔运算结果保证会是失败的,因此最关键的部分就是帮助Rhino找到正确的交点,可以借着正确地设定自己的模型档案,来了解Rhino的一些小技巧和限制。
 +
 +两个封闭对象(“实体”)的交点处应该至少有一个完整封闭的交点曲线(例如: 循环),如果对象相交在多个点,那么有可能会产生多个循环,如果这些循环都是封闭的,那么这是没有问题的。只要有一个相交曲线不是封闭的,那么布尔操作将注定失败,这是因为相交曲线无法完整切割对象,而Rhino系统无法得知如何切割,因此无法运算而给予运算错误讯息。
 +
 +> **注意:** //在开放对象中执行布尔操作是有可能的,但是会有点复杂,因此我们建议在一开始就将对象封闭,开放的对象在转换的时候将会耗费很多时间。//
 +
 +因此,经由上面的解释,如果布尔操作失败,第一件事情应该检查对象的相交处,选择你的对象接着叫出相交处。首先,查看屏幕上相交处曲线,确认正确与否,有没有可见的缺口、多余的分割或者有任何看起来奇怪的东西? 如果有,必须找出造成的原因,如果交点处看起来是正常的,但是布尔操作能然失败,在相交曲线在选取状态时,进入**Properties > Details**或者使用**What**指令。结果消息框应该会显示所有需要的关于这个曲线的信息。曲线是开放的吗?那问题将会是在这一方面;多于一条曲线吗?那就需要找出为什么有缺口或者重迭部分在相交处。
 +
 +=====相交处问题,解决方案及限制=====
 +
 +在模型相交处造成缺口或者其他问题的原因是甚么? 有很多可能性,某些原因是由于模型错误或者不正确,某些是由于Rhino系统上的限制,以下就让我们来看看这些常见的错误:
 +
 +如果相交处应该为封闭,但是却没有,选择相交处曲线,接着利用 **CrvStart**指令在曲线的开始处放置一个点,正常来说,这点会落在缺口处的一边,在屏幕上利用**Zoom**检查可看到的缺口处,为何会有一个缺口? 也许你认为你的对象是封闭的,但是却不是,The intersection may cross a gap between surfaces,而这会造成一个开放的曲线,如果使用**JoinEdge**来组合对象,这情况就有可能会发生,甚至对象也显示是封闭的。另一件事情就是检查建模公差([[rhino:faqtolerances|看公差问与答]]),即使一切良好,如果公差太大,还是可能会造成阻止系统找到一个完整的相交处。试着缩减公差,接着再执行一次布尔,一旦得到一个完整的相交处,操作//应该//就能顺利进行。
 +
 +如果已经在能力范围内将对象修复到最好的状况,但仍进无法利用Rhino自动产生而得到一个封闭的曲线,也许就该回头用“手动操作”。也许需要加入或修改一些segment、编辑一些点、删除一些重迭的segment或者其他类似的调整才能得到想要的相交曲线或是封闭对象。一旦有了这样的曲线,可以试着单独修剪对象,将多重曲面炸开与相交曲线进行修剪。剪除不需要的部分接着将其他部分结合。
 +
 +//<color blue>认识Rhino的限制:</color>//
 +
 +<color brown>接缝重和</color> – 所有的对象都有接缝,有时候两个对象的接缝刚好在相同的地方,Rhino在相接处会有问题产生。解决方案 – 可以试着移动接缝或者试着移动一个对象进行微调,小小的移动(如果可以不造成模型的错误),或者试着执行手动操作。
 +
 +<color brown>共面平面</color> – 如果一个对象的两个面是在同一平面,Rhino也许无法计算其相交处,这是一个相当普遍的现象,试着避免用此方法来建模。解决方案 – 如上所述,如果可能的话,也许可以试着轻微移动对象;如果没办法,也许要用手动操作。
 +
 +<color brown>近相切曲面</color> – like the intersection of two equal diameter pipes at an angle.  The intersection often fails at the point where the surfaces are tangent.  There is no easy fix currently for this problem.
 +
 +<color brown>无效对象</color> – 如果尝试对一个无效的对象进行操作,布尔操作通常会是失败的,利用指令**SelBadObjects**来检查无效对象,如果有一个highlight,需要在执行前进行修复的工作。同时也建议在过程中开启对象自动检查功能,如果在工作过程中无效的对象被正被创建(或是输入),Rhino会立即通知。要执行此动作,只需键入**CheckNewObjects**,这是一个切换动作,再次执行指令将会进行转换。
 +
 +<color brown>Non-Manifold Polysurfaces</color> – 虽然目前Rhino并不将这些对象标注为坏的,但他们却可能导致失败的结果。在Rhino//不应该//创建这类型的结构,但在某些情况下却是会发生的,尤其是在V4,目前将它们找出来唯一的办法就是在对象的属性状态中去确认。
 +=====必要时必须利用"手动操作"进行编辑的工作=====
 +
 +<color brown>以下的动画说明将会示范如果在布尔操作失败时,如何进行手动编辑</color>
 +
 +**[[http://wiki.mcneel.com/_media/legacy/en/boolean_problem-1.swf|如何编辑共平面的面及近相切曲面]]**
 +
 +**[[http://wiki.mcneel.com/_media/legacy/en/Solids_that_Dont_boolean_2a.pdf|如何编辑共平面面的曲面II]]**
 +
 +以下这个例子是一个实体无法利用原始实体下去建构模型,因此在这地方,了解曲面编辑技术是必须的。
 +
 +  *主要的问题是侧边曲面恰巧无法共享主要实体物块,当布尔运算失败时,可依据上面连结中的曲面编辑技术中的描述来进行。
 +
 +  *下载[[http://wiki.mcneel.com/_media/legacy/en/part1-r3.3dm|模型]]
 +{{:legacy:en:t.JPG}}
 +
 +----
 +======布尔功能在开放对象中的运算======
 +
 +如上所述,布尔运算也可在开放对象中执行,但因为对象并非封闭,因此我们必须了解两件事情。如果你只有两个对象,Rhino V4 提供了一个工具使以下的流程更容易些,查看指令: [[rhino:boolean2objects|Boolean2Objects]]
 +
 +=====曲面方向=====
 +
 +首先,了解曲面法线和方向的概念是必须的,每一个表面对象都有”sided-ness”,称为”front-side”及”backside”。在Rhino里称为”方向”(direction),可使用指令**Dir**来查询。试着在不同的曲面使用**Dir**指令,并看看有甚么不同。方向箭头通常指向曲面”外部”,同时也会显示出”法线”的方向,通常与曲面呈现90度。
 +
 +每一个曲面都可翻转其法线方向(例如:反转曲面的”sided-ness”,当执行**Dir**指令时,你可以键入”F”或者点击表面就可以看到方向箭头翻转,同时也可在外部执行翻转(虽然你看不到任何箭头)。
 +
 +{{:legacy:en:Directions.gif}}
 +
 +> **注意:** //曲线在Rhino中也有法线性,可用**Dir**指令使其产生。在此情况下可使用**Flip**指令来对调起始点与终点来改变曲线的方向。//
 +
 +当曲面结合,Rhino会试着使对象的曲面法线”一致”,也就是说,Rhino会试着使所有曲面有同样的法线方向性。因此当结合开放性的表面时,仍然只有一个法线方向性,而不会有各种不同的方向。
 +
 +> **实验:** //画一个矩形,挤出一个四边形开放的盒子,将其各边炸开,使用**Dir**指令翻转其中两面的法线方向,之后再将四边**结合**,观察看看结合后的法线方向是如何改变的。//
 +
 +当一个对象在Rhino系统中被封闭,程序会自动将所有的面翻转向外,系统会假定内部的任何东西已经不被在乎,因为对象是封闭的(实体)。封闭多重曲面无法使物底的法线面内内部(试着操作**Dir**指令看看)。如果一个封闭的多重曲面的法线被反转了,那代表这对象并不是真的封闭,或者代表着系统出现了无法预期的错误。
 +
 +> **实验2:** //画一个方块,将所有的面都分解,使用**Dir**指令,将部分面的法线反转向内部,接着将所有的面结合在一起,看看对象结合后法线方向有何变化。//
 +
 +=====曲面方向性如何影响布尔运算=====
 +
 +现在已经了解了关于表面法线及方向,为什么这部分在布尔运算里面是重要的呢?当Rhino接收到执行布尔运算的指令,系统会根据于曲面法线来决定哪部分要保留、哪部分要移除。本质上来说,布尔的联集、差集、交集都是同样的操作,只是最后保留的部分不同而已。举例来说,布尔的联集是将重复的部分丢弃,而交集则是将重迭的部分留下。
 +
 +布尔运算对于”实体”(封闭的多重曲面)是可预测的,因为所有面的法线都是指向外部;而对于开放的多重曲面,结果似乎是无法预测的,因为我们没有办法在没有使用**Dir**指令的情况下去立即判断知道哪一边是物体的前或后。
 +
 +> **注意:** //如果在封闭多重曲面上执行布尔运算,而却没有照着你想象的方式去运算(例如:错误的对象遗失),很有可能是一个或是多个对象并非完全封闭导致法线指向内部。试着用**Dir**指令查看。//
 +
 +> **小技巧:** //透过设定系统显示对象的背面显示颜色与前面不同可以知道对象表面目前是面向哪个方向。在**V3**中,使用指令**AdvancedDisplay**  > **Color Backfaces**来设定。在**V4**中,则是透过**Options>Appearance>Advanced Settings>Shaded>Backface Settings**设定”所有背面显示单一色”来选择一个颜色。注意,颜色的显示只会在着色模式中显示出来,在其他模式无法看出。注意,颜色的显示只会在//着色模式//中显示出来,在其他模式无法看出。//
 +
 +想象一下简单的”开放”布尔运算,有一个”实体”封闭多重曲面与一个单一平面相交,简单地利用各种形式来建立这个物体,之后使用**切断平面**指令(**CutPlane**),接着画出一条任意方向的切断线穿过此物体。
 +
 +试着使用**布尔差集**(BD),首先先选择实体接着再选择用来切割的平面,实体的两边会有一边被切断删除,而且破洞会被平面填补起来,但是是哪一边会被去除呢?
 +
 +除非在曲面上使用**Dir**指令,否则无法得知哪一面会删除。先看看面的法线方向,接着做差集的动作,而后回到上一步,扭转法线方向,再做一次差集,可以发现面的法线方向那一面是会被留下来的。
 +
 +一般来说,如果要在开放曲面及实体对象之间做布尔差集的动作,开放曲面的法线方向所指向的一侧,则该侧的实体将会被保留。
 +
 +{{:legacy:en:BooleanDiff1.gif}}
 +
 +{{:legacy:en:BooleanDiff2.gif}}
 +
 +在V4中,[[rhino:boolean2objects|Boolean2Objects]]可以在银幕上看到所有布尔运算的不同结果,使用者可选择想要的结果,但前提是只有在两个物体的情况下才能执行。