把 CGAL 的 Alpha Wrap 搬到網頁上
最初會開始做這個 Project 是 2024 跟 Fred 在做 Arch Form 的時候。當時的關鍵的問題是:「如何將建築利用不同的形態分類並得知他們之間差異有多大?有沒有辦法知道(A 建築 + B 建築)/ 2 的型態會是什麼樣子?」
為了回答這些問題,我們用瑞士公共建築競圖的資料集訓練了一個 Point Cloud Auto Encoder 並設計了一個網頁呈現 Latent Space 降維後的結果;同時,使用者可以選擇一些建築、調整權重,系統會內插 Latent Vector 並藉由部屬在網頁上的 Decoder 來產生新的 Point Cloud。
事情到此似乎算告一段落,但離完整還差一哩路——稀疏的點雲並不好觀察與理解,我們需要找個方法把生成的物體轉成 Mesh。
最簡單直接的方式無疑是 Convex Hull,甚至 Three.js 直接就內建了;然而,Convex Hull 的缺點也很明顯,細節與凹洞的丟失對我們這個專案來說實在是難以接受。當時 Rhino 的 ShrinkWrap 功能剛在 Beta 版推出,順藤摸瓜便找到了 CGAL 的 Alpha Wrap。
要把 C++ 寫的 CGAL 功能搬到網頁上並不是一件容易的事。雖然有 Emscripten 這樣的工具,但 CGAL 底層函式庫的的優化和 web assembly 的限制讓我不斷碰壁,最後雖然成功在網頁上 wrap 出東西,但只有在某個模型的某個特定參數下才會工作,任何其他情況都會拋出異常。
死線讓我不得不放棄,但我一直惦記著這個只差臨門一腳的專案。
最近訂閱 Claude Code 之後,除了叫他幫忙輔助正在進行中的研究,把 Alpha Wrap 搬到網頁上便是我最想填滿的坑。幾番來回,AI 就把 code 修好了——什麼 error 都沒有,root cause 和解決方法也解釋得清清楚楚。AI 進步之神速著實令人惶恐,但時隔 2 年終於把懸著的心放下也屬於是相當舒爽,甚至帶了一點雀躍。
https://petingo.cc/alpha-wrap-js/example/