Partilhar via


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ção:

Aplicativos móveis de Direct3D gerenciado requerem 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.

Exemplo

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

    Private Sub New()
        MyBase.New()
        ' In this example, initialize the mesh with
        ' 4 tessellations
        Me.InitializeMesh(4)
    End Sub

    Private Sub InitializeMesh(ByVal tessellation As Integer)
        Dim mesh1 As Mesh = CreateHeightfieldMesh(tessellation)
    End Sub


    Private Function GetHeight(ByVal x As Single, ByVal y As Single) As Single
        Return 0

    End Function

    Private Function CreateHeightfieldMesh(ByVal tessellation As Integer) As Mesh
        Dim mesh As Mesh

        Dim device As Device = Nothing
        Dim arrayIndices((tessellation - 1) * (tessellation - 1) * 6) As Short
        Dim arrayVertices(tessellation * tessellation) As CustomVertex.PositionTextured
        Dim attributeRange As 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.
        Dim y As Integer
        For y = 0 To tessellation
            Dim x As Integer
            For x = 0 To tessellation
                Dim arrayIndex As Integer = y * tessellation + x
                Dim xCoordinate As Single = System.Convert.ToSingle(x) / System.Convert.ToSingle(tessellation - 1)
                Dim yCoordinate As Single = System.Convert.ToSingle(y) / System.Convert.ToSingle(tessellation - 1)
                Dim vertex As New CustomVertex.PositionTextured(xCoordinate, yCoordinate, GetHeight(xCoordinate, yCoordinate), xCoordinate, yCoordinate)
                arrayVertices(arrayIndex) = vertex
            Next x
        Next y

        ' Calculate the index buffer.
        Dim z As Integer
        For z = 0 To (tessellation - 1)
            Dim x As Integer
            For x = 0 To (tessellation - 1)
                Dim arrayIndex As Integer = (z * (tessellation - 1) + x) * 6
                Dim vertexIndex As Integer = z * tessellation + x

                arrayIndices(arrayIndex) = Fix(vertexIndex)
                arrayIndices((arrayIndex + 1)) = Fix(vertexIndex + 1)
                arrayIndices((arrayIndex + 2)) = Fix(vertexIndex + tessellation)
                arrayIndices((arrayIndex + 3)) = Fix(vertexIndex + tessellation)
                arrayIndices((arrayIndex + 4)) = Fix(vertexIndex + 1)
                arrayIndices((arrayIndex + 5)) = Fix(vertexIndex + tessellation + 1)
            Next x
        Next z

        ' 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

    End Function

    Public Shared Sub Main()
        Try
            Dim Form1 As New Form()
            Application.Run(Form1)
        Catch e As NotSupportedException

            MsgBox("Your device does not have the " + _
                "needed 3d support to run this sample")

        Catch e As DriverUnsupportedException

            MsgBox("Your device does not have the " + _
                "needed 3d driver support to run this sample")

        Catch e As Exception

            MsgBox("The sample has run into an error and " + _
                "needs to close: " + e.Message)
        End Try

    End Sub
End Class
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);
        }
    }
}

Compilando o código

Este exemplo requer referências aos seguintes namespaces:

Consulte também

Conceitos

Tópicos "como" do .NET compact estrutura

Outros recursos

Programação Direct3D móvel no .NET Compact estrutura