Balder 3D

Essa semana lá no C.E.S.A.R, nós precisamos iniciar a migração de uma aplicação em WPF para Silverlight. Essa aplicação utiliza a API 3D do WPF, por isso tivemos que buscar uma alternativa para termos os mesmos recursos em Silverlight. Foi então que encontramos o Balder.

O Balder é um projeto opensource hospedado no Codeplex e que possui licença Ms-PL, salvo o caso de se querer comercializar uma API 3D. Ele foi desenvolvido para rodar no Silverlight, WPF e Windows Phone 7. Isso está nos dando uma grande flexibilidade.

Os principais elementos para criar uma cena com Balder são:

  • Game: clr-namespace:Balder.Execution;assembly=Balder
  • Camera: clr-namespace:Balder.View;assembly=Balder
  • Light: clr-namespace:Balder.Lighting;assembly=Balder
  • Geometria: clr-namespace:Balder.Objects.Geometries;assembly=Balder
  • Material: clr-namespace:Balder.Materials;assembly=Balder

Abaixo segue um exemplo com adicionar os namespaces e utilizar esses elementos básicos:

<UserControl x:Class="BalderLab.SimpleExample"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:execution="clr-namespace:Balder.Execution;assembly=Balder"
             xmlns:geometries="clr-namespace:Balder.Objects.Geometries;assembly=Balder"
             xmlns:view="clr-namespace:Balder.View;assembly=Balder"
             xmlns:lighting="clr-namespace:Balder.Lighting;assembly=Balder"
             xmlns:material="clr-namespace:Balder.Materials;assembly=Balder">
    <Grid x:Name="LayoutRoot" Background="White">
        <execution:Game Width="640" Height="480">
            <execution:Game.Camera>
                <view:Camera Position="0,5,-10" />
            </execution:Game.Camera>
            <lighting:OmniLight Position="0,10,-10" Diffuse="White" />
            <geometries:Box Dimension="4,4,4" Position="0,0,0">
                <geometries:Box.Material>
                    <material:Material Ambient="White" Diffuse="Red" Specular="LightGreen" Shade="Gouraud" />
                </geometries:Box.Material>
            </geometries:Box>
        </execution:Game>
    </Grid>
</UserControl>

Sempre que adicionamos algum elemento 3D na tela, nossa maior vontade é de poder interagir com ele. Para rotacionar um elemento na tela, o Balder oferece um propriedade chamada InteractionEnabled. Caso você queira compor objetos separados para que eles se comportem como um, pode usar um Container conforme ilustrado abaixo.

<execution:Game Width="640" Height="480">
    <execution:Game.Camera>
        <view:Camera Position="0,5,-10" />
    </execution:Game.Camera>
    <lighting:OmniLight Position="0,10,-10" Diffuse="White" />
    <balder:Container InteractionEnabled="True">
        <geometries:ChamferBox Dimension="2,2,2">
            <geometries:Box.Material>
                <material:Material Ambient="White" Diffuse="Green" Specular="LightGreen" Shade="Gouraud" />
            </geometries:Box.Material>
        </geometries:ChamferBox>
        <geometries:Box Dimension="2,2,2" Position="4,0,0">
            <geometries:Box.Material>
                <material:Material Ambient="White" Diffuse="Red" Specular="LightGreen" Shade="Gouraud" />
            </geometries:Box.Material>
        </geometries:Box>
    </balder:Container>
</execution:Game>

O Balder não oferece nativamente um recurso de zoom, no entando ele pode ser facilmente implementado programaticamente alterando as propriedades da câmera. Esse exemplo pode ser encontrado no próprio site de samples do projeto.

No caso de querer trabalhar com modelos 3D mais complexos, a forma mais fácil é carregar os arquivos no formato .ASE (ASCII Scene Exporter). Até onde sei, esse formato pode ser exportado a partir do 3ds Max e existe um plugin para o Blender 3D.

<Geometries:Mesh AssetName="/MyGameApp;component/Assets/teapot.ase"/>

Para ter uma introdução rápida sobre o Balder em vídeo, veja esse link. Minha advertência sobre esse vídeo é que os valores default da versão atual são diferentes da versão utilizada pelo vídeo.

Anúncios
%d blogueiros gostam disto: