Как нарисовать модель в XNA с BasicEffect
Я хочу нарисовать модель в XNA. Я собираюсь сделать это в Blender и экспортировать его в формат файла fbx, чтобы Content Pipeline мог с ним работать. Какой код я должен добавить в метод Draw() моего WindowsGame()? Я попробовал следующее, но все, что я получаю, это серый экран (серый, а не синий, который является чистым цветом, обратите внимание) Модель импортируется с content.Load, и это не выдает ошибку, и я назвал его "Чаша",
Кто-нибудь может сказать, почему это здесь не сработает?
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
BasicEffect b = new BasicEffect (graphics.GraphicsDevice, new EffectPool ( ));
foreach (ModelMesh m in Bowl.Meshes)
{
b.View = Cam.mView;
b.Projection = Cam.mProj;
b.World = mWorld;
b.EnableDefaultLighting ( );
b.Begin ( );
m.Draw ( );
b.End ( );
}
base.Draw(gameTime);
}
Я только что заметил, что это эквивалентно убийству с точки зрения эффективности, но я пробовал так много вещей, мне просто нужно, чтобы он работал, прежде чем я оптимизирую его.
1 ответ
Очень распространенная проблема при первой попытке визуализации заключается в том, что камера не смотрит на то, на что, как вы думаете, она смотрит. Другая возможная проблема заключается в том, что модель не соответствует масштабу, который вы ожидаете. Так, например, если камера находится на 5 единиц назад по оси z, но модель имеет ширину 10 единиц, ваша камера находится внутри модели.
Что касается вопроса рендеринга, у Microsoft есть довольно хорошие документы по этому вопросу: http://msdn.microsoft.com/en-us/library/bb203933.aspx
Вы можете использовать этот фрагмент в качестве помощника:
private void DrawModel(Model m)
{
Matrix[] transforms = new Matrix[m.Bones.Count];
float aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;
m.CopyAbsoluteBoneTransformsTo(transforms);
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
aspectRatio, 1.0f, 10000.0f);
Matrix view = Matrix.CreateLookAt(new Vector3(0.0f, 50.0f, Zoom), Vector3.Zero, Vector3.Up);
foreach (ModelMesh mesh in m.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.View = view;
effect.Projection = projection;
effect.World = gameWorldRotation * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(Position);
}
mesh.Draw();
}
}