2020年12月1日 星期二

Computational Brick Design

身為工程師,對於只要能手動操作的各種行為,都相信會有自動化的可能。但遇上複雜且千變萬化又總被冠上創意的美名的積木玩具(尤其指LEGO),還能夠實現自動化夢想嗎?經過探訪,發現答案是肯定也是否定。肯定是因為程式的確能自動設計出2D和3D物件,但評估其成品和創意及精美還有很大一段距離。

基礎工具:圖形化各式積木零件

自動化的首要動作是對零件的了解,透過樂高公司釋出的資料庫,我們能掌握現有零件數量已達二萬種以上,而資料庫內容包括各零件的編號、3D描述語言、顏色等資訊。

如元件 "18654.dat",可參考此處連結取得3D資料。參考ldraw python專案(連結),可用三步驟將任一元件轉變成不同視角的圖片。畫出圖形連結 連結

conda activate ldraw
from ldraw.figure import *
from ldraw.library.colours import *
from ldraw.pieces import Piece
print Piece(Black, Vector(0, 72, 0), Identity(), "4716")
python 上述程式.py > temp.ldr
ldr2pov temp.ldr temp.pov 160.0,80.0,-240.0 0,0,0 (相機角度等參數)
povray +Itemp.pov +FN16 +Otemp.png +Q6

類似產生圖片範例還有(連結)。產生出的照片可以應用在網站(如rebrick)或是編輯軟體,自己則想到可以印出成海報或T恤。

上述專案還能一次組合多個元件,透過預先了解的大小和形狀資料,決定顏色和放置位置,形成複雜物件。python example/brother.py > temp.ldr  Person是個特定的位置區,一個個放進Piece後,包進Group,再旋轉移動Group。

基礎工具:自動生成安裝說明書

以ldraw為核心的editor,可幫助組裝積木(連結) (連結),或是當做呈現動態組裝過程的產生器(連結)。結構變成可以視覺化的順序圖 連結 連結 連結

模擬2D Mosaic

輸入平面圖案,經過轉換成以pixel為單位的拼裝指示(連結)(連結)。

模擬2D Layout

Mosaic是精確模擬,但現實的模擬往往是更複雜的,如何高效及穩固方式填滿指定形狀(空間)的數學問題,基本方式是採用圖學演算法如專案2D-LEGO-GA(連結)以基因演算法為核心,conda activate study project/legoga/  執行 python run.py --types_num 3 --max_brick 7

隨機產生不同形狀數量的積木BAG,再產生約近百個族群(不同排列方式),接著透過變異過程(包括置換,增加等操作手段),以填滿個二維長方平面覆蓋率為標進行運算。最後將數值轉換為圖片顯示。

之後可以繼續測試項目如下。 1.改變平面形狀,例如中空。 2.讓袋子內容變成無限制。 3.評估分數,由覆蓋率改為使用數量。 4.套用上述拼裝過程順序。

類似專案(連結)(連結)論文(連結)。而這是3D版本的連結 連結 。

除基本圖形演算法外,近來更加入人工智慧(連結),例如TilinGNN(連結),嘗試以幾個基本形狀填滿各種不同形狀。程式 conda activate tilin /project/TilinGNN,python Tiling-GUI.py 。概念是,先產生所有形狀組合,隨機產生形狀讓系統學習最適合排列方式。

1. Change to drawing mode by Key M
2. Draw the shape that you like
3. Transform by the shapes (Z/X, -/=, UP/DOWN/LEFT/RIGHT) or edit the shapes in Edit mode
4. Crop superset by Key E
5. Solve the problem by Key S (with number of trials)


模擬3D Shape

簡單說就是用積木逐漸填滿3D物體,填的越像越好,範例Automatic Generation of Constructable Brick Sculptures(連結 連結),有C語言版本(連結),以及Python簡化版本(連結)。

論文圖片

程式legobuild  python main.py,還在摸索中。資料格式為xxx.csv,有3D空間中每個點的位置和顏色。作法上是以Z為平面,由底開始,逐層挑選需要積木,並且在鋪設時考慮其上層結構與目前這層關係是否合理,若有需要則建構出輔助積木,並且考慮穩定性(另外一篇可考慮穩定性議題 連結),如圖片中身體部份就不只是單獨顆粒,而是交叉放置,最後完成全部物件。GAN程式(連結)。

其他參考資料如bricker,這似乎是Add-On程式(連結 連結),使用說明(連結 連結)。還有一類可手動操作軟體(連結)。

從擬真的角度來說,即使完成這個部分,也會因為使用的積木都是方形,使得造型過分簡單。雖然有素人童趣,但從專業角度來說,還是太粗糙,解決方式是加入更多不同零件,例如Automatic Generation of Vivid LEGO Architectural Sculptures( 連結 )就加入圓弧和三角等造型,並且用類神經網路來優化。但當元件項目達到數十上百種時,基本演算法或許就無法處理,得用CNN(或YOLO)等比對概念來選擇。可能的作法會是。決定要模擬的3D物件以及縮放的比例。將物件縮放到最終尺寸。用不同大小和位置,框選物件上的一個區域,再以CNN的方式選擇合適項目。

拼裝3D Technic Sketch

前述是外表的模擬,但要如何模擬sketch架構呢?Computational LEGO Technic Design(連結)影片(連結),即利用Technic元件完成這個目標。

論文圖片

首先牠假設已有一組已經事先定義好的零件資料表,並且輸入要完成的線條結構圖。填滿的過程先執行sketch coverage,過程中除考慮不同零件如何連結,更有最優化的機制。我很喜歡這幾個人的補充(連結)。例如This would be a great tool for prototyping and for non-AFOL makers who are trying to build simple models from their imagination. I can also see this being helpful for people who are new to Technic, have difficulty with spatial reasoning, or have physical disabilities that prevent them from building things by themselves. This could be a nice tool for educators, too.

而實際運作上,很好奇這系統如何處理斜線?以及互動過程中Guide Graph會動態調整嗎?檢查結構是否穩固則可參考(連結)。

千呼萬喚始出來,相關程式碼連結。介紹連結

自動轉化3D物件生成Sketch

上面專案的sketch是靠軟體手繪而成,難度太高。而現成資料庫中,幾乎都是只有外型,並沒有Sketch,順便列出物件資料庫資訊(連結 連結 連結)。

是否能直接由3D物件產生出Sketch呢?這方面的研究有兩類,第一類是尋找內部"骨架",而不是架構,例如Predicting Animation Skeletons for 3D Articulated Models via Volumetric Nets(連結),程式位置(連結)。概念可參考(連結)。

第二種是我較感興以簡化物體外型擷取出物件"架構"為主,如Learning Shape Abstractions by Assembling Volumetric Primitives(連結),訓練資料來自ShapeNet資料庫,取得物件第一階段造型,結果如下圖。程式 project/PyTorch/shape,待瞭解。值得一提是作者的人工智慧template可參考(連結)。

論文圖片

以此為基礎,北京清華後續研究加入多層次概念,Learning Adaptive Hierarchical Cuboid Abstractions of 3D Shape Collections(連結),技術上使用oct-tree,與前者相比,產生了第二層細節,視覺上更為完備,作者也認為可繼續加入更深層次。程式 conda activate shape  project/tensorflow_gpu/shape1 執行 python training_script.py --category airplane

論文圖片

未來應用,或許是先下載3D資料庫,由上述內容繪出架構,再由上節程式製作出以科技件為主的安裝說明書。系統則透過瀏覽或搜尋方式,讓使用者挑選項目後可自行拼裝。

其中搜尋部份,或許可採用素描搜尋(連結 連結),資料庫為普林斯頓3D資料庫,以類似手寫辨識方式,或機器學習方式(連結),找到最接近項目。參考範例(連結) (連結)。

沒有留言:

張貼留言