前言
? 在工業設計和制造領域,零部件的拆裝技術是一個重要的應用場景,比如我們在工程訓練課程中經歷的摩托車發動機拆裝課程,是機械類學生的必修課程。虛擬拆裝系統模擬和仿真了模型的拆裝過程,雖然SolidWorks等機械設計軟件能夠解決特征配合的裝配方式,但交互性不足。我們在Unity虛擬引擎中建立一個交互式拆裝訓練系統,拆裝操作簡單,并有圖文引導提示,適合學習者了解拆裝過程。
? 如果一個拆裝項目要實現比較完善仿真功能,比如需要仿真實體特征、裝配精度等,則需要進行更加詳盡的架構設計。但如果僅僅實現基本功能,且項目要在短時間(一周)內完成,那么按我目前的想法寫下本專欄的筆記,大致可以完成。
1. 系統總體設計
? 完成整個系統大約要完成下圖中這些工作,*為加分項。核心模塊為3D模型的準備以及拆裝功能的實現,這兩個部分后面會詳細說明。
2. 裝配功能實現的詳細設計
? 2.1 裝配順序
??發動機模型的包括活塞、曲柄、離合器等幾大部分,零件數量有200多個,彼此存在依賴關系,因此需要根據其構造和原理,安排拆裝工序。按發動機功能區域分,可以講拆裝順序分為如下圖的裝配分組,其中每個子裝配體都包含了若干零件,因篇幅有限,僅展開比較重要的變速箱裝配體:
? 在系統設計過程中,模型按上圖的分組建立子裝配體,并先分別完成每個子裝配體,最后總裝。
? 2.2 裝配思想實現的難點
? (1)碰撞干涉問題
? ? ?虛擬世界中需要模擬實體零件的特性,否則容易發生零件穿透失去真實的效果。可以旋轉Unity系統中較常用的幾種碰撞器來制造碰撞效果,但這里需要注意幾個問題:
? ? 1)如果使用MeshCollider包圍整個零件表面,碰撞效果比較真實,但是系統資源占用較大,尤其是齒輪這些三角面較多的模型;
? ? 2)如果使用BoxCollider這類碰撞器時,容易造成視覺上還未碰到模型,而已經產生碰撞效果的現象,不復合現實世界客觀規律。可以使用下圖分段式碰撞器包裹物體的方式,系統資源消耗較少,又有MeshCollider的效果。
??
? (2)裝配路徑約束
? ? 發動機裝配中,大部分都是軸向裝配路徑,因此需要對孔和軸之間的配合進行約束,以體現實際裝配中的方位和路徑。考慮用采用以下方法:零件在當前位置O時,可以自由移動;當拖拽到軸端面位置時,制定一個零時位置T,從這個位置向目標位置P移動時,鎖定y,z方向,約束零件在軸方向上移動。
? (3)零件裝配過程的流程設置
? ? 下圖是大致的裝配動作實現過程,其中沒有考慮的問題有:
? ? 1)判斷裝配方向;
? ? 2)裝配完成后,父子關系改變(如果后續需要通過運動執行來演示裝配效果,就需要考慮這個問題);
? ? 3)裝配工具選擇(背包);? ? 4)游戲獎勵制度。
? ? 這些可以在制作過程中預留接口,以便于后期擴展。
? ??
3. 場景實現中的難點與解決
? 3.1 相機控制
? ? 在場景中,相機會有多種應用要求,比如在實現場景漫游功能時,需要以第一或第三人控制的方式,讓相機實現360°場景旋轉。但在裝配過程、教學認知過程中,都需要相機在小范圍移動,或干脆固定不動,解決的方法有很多種,比如:
? ? 1. 載入不同場景實現不同功能
? ? 比如漫游為一個場景,裝配功能放在另一個場景,通過場景間的切換實現不同功能。
? ? 2. 建立多個相機,通過改變相機的Depth數值,切換主副相機。UI可以建立專門的UI相機。
? ??
? ? 另外,在裝配場景中,可以將相機旋轉中心設置為裝配體的位置,讓相機始終跟隨裝配體旋轉和移動。
? 3.2 零件的拖拽和旋轉
? ? 首先要建立零件的層(Layer),只有在這個層里的物體才會被鼠標射線選中拖拽,防止其他物體干擾;其次,使用鼠標射線拖動和旋轉的代碼很多,借鑒一下大神們的基本都沒有問題。
? 3.3 裝配位置提示
? 考慮實現是功能是:當選中一個零件準備裝配時,這個零件的正確裝配位置會有一個同樣的零件形象忽明忽暗地提示,如下圖1。大致的思想如下圖2。
?? ??
總結
? 在制作過程中還有一些小細節需要不斷完善,比如需要規范管理那么多種類的文件、UI的層疊結構等,在本專欄中的后續文章會有過程記錄。