計算機動畫 蒙皮筆記

2022-05-03 00:57:07 字數 1570 閱讀 3774

最近剛開始接觸計算機動畫,一片空白,嘗試做了一下3d蒙皮,發現數學真是差得難以想象,矩陣的什麼的全部忘記了,真是接下來該惡補一下基礎了……

在這裡把遇到的幾個問題記錄一下。

主要參考書目:《計算機動畫演算法與技術》《3d遊戲》(英國人寫的書已經絕版了)《3d遊戲引擎設計——實時計算機圖形學應用方法》 《骨骼蒙皮動畫(skinned mesh)的原理解析》

關節就是乙個變換矩陣,在層次儲存中,一般會從根節點開始一層層的儲存關節矩陣:

所以每個關節儲存的矩陣都是建立根關節之上的。

以3個關節為例,轉換如下:

—(t0世界矩陣)—>link0—(t1相對link0的link1轉換,相對旋轉r0)—>link1—(t1.1相對link1的link1.1轉換,相對旋轉r1)—>link1.1

另外每個關節的變換無非就是旋轉加平移。

故,設有一在link1.1的座標中有頂點v,那麼將其轉換到世界座標v'就是:

v' = t0*t1*r1*t1.1*r1*v(這裡使用列向量)

這個其實就是將區域性座標中的頂點通過這一系列的矩陣變換到世界座標中。

在蒙皮頂點混合的時候由於我寫的程式還是相當蛋疼的,我為了方便匯入把乙個模型拆成了3個模型,然後把三個模型一一變換到世界空間,這樣免去從模型空間到骨骼空間的計算,但是在混合的時候需要根據骨骼來裝換頂點到對應的骨骼空間,這些東西都在shader中計算完成。(雖然嚴格的講這個叫做關節動畫==)

#version 410

core

layout (location = 2) in

vec4 a_position;

layout (location = 3) in

vec4 a_weight;

uniform mat4 mv_matrix;

uniform mat4 proj_matrix;

uniform mat4 b1_matrix;

uniform mat4 b2_matrix;

uniform mat4 b3_matrix;

uniform

intbone;

//骨骼長度

float bone_len = 47.2441f

;void

main()

}

然後是截圖:

混合頂點後

最後需要考慮的是蒙皮,蒙皮意味著只有乙個mesh,由骨骼來決定這個mesh中每個頂點的位置。

一般來講,會在建模工具中就計算好乙個初始姿態,即t姿態。這時候其實可能會計算從對應的骨骼空間變換到t姿態模型空間的逆矩陣(意思是mesh上的任何乙個頂點(只要這個點被認為在對應的骨骼空間中,所以有負值的座標)都可以通過這個矩陣轉換到模型空間),有了這個逆矩陣,在蒙皮的時候就可以使用此逆矩陣將所有模型空間的頂點轉換到對應的骨骼空間中,而且將乙個頂點轉換到任何乙個骨骼空間中都是正確的,這就直接導致可以使用權重來決定每個頂點收各個骨骼的多少影響,而最後的位置就只需要乙個公式就能解決了。

計算機動畫理解

如果把圖形引擎看作乙個系統,輸入引數就是頂點,紋理,輸出就是各個對應畫素點的顏色。而動畫系統的輸入時時間,輸出就是圖形引擎的輸入,所以動畫本質上市通過改變頂點資料和紋理資料來實現的。常見的有兩種動畫 序列幀動畫和骨骼動畫。序列幀動畫通過時間來改變紋理進而實現最終影象的變化,不同的幀對應不同的紋理。骨...

計算機動畫 形狀插值

內插 關鍵幀之間的過渡 外插 分析變形或運動趨勢,估計關鍵幀之前或之後的姿態 插值 經過2個關鍵幀 對稱 與運動方向無關 平滑 頂點路徑光滑,一階連續且可導 affinity transformation reproduction 如果乙個仿射變換能把s0變為s1,那麼中間幀也應由s0作仿射變換得到...

計算機動畫 路徑控制 二

因為在前一篇提到的乙個路徑插值的思想是,三階連續。但是這個三階的意義在實際中是不存在的。像下面一幅圖,對於兩個點中間的這三個位置不同的點,用同樣的方向去表示他的速度覺得是不科學的 對此有兩種處理方法 我也不曉得兩種可不可以一起用 用角平分線表示方向 在計算前後兩段曲線的時候分別給以不同的速度 這個其...