} // Renderizar() // ---] private void desenharObjeto(Mesh obj, Propriedades3D props) { // Ajusta rotação da caixa Matrix obj_rot = Matrix.RotationX(props.rotation.X) * Matrix.RotationY(props.rotation.Y + angulo) * Matrix.RotationZ(props.rotation.Z); // Ajusta posição da caixa Matrix obj_pos = Matrix.Translation(props.position); // Tranfere posição e rotação para o mundo device.Transform.World = obj_rot * obj_pos; // Prepara e aplica material na caixa Material obj_mtl = new Material(); obj_mtl.Diffuse = props.color; obj_mtl.Ambient = props.color; // Informa ao dispositivo o material a ser utilizado // na renderização device.Material = obj_mtl; // Renderiza o mesh obj.DrawSubset(0); } // desenharObjeto()
} // AtualizarCamera() // [--- public void Renderizar() { // Limpa os dispositivos e os buffers de apoio device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1.0f, 0); device.BeginScene(); // (...) Todo o código de desenhar vai aqui // Atualiza a luz e camera AtualizarCamera(); AtualizarLuz(); // Deleta o objeto3d se ele existir neste ponto porque // ele será criado mais adiante no código. if (objeto3D != null) { objeto3D.Dispose(); } // Cria uma esfera lowpoly que será renderizada em wireframe device.RenderState.FillMode = FillMode.WireFrame; objeto3D = Mesh.Sphere(device, 2.0f, 4, 4); // Desenha essa esfera no canto superior-esquerdo posicao = new Vector3(2.5f, 2.5f, -7.0f); rotacao = new Vector3(-10, 10, 0); g_props = new Propriedades3D(posicao, rotacao); g_props.color = Color.SaddleBrown; desenharObjeto(objeto3D, g_props); // Deleta esfera anterior e cria uma outra para ser // retalhada objeto3D.Dispose(); objeto3D = Mesh.Sphere(device, 2.0f, 4, 4); // Gera a esfera retalhada gerarModeloRetalhado(ref objeto3D, nTesselacao); // Posiciona-a no canto inferior-esquerdo g_props.position = new Vector3(2.5f, -2.0f, -7.0f); desenharObjeto(objeto3D, g_props); // Vamos gerar agora as versões sólidas das esferas. // Deleta a esfera anterior e estabelece o modo sólido // de renderização objeto3D.Dispose(); device.RenderState.FillMode = FillMode.Solid; // Gera a esfera retalhada e coloca-a no canto inferior-direito objeto3D = Mesh.Sphere(device, 2.0f, 4, 4); gerarModeloRetalhado(ref objeto3D, nTesselacao); g_props.position = new Vector3(-2.5f, -2.0f, -7.0f); desenharObjeto(objeto3D, g_props); String info = String.Format("nVértices: {0}", objeto3D.NumberVertices); MostrarMensagem(420, 10, info); // Deleta a esfera anterior e renderiza a versão lowpoly // no canto superior-direito objeto3D.Dispose(); objeto3D = Mesh.Sphere(device, 2.0f, 4, 4); g_props.position = new Vector3(-2.5f, 2.5f, -7.0f); desenharObjeto(objeto3D, g_props); // Mostra o nível de tesselação e dica de teclado info = String.Format("nTesselação: {0}", nTesselacao.ToString()); MostrarMensagem(20, 10, info); info = " + Aumentar nível de detalhe - Reduzir nível de detalhe"; MostrarMensagem(20, this.Height - 60, info); device.EndScene(); // Apresenta a cena renderizada na tela device.Present(); // Libera a janela para processar outros eventos Application.DoEvents(); } // Renderizar()