2009-06-09 4 views
4

Я хочу нарисовать модель в XNA. Я продвинулся вперед и выпустил его в Blender и экспортировал его в формат файла fbx, чтобы контент-конвейер мог работать с ним. Какой код следует добавить к методу Draw() моей WindowsGame()? Я пробовал следующее, но все, что я получаю, это серый экран (серый, не синий, который является четким цветом, заметьте). Модель импортируется с контентом. Загружайте, и это не вызывает ошибок, и я назвал ее «Чаша», ,Как рисовать модель в XNA с помощью BasicEffect

Может ли кто-нибудь сказать мне, почему это здесь не сработает?

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

Просто примечание: не ставить «новый BasicEffect ... "в Draw(), это замедлит рендеринг. Предположим, что это глобальная переменная, и Initialize() - d. –

ответ

5

Очень распространенная проблема, когда вы сначала пытаетесь что-то сделать, так это то, что камера не смотрит на то, что вы думаете, на что она смотрит. Другая возможная проблема заключается в том, что модель не находится в таком масштабе, который вы ожидаете. Например, если камера на 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(); 
    } 
} 
+0

Есть ли автоматический эффект в любой модели, которую я сделал в Blender - экспортируется как FBX - импортируется в XNA? Похоже, что этот код будет искать Эффект, совместимый с BasicEffect, я не могу думать, где он найдет его, хотя из-за того, что я не добавил :((Он автоматически добавлен конвейером?) – wsd

+0

Да , при импорте через конвейер контента он автоматически создает базовый эффект. Фактически, если вы хотите использовать настраиваемый эффект, вы можете настроить встроенный эффект в настраиваемом конвейере: http://blogs.msdn.com/ shawnhar/архив/2006/12/07/рендеринг-а-модель-с-настраиваемого-effect.aspx –