1

小型ゲームエンジン用の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);

そして、ここに写真があります。(右->オリジナル) http://www.pic-upload.de/view-13949399/Unbenannt.png.html

4

1 に答える 1

2

頂点の「スキン変換」を計算する代わりに、提供された変換を使用して変換された頂点を計算し、重みを使用して組み合わせた位置を取得することをお勧めします。2 つの行列を補間することは、あまり良い考えではありません。

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;

しかし、このように変形したオブジェクトが表示された場合、通常はマトリックス パレットに「逆ボーン変換」を掛け忘れていることを意味します。逆ボーン変換は、「スキン パレード」ポーズ (つまり、オブジェクトがリギングされた元のポーズ) でボーンが持っていた変換マトリックスです。スキンされたオブジェクトの適切な位置を計算するには、マトリックス パレットに、結合した transform = を格納する必要がありますinverse(skinParadeTransform)*currentTransform。Current transform は現在のアニメーション階層でボーンが持つトランスフォームで、skinParadeTransform は「スキン パレード」モードでのオリジナルのボーン トランスフォームです。inverse行列の反転です(そうです、あなたはそれをしなければなりません)。

于 2012-04-27T18:48:17.433 に答える