在這篇文章中,我將和各位分享一些 Box Pleating Studio 背後的故事。我主要會從摺紙的觀點來談,至於程式設計的觀點,各位可以參見我的另外一個部落格,裡面有一個系列文章是在討論這方面的主題的。
GOPS 的發現
故事是從 2016 年末開始的,那時 Robert J. Lang 本人讓我首次知道了他的 《Origami Design Secrets》的第二版之存在;在那之前,我只有讀過第一版而已,並且完全不曉得第二版早就已經出了。當然,我馬上就訂購了該書並且對新的章節與材料感到無比興奮,正如 Lang 所預料的那樣。當時我們已經通信了一陣子,而他對我的數學背景很清楚,他覺得我有可能會在讀完那些新的章節之後有一些新的想法,而他確實說中了。
巧的是,當我收到那本書的時候,我當時正在設計我的藍蟹(Blue Crab)、其中使用了一個 30° 圓包裝與箱形褶的混合系統。那個設計是沒啥問題,但是其中的混合系統無可避免地導致了一些有點隨機的轉接摺痕,而我不太喜歡我必須用近似法去摺出那些參考點的這一部份。我很快地就發現到 ODS 第十四章提到的多邊形包裝有可能解決我遇到的問題,於是我試著重新用該系統來設計我的藍蟹,而那確實可行——算是啦。由於這個模型是針對市售摺紙用紙在設計的,其箱形褶版本只用了 22 單位的格子,而因此為了讓它可行、裡面必須用到一些不是那麼討好的移階器。於是到頭來,我還是比較喜歡原本的混合式設計,但儘管如此,在我摸索著錯位畢氏伸展的過程中,當我開始問「如果我用了一個大於 1 的錯位會怎樣」的問題時,我開始發現了一些深藏其中的潛力。
起初,這個問題聽起來沒啥道理,除非我是真的想要製造一個大於 1 的移階;但是,如果我們把多餘的錯位沉摺回去的話,那突然之前我們就開啟了一整族的新可能性。原本的畢氏伸展有一個問題在於,完美畢氏伸展很少見,而「不完美」的那些則常常會跑出襯片碎片;然而用了這個 「廣義錯位畢氏伸展」(簡稱 GOPS)的話,我們就有一個大上許多的解空間,使得我們更加有可能命中一個解答 1,而就算沒有解,其整數性的本質也使得我們可以很容易地組合複數個 GOPS 成一個複合解。同時我也將其構造法推廣到了具有三個或更多角片的佈局之上。
我對這些發現深感興奮,於是我就寫了一篇 20 來頁的手稿給 Lang 來描述我所發現的那些模式。有趣的是,他那時也正在發展他自己一套版本的畢氏伸展推廣,他稱之為 GPS (其中「G」原本代表「圖像(graphical)」,但他後來為了配合我的命名而將之改成了「廣義」),而 GPS 竟然正好跟 GOPS 是互補的。Lang 同時也做出了一個非常重要的發現是,交疊矩形的面積在 GOPS 跟 GPS 之中扮演了非常重要的角色,而這最終導致了我們的整數分解式的構造演算法 2,而那正好跟我在數論方面的背景有很深的連結(誰能料到?)。我接著又寫了另一篇也是 20 來頁的手稿給他,把多角片情況中的一般構造演算法補充完畢,而之後來回通信了幾次之後,在 2017 年中間我們決定要來一起寫一篇這個主題的論文。
我們討論後決定接下來將舉辦的 7OSME 會是提交論文的最佳選擇。不過這邊有個問題;OSME 的頁數限制非常嚴格,精確來說是只能 16 頁,而要把我們全部的發現都塞到這個範圍裡面根本就不可能(那樣大概會花上 60 頁左右,考慮到所有的插圖以及各種宣稱的嚴格證明所需的額外篇幅)。我們只好選出最關鍵的部份,並且在應用一節中編排出一個盡可能展示出最多東西的範例出來,然後省去了其構造過程的大量細節。最後我們總算生出了剛好 16 頁(包含參考目錄)的論文,完全沒剩任何空間。其標題為 《箱形褶單軸基本形中的廣義錯位畢氏伸展(Generalized Offset Pythagorean Stretches in Box-Pleated Uniaxial Bases)》 ,發表在《 Origami7》第二冊,第 591-606 頁。
Box Pleating Studio 的開發
到目前為止還好,不過我知道這是不夠的。並不是每個人都能完全理解其構造方法(尤其是我們省略了多角片情境中幾乎全部的構造細節),而就算有懂,要去計算那些模式還是很花工,特別是對於多角片的情況。因此,自從 2018 年初我就開始著手設計一個應用程式來幫忙自動計算這些模式。
然而,我希望這個應用程式不是只是一個 GOPS 計算機而已。我自己當然也做過不少的箱形褶設計,而其中一個我覺得特別花時間的環節就是我需要反覆反覆又反覆地方格紙上畫出不同版本的候選佈局。就算我只對其根本結構做了一個小修改,我很可能也還是要全部重畫,因為這個小修改往往會影響到整個佈局的包裝。我想要大幅提昇這個過程的速度、而辦法就是來作一個應用程式讓你可以直接拖曳角片、而它會自動替你判斷出必要的伸展以及河的形狀。這也就是說,再也不用方格紙以及無數小時乃至數天的試誤法了,而整個設計過程甚至可以加快到十倍。
在摺紙界中,像這樣的應用程式基本上是沒有先例的,所以我沒有例子可以作為參考。幸好,我並非只是一個剛好會寫程式的摺紙家;我是一個靠寫應用程式吃飯的職業軟體工程師,也就是說除了知道程式怎麼寫之外,我還知道不少把程式寫得好的竅門。我決定以網頁形式來打造這個應用程式,於是它不但可以完全跨平台、也可以免安裝就直接使用 3,這點對於分享設計和推廣該程式都很有幫助。我也設計了響應式(也就是對任何螢幕解析度都適用)的使用者界面,使得它從桌上型電腦到手機等任何裝置都可以使用,同時我也把它多國語系化,在第一版中就內建了三種語言(如今有六種)。
這個程式的最大挑戰在於要能非常快速;它必須要能夠在使用者拖曳角片或改變樹狀結構的時候,瞬間重新計算可能的模式。相依性管理也是一個困難的問題:河的形狀取決於角片之間的模式、而後者又取決於角片之間的重疊狀態、而這又取決於各個角片的位置,諸如此類。一個典型的箱形褶設計很容易就可以在變數之間有數千個這樣的相依關係,而如果要靠程式碼來手動管理它們絕對是一個糟糕的主意。為了克服這些困難,我花了大概一年的時間開發我自己的程式框架 Shrewd,它本質上就是程式設計中的觀察者模式的一種高階實作。它會替我自動管理所有的相依關係,並且以正確的順序更新所有的依存變數、且只有在需要的時候才會加以更新。
在終於完成了 Shrewd 框架之後,下一個主要挑戰就是要把伸展模式表示成數位資料。知道演算法怎麼運作是一回事、而要把演算法描述給電腦聽又是完全另外一回事。我花了好幾個月的時間苦思資料表示法,直到在 2020 年九月我終於有了重大的突破、想出了「組態」跟「裝置」的兩層額外的資料抽象化,而利用這些抽象化,我終於能夠把任意複雜的模式表示成電腦資料了。
那實在是令人興奮的一刻,我忍不住在臉書上發表了一篇預告說 Box Pleating Studio 即將發表了。幾天之後,來自新加坡的 Lucas Tay Kiat Loong 跟我聯絡,說他一直對 GOPS 非常感興趣,他甚至專門為了我們的那篇論文跑去買了 7OSME 第二冊。不用說,這直接保送他成了第一位封閉測試員。在接下來的幾個月中,我們密切合作,完成了剩下的實作、根據他的意見回饋做了許多改進,並且修正了數之不盡的錯誤。終於,Box Pleating Studio 的第一個公開版本在該年的聖誕節釋出了;我刻意這麼做,因為我當那是我獻給全體摺紙界的聖誕禮物。
那可以說相當地成功;在第一週裡面,就已經累積了來自 77 個不同國家地區的 1,500(剛好)位不同的使用者。當然,我並沒有因此停止改進 BP Studio;在那之後我已經在 GitHub 上頭做了超過 170 次認可,並做了超過 900 次的版本建置,每次都讓 BP Studio 變得更好。
當然前頭還是有著漫長的路要走。一直到現在,BP Studio 都還是沒有完全實作完所有我在寫給 Lang 的手稿中的構造演算法,不過我一直有慢慢地在朝著那個方向努力。我也計畫著要加入更多功能,像是支援對角對稱以及傾斜格(tilted grid,因為 Shuki Kato 的創作而出名)、輸出可完全摺平的 CP、更多的編輯功能,以及,或許,最終也能擴充至非單軸的設計。
使用 BP Studio 的原創設計
截至本文寫成為止,BP Studio 已經有了超過 3,500 位不同的使用者。這邊是一些自從 BP Studio 發行以來,我有找到的或是由作者提交給我的、使用(或部份使用)了 BP Studio 的原創設計。以隨機順序排列如下:
太神啦,期待下一篇文章,我要來複習一下ODS!
哈哈,謝囉;我有空就盡量寫 😁
挺好用的,感谢
哈哈,謝謝喔。如果你有用它設計任何作品,請務必讓我知道 😄
Hello Mu Tsun Tsai
I enjoyed the developed app you developed, the problem I can’t download this program.
Mr. Mu Tsun Tsai I am desperate, I would like to understand the art of origam.
I don’t want to re-fold any pre-made animals, I want to think about the geometry myself and create my own characters on screen.
This app does not exist in Germany.
With friendly greetings
Marcel
Hello! You don’t need to download anything. Simply visit https://bpstudio.abstreamace.com/ and the app launches right in your browser.