第二十章 Skeletal Animation

2021-07-16 04:47:31 字數 2789 閱讀 3824

skeletal animation(骨骼動畫)是指互相連線的變換(骨頭)組成的分層集合,以及對應的模型mesh(即骨骼的**)。當這些變換隨著時間變化而變化時,模型的mesh就會形成動畫效果。本章,我們將會**skeketal animation,並開發一些系統用於支援模型動畫。

把乙個skeleton對映到乙個mesh的過程稱為skinning(換膚)。這項工作主要由乙個美術設計師完成,並涉及到與具體bone關聯的頂點。乙個vertex可以對應於多個bone(通常情況下最多可以有4個),每乙個bone使用乙個給定的數量值對vertex產生影響(比如,結合每乙個bone的影響)。因此,vertex的最終座標位置由所有對應的bones加權平均計算得到。

術語skinning還可以用於表示在執行時vertices如何進行變換。cpu skinning表示使用cpu執行vertices的變換運算,而gpu skinning則表示使用gpu執行變換運算。儘管gpu skinning對可用的bones數量有限制,但是一般情況下都比cpu skinning要快的多。列表20.1列出乙個gpu skinning shader**。

列表20.1the skinnedmodel.fx shader

#include "include\\common.fxh"

#define maxbones 60

/************* resources *************/

cbuffer cbufferperframe

; float4 lightcolor = ;

float3 lightposition = ;

float lightradius = 10.0f;

float3 cameraposition;

}cbuffer cbufferperobject

; float specularpower : specularpower = 25.0f;

}cbuffer cbufferskinning

texture2d colortexture;

samplerstate colorsampler

;/************* data structures *************/

struct vs_input

;struct vs_output

;/************* vertex shader *************/

vs_output vertex_shader(vs_input in)

/************* pixel shaders *************/

float4 pixel_shader(vs_output in) : sv_target

/************* techniques *************/

technique11 main11

}

該shader只是在乙個point light shader的基礎上增加了對skinned models的支援。所有關於skinning的操作都在vertex shader執行,執行過程中主要是使用了新的shader變數bonetransforms,以及vertex shader輸入引數中的boneindices和boneweights變數。其中,變數bonetransforms是乙個矩陣陣列,包含模型骨骼中每乙個bone的變換矩陣。vs_input結構體中的boneindices變數是乙個含有4個無符號整形數的陣列(uint4型別),陣列中的每乙個元素表示訪問bonetransforms陣列的索引。此外,boneweight變數主要用於vertex對應多個bones時,對所有影響vertex的bones進行加權平均。

在vertex shader中產生使用以下的**構建乙個矩陣skintransform:

float4x4 skintransform = (float4x4)0;

skintransform += bonetransforms[in.boneindices.x] * in.boneweights.x;

skintransform += bonetransforms[in.boneindices.y] * in.boneweights.y;

skintransform += bonetransforms[in.boneindices.z] * in.boneweights.z;

skintransform += bonetransforms[in.boneindices.w] * in.boneweights.w;

如果某個bone不會對vertex產生影響,那麼該bone的權重就為0,因此在計算矩陣skintransform時就會去掉該bone的transform值。在cpu端的應用程式中需要保證與vertex關聯的所有bones的權重和為1。

然後,把vertex position與矩陣skintransform相乘(同樣,如果vertex中含有su***ce normal,tangent,以及binormal也需要與該矩陣相乘)。通過矩陣乘法變換之後,bone的矩陣依然位於object的區域性座標系,因此再把position與worldveiwprojection矩陣相乘,使得在下乙個shader階段之前把vertex從animated local space變換到homogenous clip space。

pixel shader的**與原始的point light pixel shader完全一樣。實際上,可以把本書中所有的lighting techniques應用到skinned models中,只需要像vertex shader討論的那樣,增加一些與bone相關的shader變數和輸入。

第二十章 限制

城城內西部某個庭院井底,滕青山正在這。趙丹塵,你想抓我,再回去練上五十年吧。喊了一嗓子後,滕青山又立即鑽進泥土中,繼續前進。泥土中,滕青山現在也不急,不過,此刻滕青山體表的 子彈型光罩 已經沒有螺旋了。通過先天真元,改變身體形狀!看來不是我想象的那樣。滕青山很清楚,先天真元光罩如果單單維持,消耗先天...

第二十章 配置ftp服務

什麼是ftp 也許你對 ftp不陌生,但是你是否了解 ftp到底是個什麼玩意?ftp 是file transfer protocol 檔案傳輸協議 的英文簡稱,而中文簡稱為 文傳協議 用於 internet 上的控制檔案的雙向傳輸。同時,它也是乙個應用程式 使用者可以通過它把自己的 pc機與世界各地...

第二十章 非同步和檔案I O (二十)

乙個mvvm mandelbrot xamarin.forms 以這種方式為畫素著色。該程式還允許放大特定位置。這是mandelbrot集的乙個特徵,無論你放大多遠,影象仍然很有趣。不幸的是,基於doubleprecision浮點數的解析度,縮放存在實際限制。該程式使用mvvm原理進行架構,雖然在看...