Este artigo foi traduzido por máquina. Para visualizar o arquivo em inglês, marque a caixa de seleção Inglês. Você também pode exibir o texto Em inglês em uma janela pop-up, movendo o ponteiro do mouse sobre o texto.
Tradução
Inglês
Esta documentação foi arquivada e não está sendo atualizada.

Como: Criar uma malha

Você pode criar uma malha de quatro maneiras básicas:

  • Carregando os dados de malha de um arquivo.

  • Clonagem ou otimização de uma malha existente.

  • Usando a função de criação de uma forma e especificando o dimensionar e o número de triângulos que será usado para criar a forma.

  • Usando o Mesh construtor.

ObservaçãoObservação:

Aplicativos móveis Direct3D Gerenciados requerem o software Windows Mobile versão 5.0 para Pocket PCs e Smartphones . Consulte Recursos externos para o .NET Compact Framework Para obter informações sobre o software Windows Mobile e SDKs.

Para criar uma malha a partir de um arquivo

  • Carregar os dados de malha de um arquivo e, em seguida, preencher uma malha com os dados. O .NET Compact Framework não oferece suporte direto para carregar uma malha de um arquivo, mas em Direct3D Mobile Meshes Sample define-se uma classe para carregar uma malha.

Para criar uma malha a partir de uma malha existente

  • Use o Optimize método para criar uma nova malha com dados otimizados.

    - ou -

    Use o OptimizeInPlace método para otimizar a malha corrente.

    O uso principal para a clonagem é converter a malha de ponto flutuante para o formato de ponto fixo. O uso principal para a otimização é criar uma malha é mais rápido desenhar. Otimização de malha reorganiza os triângulos na malha de modo que chamadas de desenho em malha desempenho mais rápido. Otimização de malha também gera uma tabela de atributo, que é usada para identificar as áreas da malha que precisam ser desenhado com diferentes texturas, processar os estados e materiais.

Para criar uma malha usando uma função de criação

  • Use um dos seguintes métodos estático do Mesh classe para criar uma malha com posição e normais especificadas em ponto flutuante:

Para criar uma malha usando o construtor de malha

  1. telefonar the Mesh construtor com os argumentos desejados.

  2. Defina o buffer de índices, buffer de vértices, e dados da tabela de atributos. Os dados nesse caso freqüentemente são gerados em time de execução. O exemplo a seguir mostra o procedimento para criar uma malha dessa maneira.

O exemplo de código a seguir cria uma malha heightfield no plano x-y com a coordenada de z que representa a dimensão vertical. A malha criada é executado a partir de (0, 0) para (1, 1) e tem uma altura especificada pelo GetHeight método. Essa malha é texturizada com uma textura única sobre a malha inteira. The tessellation parâmetro, definido pelo exemplo, é usado para controlar como vários pontos ao longo da borda da malha são usados.

class Form1
{
    Form1()
    {
        // In this example, initialize the Mesh object
        // with 4 tessellations
        this.InitializeMesh(4);
    }

    private void InitializeMesh(int tessellation)
    {
        Mesh mesh1 = CreateHeightfieldMesh(tessellation);

    }
    private float GetHeight(float x, float y)
    {
        return 0;
        //TODO: fill in this function
    }

    private Mesh CreateHeightfieldMesh(int tessellation)
    {
        Mesh mesh;

        Device device = null; // TODO: initialize this

        short[] arrayIndices = new short[(tessellation - 1) * (tessellation - 1) * 6];
        CustomVertex.PositionTextured[] arrayVertices =
                new CustomVertex.PositionTextured[tessellation * tessellation];
        AttributeRange attributeRange = new AttributeRange();

        // Create mesh with desired vertex format and desired size
        mesh = new Mesh(arrayIndices.Length / 3, arrayVertices.Length, MeshFlags.SystemMemory,
        CustomVertex.PositionTextured.Format, device);

        // For each point in the height field calculate the x, y, z and
        // texture coordinates.
        for (int y = 0; y < tessellation; y++)
        {
            for (int x = 0; x < tessellation; x++)
            {
                int arrayIndex = y * tessellation + x;
                float xCoordinate = (float)x / (float)(tessellation - 1);
                float yCoordinate = (float)y / (float)(tessellation - 1);
                CustomVertex.PositionTextured vertex = new CustomVertex.PositionTextured
                        (xCoordinate, yCoordinate, GetHeight(xCoordinate, yCoordinate), xCoordinate, yCoordinate);
                arrayVertices[arrayIndex] = vertex;
            }
        }

        // Calculate the index buffer.
        for (int y = 0; y < (tessellation - 1); y++)
        {
            for (int x = 0; x < (tessellation - 1); x++)
            {
                int arrayIndex = (y * (tessellation - 1) + x) * 6;
                int vertexIndex = y * tessellation + x;

                arrayIndices[arrayIndex] = (short)vertexIndex;
                arrayIndices[arrayIndex + 1] = (short)(vertexIndex + 1);
                arrayIndices[arrayIndex + 2] = (short)(vertexIndex + tessellation);
                arrayIndices[arrayIndex + 3] = (short)(vertexIndex + tessellation);
                arrayIndices[arrayIndex + 4] = (short)(vertexIndex + 1);
                arrayIndices[arrayIndex + 5] = (short)(vertexIndex + tessellation + 1);
            }
        }

        // There is only one attribute value for this mesh.
        // By specifying an attribute range the DrawSubset function
        // does not have to scan the entire mesh for all faces that are
        // are marked with a particular attribute id.
        attributeRange.AttributeId = 0;
        attributeRange.FaceStart = 0;
        attributeRange.FaceCount = arrayIndices.Length / 3;
        attributeRange.VertexStart = 0;
        attributeRange.VertexCount = arrayVertices.Length;

        mesh.VertexBuffer.SetData(arrayVertices, 0, LockFlags.None);
        mesh.IndexBuffer.SetData(arrayIndices, 0, LockFlags.None);
        mesh.SetAttributeTable(new AttributeRange[] { attributeRange });

        return (mesh);

    }
    public static void Main()
    {
        try
        {
            Form Form1 = new Form();
            Application.Run(Form1);
        }
        catch (NotSupportedException)
        {
            MessageBox.Show("Your device does not have the needed 3d " +
                "support to run this sample");
        }
        catch (DriverUnsupportedException)
        {
            MessageBox.Show("Your device does not have the needed 3d " +
                "driver support to run this sample");
        }
        catch (Exception e)
        {
            MessageBox.Show("The sample has run into an error and " +
                "needs to close: " + e.Message);
        }
    }
}


Mostrar: