作者wa007123456 (大笨羊)
看板GameDesign
標題Re: [程式] XNA的3D模型動作
時間Tue Aug 17 22:57:05 2010
※ 引述《huadi73 (棣)》之銘言:
: 我想從 SkinningSample 去改
: 原本他裡面就只是播放動畫而已
: 我現在想要按A然後會有一個動作
: 按B會有另一個動作
: 該怎麼去改呢?
: 如果是FBX檔的話 我有 MotionBuild 可以做出兩個以上的 Take
: 如果是用.X檔 我也有去設定好了
: 可是不知道為什麼我用.X檔時 他都會出現錯誤
: (好像一個是跟權重有關 而另一個是Bone超過59個)
: 我有載過另外一個坦克車的範例
: 他不是動畫檔 而是一個一個物件在程式碼操控
: 這樣感覺好像爆破 希望最後不是這樣來做
: 感覺這部分完成了 遊戲也完成一半了
1.如果要有動作可以像下面寫的方式
你應該知道這個Sample的運行方式吧?
他已經簡化很多很多地方了
你只要直覺得去操控這些物件就可以
Model myModel;
AnimationPlayer player;
KeyboardState oldState; 之後用來確定按一下只播放一次
先宣告這三個成員
然後在initialize裡面:
oldState = Keyboard.GetState();
然後在LoadContent載入模型和一些資料:
myModel = Content.Load<Model>("test");
SkinningData skinningData = myModel.Tag as SkinningData;
player = new AnimationPlayer(skinningData);
之後再Update裡面如是寫:
SkinningData skinningData = myModel.Tag as SkinningData;
player.Update(gameTime.ElapsedGameTime,true, Matrix.Identity);
KeyboardState newState = Keyboard.GetState();
if (oldState.IsKeyUp(Keys.A) && newState.IsKeyDown(Keys.A))
{
AnimationClip clip = skinningData.AnimationClips["Action B"];
player.StartClip(clip);
}
oldState = newState;
注意上面的Action B 是你在建模軟體裡面使用的一段關鍵影格稱號
player會把這段clip播放出來
之後是Draw裡面的寫法:
Matrix[] bones = player.GetSkinTransforms();
foreach (ModelMesh mesh in myModel.Meshes)
{
foreach (Effect effect in mesh.Effects)
{
effect.Parameters["Bones"].SetValue(bones);
effect.Parameters["View"].SetValue(view);
effect.Parameters["Projection"].SetValue(projection);
}
mesh.Draw();
}
我想這個繪出模型的方式你應該很熟了@@
比較特別的是Bones得到是用player的GetSkinTransForms();
另外如果你有學過HLSL你應該知道下面的Effect為什麼要這樣寫@@
再來是骨架的問題
SkinnedModelProcesser開頭有個設定
const int MaxBones = 59;
我不知道為什麼要這樣寫 我不確定改了之後會不會有問題
還有就是 3D物件含有骨架將會變得很複雜
所以你可能要設定好你的建模軟體Export的配置
確定相容於XNA當中
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.228.238.218
推 huadi73:謝謝~我再去試試看 那個59是XNA只支持到59 08/17 23:10
※ 編輯: wa007123456 來自: 125.228.238.218 (08/17 23:15)
→ wa007123456:不會@@ 我之前也被這個相容性弄到發瘋 08/17 23:15
→ changyin:MaxBone 國外有超過59的~不過很多要改寫 直接改數字會有 08/18 16:03
→ changyin:誤~也要import 其他dll檔 08/18 16:05