carichiamo un oggetto 3d (mesh)

di Marco Leoncini, in work in progress,

precedentemente abbiamo "imparato" come strasformare una semplice WindowForm in una finestra su un mondo tridimensionale, poco in quella occasione abbiamo fatto, ci siamo limitati a inizializzare la perifercia, impostare qualche flag è settato il colore di sfondo, difficilmente realizzero un applicazione così :).
potremmo iniziare importando alcuni oggetti (mesh), ce li possiamo fare da noi (per chi ama l'artigianato) tramite i più famosi pacchetti 3D (uno per tutti maya) , o prenderli già fatti su un sito tipo turbosquid.
inizamo apportando alcune modifiche al metodo InitializeGraphics(), in grasseto le righe aggiunte

bool InitializeGraphics()

  {

  

  try

  {

  presentParams.Windowed = true;

  presentParams.SwapEffect = SwapEffect.Discard;

  <strong>presentParams.EnableAutoDepthStencil = true;

  presentParams.AutoDepthStencilFormat = DepthFormat.D16;

  </strong>device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, 
  presentParams);

  <strong>device.DeviceReset += new System.EventHandler(this.OnResetDevice);

  this.OnResetDevice(device, null);

  pause = false;</strong>

  }

  catch (DirectXException)

  {

  return false;

  }

  return true;

  }

oltre a impostare delle proprietà dall'oscuro significato, il tipo di gestione del buffer di profondità e il formato, registriamo un gestore di eventi per il reset della perifirica e lo richiamiamo per ipostare le risorse iniziali:

public void OnResetDevice(object sender, EventArgs e)

  {

  //array di materiali 

  ExtendedMaterial[] materials = null;

  //impostiamo la cartella corrente

  Directory.SetCurrentDirectory(Application.StartupPath);

  Device dev = (Device)sender;

  dev.RenderState.ZBufferEnable = true;

  //impostiamo la luce ambientale

  dev.RenderState.Ambient = System.Drawing.Color.White;

  //infine carichiamo il file 

  mesh = Mesh.FromFile("tiger.x", MeshFlags.SystemMemory, device, out 
  materials);

  //materials a questi punto contiene tutti i materiale contenuti nel file tiger.x

 //meshTextures è una variabile globale 

  if (meshTextures == null)

  {

  meshTextures = new Texture[materials.Length];

  meshMaterials = new Direct3D.Material[materials.Length];

  for( int i=0; i<materials.Length; i++ )

  {

  meshMaterials[i] = materials[i].Material3D;

  meshMaterials[i].Ambient = meshMaterials[i].Diffuse;

  

  meshTextures[i] = TextureLoader.FromFile(dev, materials[i].TextureFilename);

  }

  }

}
nel ciclo scorriamo la lista dei materiali e delle texture contenuti all'interno del file tiger.x le scorriamo e salviamo in due varibili globali, da quello che ho capito per eseguire il rendering dei materiali questi devono essere impostati come proprietà della periferica (Device) un pò strano per uno come me, abituato a pensare al materiale come proprietà dell'oggetto , ma dopo tutto è la seconda volta che leggo la documentazione dell SDK.
al prossimo post, il tempo è tiranno :)

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese