BasicEffect和SkinnedEffect处理WorldViewProj不同?

我做了一个ModelBatch类,批处理和绘制操纵/ unanimated和皮肤/animation模型。 现在,BasicEffect被分配到绑定模型(XNA模型处理器),SkinnedEffect被分配到蒙皮模型(基于微软的Skinned Model Sample )。 设置着色器参数时发生问题。 在RenderBatch()方法中,我写道:

... foreach (Effect effect in mesh.Effects) { if (effect is BasicEffect) // if it's a rigged model. { effect.Parameters["WorldViewProj"].SetValue(modelInfo.world * viewProjection); } else // it's a skinned model. { effect.Parameters["WorldViewProj"].SetValue(viewProjection); effect.Parameters["Bones"].SetValue(modelInfo.boneTransforms); } } ... 

在运行游戏时,操纵模型的位置将locking在前几帧的摄像头位置。 之后,一切正常(操纵模型的位置是正确的)。 即使我只设置“WorldViewProj”参数(因此它不是因为“Bones”参数),在运行时,蒙皮模型在运行时没有位置偏移问题。

为了完美地工作,我不得不将模型部分改为:

  if (effect is BasicEffect) // if it's a rigged model. { BasicEffect basicEffect = effect as BasicEffect; basicEffect.World = modelInfo.world; basicEffect.View = this.camera.View; basicEffect.Projection = this.camera.Projection; } 

这样,被操纵的模型立刻被放置在正确的地方,但是我不喜欢它。 另外,真正的风格是,如果我没有为操纵模型设置任何观点或预测,像这样:

  if (effect is BasicEffect) // if it's a rigged model. { // do nothing. } 

我仍然会看到操纵模式locking在相机的位置。 任何人都知道为什么设置SkinnedEffect的“WorldViewProj”参数完美的工作,但不是为BasicEffect?

我希望有足够的信息,谢谢你的回答!

*编辑答案* *

我发现问题的根源。 内容处理器选项中更改了操纵模型的比例和旋转,因此该模型在运行时进行了修改。 我将这些选项更改回默认值,并在代码中设置旋转和缩放(Matrix.CreateScale和Matrix.CreateRotationX),模型位于正确的位置。 因此,我认为在运行时改变模型的世界信息造成了位移滞后。