JavascriptProva

domenica 17 novembre 2013

Costruzione di un quadrato con due triangoli.

Bene.
Ora cerchiamo di disegnare un quadrato fatto di due triangoli.

Pagina di riferimento per il costruttore di VertexBuffer

Ecco il codice:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        NumeroVertici = 4
        NumeroIndici = 4

        InitializeGraphics()
        VBuffer = New VertexBuffer(GetType(CustomVertex.PositionColored), NumeroVertici, dispositivo, 0, CustomVertex.PositionColored.Format, Pool.Default)
        Dim vertici As CustomVertex.PositionColored() = New CustomVertex.PositionColored(NumeroVertici) {}
        vertici(0).Position = New Vector3(0, 0, 0)
        vertici(0).Color = Color.Blue.ToArgb
        vertici(1).Position = New Vector3(5, 0, 0)
        vertici(1).Color = Color.Red.ToArgb
        vertici(2).Position = New Vector3(5, 5, 0)
        vertici(2).Color = Color.Yellow.ToArgb
        vertici(3).Position = New Vector3(0, 5, 0)
        vertici(3).Color = Color.Green.ToArgb
       

        VBuffer.SetData(vertici, 0, LockFlags.None)




        ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default)
        Dim indici As Integer() = New Integer(NumeroIndici) {}
        indici(0) = 1
        indici(1) = 2
        indici(2) = 0
        indici(3) = 3
        'indici(4) = 2
        'indici(5) = 0
        ib.SetData(indici, 0, LockFlags.None)

...
Prima si costruisce il VertexBuffer:
        VBuffer = New VertexBuffer(GetType(CustomVertex.PositionColored), NumeroVertici, dispositivo, 0, CustomVertex.PositionColored.Format, Pool.Default)
        Dim vertici As CustomVertex.PositionColored() = New CustomVertex.PositionColored(NumeroVertici) {}
        vertici(0).Position = New Vector3(0, 0, 0)
        vertici(0).Color = Color.Blue.ToArgb
        vertici(1).Position = New Vector3(5, 0, 0)
        vertici(1).Color = Color.Red.ToArgb
        vertici(2).Position = New Vector3(5, 5, 0)
        vertici(2).Color = Color.Yellow.ToArgb
        vertici(3).Position = New Vector3(0, 5, 0)
        vertici(3).Color = Color.Green.ToArgb
       

        VBuffer.SetData(vertici, 0, LockFlags.None)
Quindi l'IndexBuffer:
        ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default)
        Dim indici As Integer() = New Integer(NumeroIndici) {}
        indici(0) = 1
        indici(1) = 2
        indici(2) = 0
        indici(3) = 3
        ib.SetData(indici, 0, LockFlags.None)
Ecco il codice che "stampa":
        dispositivo.RenderState.Lighting = False
        dispositivo.RenderState.CullMode = Cull.None
        dispositivo.RenderState.FillMode = FillMode.WireFrame
        dispositivo.Clear(ClearFlags.Target, Color.Black, 1, 0)
        dispositivo.BeginScene()
        dispositivo.VertexFormat = CustomVertex.PositionColored.Format
        dispositivo.SetStreamSource(0, VBuffer, 0)
        dispositivo.Indices = ib

        dispositivo.DrawIndexedPrimitives(PrimitiveType.TriangleStrip, 0, 0, 4, 0, 2)
        dispositivo.EndScene()
        dispositivo.Present()


Che cosa ottengo con tutto questo?



Ho problemi con l'ordine dei vertici.
Cerchiamo innanzitutto di stabilire il punto di vista mediante la View Matrix:
        dispositivo.Transform.View = Matrix.LookAtLH(New Vector3(0, 0, 15), New Vector3(0, 0, 0), New Vector3(0, 1, 0))
Ecco: creo due triangoli in una TriangleStrip.
Creo il VertexBuffer:
VBuffer = New VertexBuffer(GetType(CustomVertex.PositionColored), NumeroVertici, dispositivo, 0, CustomVertex.PositionColored.Format, Pool.Default)
        Dim vertici As CustomVertex.PositionColored() = New CustomVertex.PositionColored(NumeroVertici) {}
        vertici(0).Position = New Vector3(0, 0, 0)
        vertici(0).Color = Color.Blue.ToArgb
        vertici(1).Position = New Vector3(5, 0, 0)
        vertici(1).Color = Color.Yellow.ToArgb
        vertici(2).Position = New Vector3(5, 5, 0)
        vertici(2).Color = Color.Red.ToArgb
        vertici(3).Position = New Vector3(0, 5, 0)
        vertici(3).Color = Color.Green.ToArgb


Creo l'IndexBuffer:
        ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default)
        Dim indici As Integer() = New Integer(NumeroIndici) {}
        indici(0) = 0
        indici(1) = 1
        indici(2) = 2
        indici(3) = 3
        ib.SetData(indici, 0, LockFlags.None)
Ecco il risultato:



Qui il triangolo è stato tracciato nell'ordine dei vertici rosso, giallo e blu. L'ultimo ad essere stato tracciato è il cateto verticale, e il nuovo triangolo è stato tracciato avendo in comune con esso questo cateto.
Adesso tracciamo per ultimo il cateto orizzontale:
ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default)
        Dim indici As Integer() = New Integer(NumeroIndici) {}
        indici(0) = 2
        indici(1) = 0
        indici(2) = 1
        indici(3) = 3




E ora tracciamo per ultima l'ipotenusa:
        ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default)
        Dim indici As Integer() = New Integer(NumeroIndici) {}
        indici(0) = 1
        indici(1) = 2
        indici(2) = 0
        indici(3) = 3


Nessun commento:

Posta un commento