2012-04-27 118 views
1

我爲我們的小遊戲引擎寫了一個fbx轉換器。我堅持使用動畫來渲染模型。每個時間戳的矩陣看起來都不錯,當我渲染骨頭時,它也看起來像原始動畫。我做了一些快照以顯示我的問題。我無法弄清楚什麼是錯的。也許有人能給我一個提示:)骷髏動畫與FBX

我用來測試的文件是FBX-SDK中的humanoid.fbx。

着色器應該確定:

VS_OUT output = (VS_OUT)0; 

float4x4 skinTransform = 0; 
skinTransform += MatrixPallette[input.BoneIndices.x] * input.Weights.x; 
skinTransform += MatrixPallette[input.BoneIndices.y] * input.Weights.y; 
skinTransform += MatrixPallette[input.BoneIndices.z] * input.Weights.z; 
skinTransform += MatrixPallette[input.BoneIndices.w] * input.Weights.w; 
//skinTransform = mul(BindShape, skinTransform); 

//Transform Position 
float4 worldPosition = mul(input.Position, skinTransform); 
float4 viewPosition = mul(worldPosition, matView); 
output.Position = mul(viewPosition, matProj); 

這裏是照片。 (right - > orginal) http://www.pic-upload.de/view-13949399/Unbenannt.png.html

回答

2

不是計算頂點的「skin transform」,而是建議使用提供的變換計算變換的頂點,然後使用權重來組合採樣。插入兩個矩陣確實不是一個好主意。

float4 worldPosition = 0; 
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.x]) * input.Weights.x; 
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.y]) * input.Weights.y; 
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.z]) * input.Weights.z; 
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.w]) * input.Weights.w; 

然而,當看到這樣的變形的目的,通常這意味着你忘記通過「逆變換骨」乘以矩陣調色板。逆向骨骼變換是轉換矩陣骨骼以「皮膚遊行」姿勢(即已經操縱了對象的原始姿勢)。要計算皮膚對象的正確位置,請在矩陣調色板中存儲組合變換= inverse(skinParadeTransform)*currentTransform。當前變換是當前動畫層次結構中的變換骨骼,skinParadeTransform是「皮膚遊行」模式中的原始骨骼變形。 inverse是矩陣求逆(是的,你必須這樣做)。

+0

正如你已經提到的,我需要反向骨骼變換。但我也發現FBX中的頂點處於對象空間中,您必須將它們轉換爲全局空間。在這篇文章中提到:[鏈接] http://area.autodesk.com/forum/autodesk-fbx/fbx-sdk/am-i-missing-something/ – 2012-04-28 10:51:28

+0

@MathiasHölzl:「對象」和「全球「空間是一個額外的矩陣乘法。在包含場景層次結構(* .x)的某些其他格式中,對象也存儲在「對象空間」中,並在文件內的其他地方爲其分配相應的變換。 – SigTerm 2012-04-28 13:14:34