====== 布林運算 問與答 ====== > **摘要:** //此篇文章將會嘗試著解說布林運算操作上的問題,解釋如何操作及其原理、為何操作失敗、如何修復問題使操作上更加一致並了解如何在開放性的物件上執行工作。// ======簡介====== 在Rhino中,布林運算指令可節省大量的時間在架構物件上,但對於初學者來說,操作常常無故失敗而且很難了解為何失敗。希望透過問與答的解釋可以有點幫助,如果不想閱讀下列所有的資訊,也可以試著參照John Brock對於[[rhino:jbbooleanfix|如何修復布林運算問題]]簡介 **//要了解為何布林運算會失敗,首先你要先了解他們的是如何運算的//**,布林運算並非某種可把兩個物件結合在一起的神奇工具,他們是在一個運算過程中結合數個”手動”指令的簡單半自動操作指令。布林運算基本上可以做4件事情: * **交集**兩個或兩個以上的物件; * **分割**物件的交叉部分; * **差集** (丟棄)不要的部分; * **聯集**物件。 你可以用布林運算做任何事情,也可以依序”手動”操作以上四個指令,使用布林操作只是在工作中利用一個過程使速度加快….。 因此,必須牢記的是**//透徹//**了解布林”成分”如何操作是必要的,當所有指令都失敗時,可以試著使用這些指令–**交集Intersect**、**分割Split**、**組合Join**以及**刪除Delete**。試著做一個不成功的布林操作接著手動操作這幾個指令,你會發現如果布林嘗試失敗,這幾個指令總是會讓你得到你想要的結果。 =====布林操作失敗...===== 為什麼布林會失敗?首先,交點的運作將會決定布林操作的成功與失敗,如果可以找到正確的交點將會很容易執行,無論如何,如果Rhino在找交叉部分有問題,那麼布林運算結果保證會是失敗的,因此最關鍵的部分就是幫助Rhino找到正確的交點,可以藉著正確地設定自己的模型檔案,來了解Rhino的一些小技巧和限制。 兩個封閉物件(“實體”)的交點處應該至少有一個完整封閉的交點曲線(例如: 迴圈),如果物件相交在多個點,那麼有可能會產生多個迴圈,如果這些迴圈都是封閉的,那麼這是沒有問題的。只要有一個相交曲線不是封閉的,那麼布林操作將注定失敗,這是因為相交曲線無法完整切割物件,而Rhino系統無法得知如何切割,因此無法運算而給予運算錯誤訊息。 > **注意:** //在開放物件中執行布林操作是有可能的,但是會有點複雜,因此我們建議在一開始就將物件封閉,開放的物件在轉換的時候將會耗費很多時間。// 因此,經由上面的解釋,如果布林操作失敗,第一件事情應該檢查物件的相交處,選擇你的物件接著叫出相交處。首先,查看螢幕上相交處曲線,確認正確與否,有沒有可見的缺口、多餘的分割或者有任何看起來奇怪的東西? 如果有,必須找出造成的原因,如果交點處看起來是正常的,但是布林操作能然失敗,在相交曲線在選取狀態時,進入**物件內容(Properties) >詳細資料( Details)**或者使用**What**指令。結果訊息方塊應該會顯示所有需要的關於這個曲線的資訊。曲線是開放的嗎?那問題將會是在這一方面;多於一條曲線嗎?那就需要找出為什麼有缺口或者重疊部分在相交處。 =====相交處問題,解決方案及限制===== 在模型相交處造成缺口或者其他問題的原因是甚麼? 有很多可能性,某些原因是由於模型錯誤或者不正確,某些是由於Rhino系統上的限制,以下就讓我們來看看這些常見的錯誤: 如果相交處應該為封閉,但是卻沒有,選擇相交處曲線,接著利用 **標示曲線起點(CrvStart)**指令在曲線的開始處放置一個點,正常來說,這點會落在缺口處的一邊,在螢幕上利用**縮放(Zoom)**檢查可看到的缺口處,為何會有一個缺口? 也許你認為你的物件是封閉的,但是卻不是,相交處在相交的曲面之間可能跨過了一個缺口,而這會造成一個開放的曲線,如果使用**組合兩個外露邊緣(JoinEdge)**來組合物件,這情況就有可能會發生,甚至物件也顯示是封閉的。另一件事情就是檢查建模公差([[rhino:faqtolerances|看公差問與答]]),即使一切良好,如果公差太大,還是可能會造成阻止系統找到一個完整的相交處。試著縮減公差,接著再執行一次布林,一旦得到一個完整的相交處,操作//應該//就能順利進行。 如果已經在能力範圍內將物件修復到最好的狀況,但仍進無法利用Rhino自動產生而得到一個封閉的曲線,也許就該回頭用“手動操作”。也許需要加入或修改一些segment、編輯一些點、刪除一些重疊的segment或者其他類似的調整才能得到想要的相交曲線或是封閉物件。一旦有了這樣的曲線,可以試著單獨修剪物件,將多重曲面炸開與相交曲線進行修剪。剪除不需要的部分接著將其他部分結合。 //認識Rhino的限制:// 接縫重合 – 所有的物件都有接縫,有時候兩個物件的接縫剛好在相同的地方,Rhino在相接處會有問題產生。解決方案 – 可以試著移動接縫或者試著移動一個物件進行微調,小小的移動(如果可以不造成模型的錯誤),或者試著執行手動操作。 共面平面 – 如果一個物件的兩個面是在同一平面,Rhino也許無法計算其相交處,這是一個相當普遍的現象,試著避免用此方法來建模。解決方案 – 如上所述,如果可能的話,也許可以試著輕微移動物件;如果沒辦法,也許要用手動操作。 近相切曲面 –以圓管來說,如果兩個相同管徑的圓管相交的情況下執行布林運算,會造成兩個圓管的相交處只有一個點,進而造成布林運算的失敗。 無效物件 – 如果嘗試對一個無效的物件進行操作,布林操作通常會是失敗的,利用指令**選取損壞物件(SelBadObjects)**來檢查損壞物件,如果有一個損壞物件提示,需要在執行前進行修復的工作。同時也建議在過程中開啟物件自動檢查功能,如果在工作過程中無效的物件被正被創建(或是輸入),Rhino會立即通知。要執行此動作,只需鍵入**CheckNewObjects**(檢查心物件),這是一個切換動作,再次執行指令將會進行轉換。 Non-Manifold Polysurfaces – 雖然目前Rhino並不將這些物件標註為壞的,但他們卻可能導致失敗的結果。在Rhino//不應該//創建這類型的結構,但在某些情況下卻是會發生的,尤其是在V4,目前將它們找出來唯一的辦法就是在物件的屬性狀態中去確認。 =====必要時必須利用"手動操作"進行編輯的工作===== 以下的動畫說明將會示範如果在布林操作失敗時,如何進行手動編輯 **[[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]](布林運算兩個物件)可以在銀幕上看到所有布林運算的不同結果,使用者可選擇想要的結果,但前提是只有在兩個物體的情況下才能執行。