3D中帶光照的骨骼動畫原理

2021-05-26 17:26:40 字數 1983 閱讀 3944

常見的模型動畫分為關鍵幀動畫與骨骼動畫,這裡我只關注與骨骼動畫,骨骼動畫又叫頂點混合動畫。

頂點混合維護了乙個單獨預設姿勢和許多用來正確旋轉、平移預設姿勢的多邊形網格的各個部分矩陣,這些不同的矩陣變換通常被稱為骨骼。乙個或多個這樣的矩陣控制了再這個預設姿勢的多邊形網格中的每個頂點。每個矩陣被賦予了乙個權重因子,指明了這個矩陣對每個頂點的影響多少。(3d軟體裡常用人工互動來刷權重資訊)

當渲染這種型別的模型的時候,首先用在頂點的骨頭集中的每個矩陣變換每個頂點,然後根據矩陣對應的權重因子對每個矩陣變換的結果進行加權求和。這個新的位置是被混合的頂點位置。

主要步驟分為:從矩陣構造姿勢;考慮變換後的光照資訊。

這裡值得注意的是光照資訊的計算,為了正確的光照,需要為每個點計算相同的被變換的和加權平均的法向量,除了需要用每個矩陣的轉置的逆來變換法向量而不是用矩陣本身(原因見分割線以下)。假設骨骼矩陣只是旋轉和平移將簡化為光照進行的法向量變換,因為沒有縮放和投影的矩陣的轉置的逆就是這個矩陣本身。

------------------------我是分割線---------------------------------

法向量的變換矩陣為「頂點變換矩陣的逆矩陣的轉置」

這篇文章的思想源於潘李亮的《3d變換中法向量變換矩陣的推導》一文。

其實也就是看了篇文章後才知道,原來法向量的變換矩陣與定點的變換矩陣是不一樣的。而《directx 9.0 3d遊戲開發程式設計基礎》這本書的作者視乎也忽略了這點(此書的p306貼出的**部分,是將頂點的變換矩陣直接用作法向量的變換矩陣)。正如《3d變換中法向量變換矩陣的推導》一文最後所說的,「即使你看到了所謂的正確的結果,那也是近似正確的,至少在理論上,它就是不正確的^_^。」

為什麼法向量不能利用頂點變換矩陣來進行變換呢?可以從乙個例子中看出來:

三維平面: x + y = k 法線n =[1 1 0]

x方向放大 2倍,相應的變換矩陣:

|2 0 0 0 |

a  = |0 1 0 0 |

|0 0 1 0 |

|0 0 0 1 |

n*a=[2 1 0]

其中*表示矩陣相乘。

可以看出,變換後的法線不再與面垂直了。

那法向量的變換矩陣是什麼呢?這個推導過程很簡單。

下面的式子本是源自於《3d 變換中法向量變換矩陣的推導 》一文,為了方便表示,進行了一些改動:

p1,p2:世界座標系中的點

q1,q2:p1、p2變換到檢視座標系中的點

n:是p1、p2所在平面的法向量

m:是檢視空間中,n所對應的法向量

mv:變換矩陣

世界座標系中,p1、p2點組成的向量與法向量n垂直: 

(1) n*(p1-p2)'=0

同樣,檢視空間中,q1,q2點組成的向量與法向量m垂直: 

(2)m*(q1-q2)'=0

將世界座標系中p1、p2變換到檢視空間中q1、q2點: 

(3)mv*p1'-mv*p2'=mv*(p1-p2)'=(q1-q2)'

其中,'表示轉置,*表示矩陣乘。將向量相乘寫成矩陣相乘的形式,而且這裡是利用的矩陣左乘來進行座標變換,要注意directx中是利用的矩陣右乘來進行座標變換的,請注意區別。

式子(3)中:(q1-q2)'=mv(p1-p2)'帶入(2)式後:(4)m*mv*(p1-p2)'=0。

比較(1)、(4)後得到:(5)n=m*mv

(5)n=m*mv =>(6)m=n*in(mv)。其中in(mv)表示mv的逆矩陣。

所以(6)m=n*in(mv)=>(7)m'=( in(mv) )'*n'。

由式子(7)得到:法向量的變換矩陣為「頂點變換矩陣的逆矩陣的轉置」。

從線性代數角度,「矩陣的逆矩陣的轉置」與「矩陣的轉置再求逆」是相等的,因此也可以說成:「頂點變換矩陣轉置後的逆矩陣」。

恭喜你,讀到這裡,你已經掌握了法向量的變換矩陣的推導。也許你有點擔心,directx中是利用矩陣右乘進行變換的,那麼,到底法向量的變換矩陣是不是也一樣呢?其實,你可以自己推導了。而且我剛剛用上面的方法粗略的推了下,結果應該是一樣的。

從Sprite3D理解3D骨骼動畫原理

為了能夠更好的使用 cocos 為我們提供的 sprite3d 我和大家分享一下 sprite3d 中關於骨骼動畫原理的部分,本文使用 cocos2d x 3.2 版本,這是 cocos 首次出現 3d骨骼動畫的版本,相對與本文寫出來時候最新的 3.5版本,由於沒有其他比如燈光等功能,3d目前引擎支...

3D電視與3D眼鏡的工作原理

1 先說3d成像原理 在 3d 裡面的 d 是英文單詞dimension 線度 維 的首字母,3d指的就是三維空間。與普通2d畫面顯示相比,3d技術可以使畫面變得立體逼真,影象不再侷限於螢幕的平面上,彷彿能夠走出螢幕外面,讓觀眾有身臨其境的感覺。儘管3d顯示技術分類繁多,不過最基本的原理是相似的,就...

《玩轉3D列印》 1 2節3D列印的原理及材質

1.2 3d列印的原理及材質 玩轉3d列印 1.2.1 3d列印原理 3d列印技術每一層的列印過程分為兩步。首先在需要的區域噴灑一種特殊膠水,膠水液滴本身很小,且不易擴散。然後是噴灑一層均勻的粉末,粉末遇到膠水會迅速固化黏結,而沒有膠水的區域仍保持鬆散狀態。這樣在一層膠水一層粉末的交替下,實體模型將...