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 :)
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Vi aspetto al WPC 2011, il 17 novembre 2011 alle 08:00
- PRISM comunicazione tra moduli, il 31 marzo 2009 alle 07:54
- Prism Region e View, il 19 marzo 2009 alle 23:07
- Composite Application Guidance (PRISM) primi passi, il 6 marzo 2009 alle 23:35
- Ottimizziamo le dimesioni del modulo (PRISM), l'8 marzo 2009 alle 17:13
- Blend ostaggio di WPF, il 30 luglio 2008 alle 15:26