作者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
1F:推 huadi73:谢谢~我再去试试看 那个59是XNA只支持到59 08/17 23:10
※ 编辑: wa007123456 来自: 125.228.238.218 (08/17 23:15)
2F:→ wa007123456:不会@@ 我之前也被这个相容性弄到发疯 08/17 23:15
3F:→ changyin:MaxBone 国外有超过59的~不过很多要改写 直接改数字会有 08/18 16:03
4F:→ changyin:误~也要import 其他dll档 08/18 16:05