1091-交大-互動式形變


Introduction

  • 作業量: 2
  • 考試量: 0
  • 整體難易度: 2
    (滿分 5 分)

自己實驗室老闆開的課 而且本來大學就主修圖學的我不修一下這門課說不過去

這堂課學生人數少 (6, 7個) 由於內容已經是比較深入一點的圖學課程 會來修這門課的就少很多
英文授課 老師的英文連我這種英文很差的人都很好聽懂 但在數學較多老師看我們一臉茫然的時候就會用中文教 XD

這門課沒有任何考試 只有作業 作業量也中偏少 但若沒有寫過數學類型的程式經驗可能剛開始會不知道從何下手
上課內容幾乎都是傳統圖學的論文 老師將論文製作成投影片後上課
每一個作業也都是論文的內容 會提供 Project 只需寫重點部分(數學)
最後期末老師會給 list 讓你自己挑論文實作 這部分就看個人功力

這門課的 loading 並不重 推薦給對於圖學有興趣或是想要練習把數學式寫為程式碼的高手


Careful

每個作業要小心的部分其實差不多 就統一寫起來

老師提供的 glm vertex 的 index 是從 1 開始數 而非 0
所以 vertices[0-2] 是沒有東西的 並且小心迴圈開始的 index 以及 +1 -1 的問題以及更新原本的 mesh

基本上都是在解線性代數的 Ax = b 起頭的時候先清楚這個矩陣的 rows, cols 各有多少 避免一開始大小就寫錯
最好先把數學式以及其代表的意義看懂再開始寫 最好先用紙筆寫一下矩陣內的 element 該如何擺放 降低擺錯的機會
在解矩陣的時候通常解不出來或爆掉都是矩陣擺錯了 所以得細心檢查迴圈在擺放時有沒有寫錯

如果有多項需要 optimize 的式子 可以觀察解出來的結果判斷可能哪項是錯的 或是只留一項拔掉其他幾項 一項一項檢查
如果有多個步驟每寫完一項步驟就應該驗證這項解出來的數學結果是否正確 不然全部寫完才找錯會很浪費時間


Project1 - Feature Based Deformation

簡單的 transform 想法 mesh 的變化會受到控制點移動的距離乘上乘上權重與距離的影響
有點類似內差的方法適合用於簡單的幾個控制點以及較小的形變與臉部變化

先將多個控制點聯立解出變形權重
之後再將整個 mesh 所有點跑過去依照距離加上控制點的移動乘上對應的距離影響


Project2 - Least Squares Meshes

這次的作業主要的目的為 mesh 的重建

我們有的資訊為原 mesh 10% vertex 的位置以及所有 vertex 的連線關係
依照 vertex 之間的關係 用 Laplacian 建出 sparse matrix

A 矩陣的上半部擺放 vertex 的連線關係(距離權重) 下半部擺放確定的 10% vertex
解出來的 x 就是重建過後 mesh 的 vertex


Project3 - As-Rigid-As-Possible Surface Modeling

這個變形方法假設形變由旋轉及位移組成與必須保持 local 的形狀

前面的作業都是解線性的 但由於旋轉是非線性的 這次需要用迭代來解(其實只是迴圈多解幾次)

其實建矩陣的概念與 Project2 很像 A 矩陣的上半部是 Laplacian 下半部是 constraint 只是這次上半部的權重都擺 -1
b 矩陣擺上維持 local 形狀式子的結果 下半部一樣是 constraint

這次數學式看似複雜 但在矩陣的 element 的擺法與前一個作業相去不遠 只是假設與權重稍微不同而已


Final Project - Embedded Deformation for Shape Manipulation

最後期末我選擇的是難度 4 的這篇 paper - Embedded Deformation for Shape Manipulation

主要的流程是先將原 mesh embed 到作者定義的另一個空間 Deformation Graph
之後在這個 Deformation Graph 上解形變 包括三個需要 optimize 的 energy (rotation, regularization, constraint)
再將解完的結果 transform 回去原來的 mesh
這樣做的優點是 可以將原本 vertex 過多的 mesh 降低非常多的數量來加速
以及各種 mesh 的形式(animation, partical)都能 embed 到 Deformation Graph 達到通用性

實作方面在一開始 embed 的時候原 paper 使用 uniform sampling 因為這有點麻煩 這邊我用 MeshLab 來幫我做(Voxel based)
再來將主迭代流程先 implent 出來 (Gaussian Newton)
之後先寫了計算 error 的部分 (Erot, Ereg, Econ)
最後將微分的 function f 跟 Jacobi 寫出來(這裡花最多時間)

在微分出來的 f 跟 Jacobi 這邊蠻容易寫錯的 因此要反覆確認各個 energy function 有沒有問題

在網路上本來有找到一份這篇 paper 實作的 code 但似乎某些地方是有寫錯的 (還害我懷疑很久到底是我寫錯還是他寫錯)
本來還想做 Partical 的部分 但最後由於時間關係有把最基本的形變寫出來就完成交作業了


Final

整學期修下來其實這門課的 loading 不算太重 但在寫這種數學形式的 code 比起一般寫 application 的思考方式會有點不太一樣
但由於在大學時就有寫過蠻多類似的 code 因此在這部分算是沒有太深的鴻溝

不過這種解數學式的 code bug 相對難找 因為不管你擺錯了任何東西 任何 bug 結果都是一樣 mesh 爆掉或程式直接 crash
在寫作業的過程就耐心的好好檢查每一個 index 以及矩陣擺放的 element 有沒有放錯吧

因為小弟自身就對圖學有頗有興趣 所以這門課學的東西學起來蠻快樂的 每一個作業可以玩玩自己寫出來的形變操作也蠻酷的
對於能看到自己寫 code 結果的人有興趣的 還是蠻推薦可以修一下的 :)