carichiamo un oggetto 3d (mesh)
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 :)











