標籤:
最近剛開始接觸電腦動畫,一片空白,嘗試做了一下3D蒙皮,發現數學真是差得難以想象,矩陣的什麼的全部忘記了,真是接下來該惡補一下基礎了……
在這裡把遇到的幾個問題記錄一下。
主要參考書目:《電腦動畫演算法與技術》《3D遊戲》(英國人寫的書已經絕版了)《3D遊戲引擎設計——即時電腦圖形學應用方法》
關節就是一個變換矩陣,在層次儲存中,一般會從根節點開始一層層的儲存關節矩陣:
所以每個關節儲存的矩陣都是建立根關節之上的。
以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 corelayout (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 int bone;//骨骼長度float bone_len = 47.2441f;void main(){ vec4 new_a_position = a_position; vec4 new_a_position1 = a_position; //向上位移的頂點 new_a_position.y += bone_len; //向下位移的頂點 new_a_position1.y -= bone_len; //對不同的骨骼做不同的變換 switch(bone) { case 1: gl_Position = proj_matrix*mv_matrix*(a_weight.x*b1_matrix*a_position+a_weight.y*b2_matrix*new_a_position1); break; case 2: gl_Position = proj_matrix*mv_matrix*(a_weight.x*b1_matrix*new_a_position+a_weight.y*b2_matrix*a_position+a_weight.z*b3_matrix*new_a_position1); break; case 3: gl_Position = proj_matrix*mv_matrix*(a_weight.y*b2_matrix*new_a_position+a_weight.z*b3_matrix*a_position); break; default: break; } }
然後是:
混合頂點後
【電腦動畫】蒙皮筆記