1. 程式人生 > 資訊 >5 筆塗出一隻 3D 貓咪模型:可跑可跳無需手動繫結骨骼,浙大出品,程式碼已開源

5 筆塗出一隻 3D 貓咪模型:可跑可跳無需手動繫結骨骼,浙大出品,程式碼已開源

二維圖片轉 3D 模型的技術不少,但能用你畫的草圖實時生成骨骼繫結的 3D 模型見過嗎?像這樣,順著已有的圖片描了幾筆,立馬就得到了三維模型:

▲兩倍速

一共描了五次輪廓就得到了一隻完整的 3D 貓模型,還綁定了骨骼:

看,可以像這樣活動骨架關節,隨時來一段鬼畜貓:

對比現有的很多自動生骨架建模方法,這一方法並不是在整個網格模型構建完成後,採用演算法處理並提取骨架。而是基於草圖,實時進行形狀建模和骨架建立。

並且,實驗也證明這一新方法的學習成本更低,不同經驗的專業人員都能快速上手。這項研究來自浙江大學,相關論文釋出在 Computers & Graphics 上,程式碼現已開源:

從草圖中建立動態骨架

要實時地從草圖中建立動態骨架,研究者主要分為三步來實現:

第一步是提取區域性骨架。首先是從原始草圖中進行簡單的多邊形採集,不過手繪影象難免會因為手抖或畫技問題出現線條的斷裂、不平滑等問題(也就是計算機影象問題中常說的噪音)。

所以,需要將原始線條均勻地離散小段直線來平滑這些噪音,再用 DP(Douglas-Peucker)演算法找到一個最接近形狀的簡化多邊形。

對於得到的簡化多邊形,通過連續向內偏移的輪廓線將多邊形劃分為單調的區域,提取得到一種直線骨架:

將上面得到的直線骨架中包含的不必要的頂點和邊緣刪掉,並摺疊小於特定閾值的短骨架邊緣,將直線骨架進行簡化。全部變化流程如下:

第二步,連線子骨架。研究團隊以互動式的成對方式連線子骨架。當用戶建立一個新的子部件或移動一個現有的子部件時,立即檢查當前子部件是否與其他子部件相交。如果相交,就把當前子部分的骨架與被交的子部分的骨架連線起來:

這符合使用者互動式地逐個建立三維模型的真實場景:新的子部件被連線到現有的子部件上,同時,新的子骨架被連線到相應的子骨架上。

第三步、全域性骨架細化。在上一步中,當兩個或多個子骨架連線到父骨架的類似位置時,常常會生成多餘的短骨。因此,這一步中首先要進行曲線簡化、關節合併、分支修剪和邊緣摺疊。

其次,為了控制模型不同部位的骨架的複雜性,研究者將 3D 模型旋轉到 XY 平面,把子形狀和分支從三維空間對映到二維空間:

然後通過在二維空間執行 BoundedDP 演算法,將簡化後的分支重新對映到其原來的三維位置。

▲BoundedDP 演算法步驟

最終,一個最開始是手繪草圖的影象,就變成一個綁定了骨骼的 3D 模型了:

演算法速度更快,安裝即玩

研究者首先對比了本文提出的骨骼模型生成演算法與已有方法的執行時間,可以看到,其速度優於大多數方法:

研究者還請來了 12 位經驗各異的使用者來使用 MonsterMash2、RigMesh3,以及本文提出的系統來建立 3D 模型。可以看到,使用本文提出的系統建立得到的模型精度最高,但花費時間卻較少:

在開原始檔中,研究者提供了一個 exe 的可執行檔案,安裝即玩。如果要進行測試,要先安裝 Qt、 OpenCV、 Boost、 Libigl (Tetgen、 Triangle、 CGAL、 Eigen) ,並根據庫的安裝路徑修改相關檔案。目前的測試環境則是這兩種:

話不多說,去找張狗的圖片試試能不能搞個鬼畜狗模型了 [狗頭斜眼]。

論文:

https://arxiv.org/abs/2110.05805

下載連結:

https://github.com/jingma-git/RealSkel