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原理進行架構,雖然在看...