OpenGL3 3使用Assimp匯入骨骼

2021-10-24 06:55:27 字數 1305 閱讀 6880

我們在每個頂點中新增骨骼陣列 如圖:

weight是每個骨骼對該頂點的權重 總共加起來不能超過1

骨骼 id 是存放所有骨骼變換的陣列中的索引,這些變換會在進行 wvp 變換之前作用到位置向量和法線向量上(即將頂點從骨骼空間中變換到區域性座標系中)

骨骼樹中的骨骼變換是在骨骼空間中進行的(每個骨骼都有其自己的座標系所以我們需要將所有的變換乘在一起

偏移矩陣的工作就是將頂點位置座標從模型的區域性座標系變換到當前骨骼的骨骼空間中。

骨骼樹中的每乙個節點都儲存了乙個指向其父節點的指標和乙個儲存其所有子節點指標的陣列

節點中還儲存了乙個從當前骨骼空間變換到其父節點空間的變換矩陣

每個骨骼節點還應該有乙個字串用於儲存節點名

如果乙個節點代表了骨骼層級結構中的乙個骨骼,那麼節點名必須與骨骼名相匹配。但是某些情況下節點的名字可以為空(這表示這個節點沒有對應的骨骼)

aiscene 物件中儲存了aianimation 陣列 每乙個 aianimation 物件都表示乙個動畫幀序列,例如行走、跑、射擊等動作。通過在關鍵幀之間插值,我們就可以得到與當前動作像匹配的視覺效果

乙個 aianimation 節點中儲存了乙個用 tick 計數的持續時間,以及每秒的 tick 數(例如: 如果持續時間為 100 tick, 每秒的 tick 值為 25,這表示整個動作的持續時間為 4 秒)

這使得我們能在不同的硬體平台上保持動畫表現的一致性。此外每乙個元素中還有乙個 ainodeanim 物件陣列,陣列名為 channels 。陣列中的每乙個元素中存放的實際上就是乙個骨骼的變換資訊,這些資訊裡面同樣儲存了乙個骨骼名字串和三個分別表示縮放、旋轉、平移的陣列。

為了計算出某個時刻骨骼最終的變換矩陣,我們需要根據當前時間對關鍵幀之間三個變換陣列進行插值,並將這些變換組合成乙個矩陣。這些完成之後我們需要在骨骼樹種找到對應的骨骼節點並遍歷其父節點,之後我們對它的每個父節點都做同樣的插值處理,並將這些變換矩陣乘起來即可。

骨骼的最終變換矩陣是這樣計算出來的:首先是偏移矩陣,這個矩陣將頂點從模型區域性座標系變換到骨骼空間中;其次會乘上根據當前運動時間計算出來的節點變換矩陣。

這個匯入物件不要在棧區建立,因為棧區建立的區域性物件析構後,importer會把它載入的aiscene* scene 物件一起釋放了,但是計算插值骨骼資訊是需要儲存aiscene指標的。

從區域性空間到世界空間的座標變換稱作「w變換」,從世界空間到觀察空間的變換稱作「v變換」,從觀察空間到裁剪空間的變換稱為「p變換」(投影變換,projection transformation)

opengl 3 3做底層 QML做UI渲染

本文參照官方openglunderqml改寫,基本框架不變,若用opengl3.3 只需在main函式中設定format即可,如下 qsu ceformat format format.setversion 3,3 format.setprofile qsu ceformat coreprofile...

openGL 紋理使用

最近找了點資料學習了下opengl 紋理的使用 先有個 整體把握,然後再去看大部頭中的細節講解,感覺這樣的學習方式好些 總結下紋理使用總體流程 1 啟用紋理 glenable gl texture 2d 2 載入紋理 3 紋理 的顯示 載入紋理 1 讀取紋理影象高寬和畫素資料到記憶體中,老版本 op...

openGL 紋理使用

總結下紋理使用總體流程 1 啟用紋理 glenable gl texture 2d 2 載入紋理 3 紋理 的顯示 載入紋理 1 讀取紋理影象高寬和畫素資料到記憶體中,老版本opengl需要考慮寬度和高度不是的整數次方 2 分配乙個新的紋理編號 glgentextures 1,texture id ...