Просто чтобы немного расширить ответ @Steve H, вот несколько возможностей:
В вашем коде XNA вы не применяете преобразования кости к вашей модели.Как и большинство инструментов моделирования, Макс стремится модифицировать матрицу преобразования мира для модели, а не для самих вершин.Преобразование вершин имеет тенденцию вводить небольшие ошибки с плавающей запятой, т. Е. Вершина с поворотом Пи / 2 на 1,0,0 радиуса вокруг оси z может прийти 0,099999,0 вместо 0,1,0 - это просто природаматематика с плавающей точкой, а также причина того, что в вашей игре вы всегда выполняете преобразование из исходной геометрии.
Вот ссылка на пример преобразования кости в MSDN (из v3.1, но существует множество примеров v4): обратите внимание на присвоение myModel.CopyAbsoluteBoneTransformsTo(transforms)
и effect.World
.Этот пример для BasicEffect
, но даже с вашим собственным эффектом вам нужно будет извлечь костные трансформации и применить их.Это можно сделать при загрузке модели, если, например, вы используете собственный шейдер.(Обратите внимание, что преобразования костей необходимы, даже если вы не определили кости в своей модели в Max.)
(Заимствовано из связанной статьи MSDN)
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// Copy any parent transforms.
Matrix[] transforms = new Matrix[myModel.Bones.Count];
myModel.CopyAbsoluteBoneTransformsTo(transforms);
// Draw the model. A model can have multiple meshes, so loop.
foreach (ModelMesh mesh in myModel.Meshes)
{
// This is where the mesh orientation is set, as well
// as our camera and projection.
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.World = transforms[mesh.ParentBone.Index] *
Matrix.CreateRotationY(modelRotation)
* Matrix.CreateTranslation(modelPosition);
effect.View = Matrix.CreateLookAt(cameraPosition,
Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45.0f), aspectRatio,
1.0f, 10000.0f);
}
// Draw the mesh, using the effects set above.
mesh.Draw();
}
base.Draw(gameTime);
}
Другойвероятность того, что в Максе стержень объекта (центр, на котором основаны все преобразования поворота / масштабирования / преобразования) не центрируется в сетке. Это легко изменить .