Tipp 0400 Textur-Animation
Autor/Einsender:
Datum:
  Alexander Csadek
12.06.2004
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
Textur-Animationen sind in der angewendeten Technik identisch zur Darstellung von Sprite-Animationen in DirectDraw. Die Animation wird in Direct3D als normale Texture-Surface eingebunden. Beim Rendern wird für die Darstellung immer ein Bild aus der kompletten Animation ausgeschnitten und passend auf die Textur-Surface kopiert (blitten). Das Prinzip ist also dem der animierten Sprite-Darstellung gleichzusetzen.
Da es sich bei Animationen meistens um unregelmäßige Formen handelt, ist der ColorKey für die transparente Farbe zu verwenden. Es verhält sich hier nicht anders wie bei DirectDraw, wenn eine Surface mit einer transparenten Farbe erstellt werden soll. In Direct3D muss der Render-Pipeline nur  noch mitgeteilt werden, dass nun eine Textur mit einer transparenten Farbe gerendert wird.
Beispiel:
Call Device.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, True)
Wird die Animation im freien Raum platziert, sollte die Billboard-Technik verwendet werden.
DirectX7.DirectDrawCreate(objDDE.GetGuid(3))
Bei Animationen wie Feuer oder Explosionen lässt sich auch noch der Blend-Effekt einsetzen,  dann wird die Textur durchsichtiger.
Es folgt nun der für diesen Tipp relevante Code...
 
Public Sub Render3D()
  Dim helpMatrix(1) As D3DMATRIX
  Dim i As Integer

  'Hilfsmatrix initialisieren
  For i = 0 To 1
    DX7.IdentityMatrix helpMatrix(i)
  Next

  Device.Clear 1, ClearRec(), _
        D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, _
        DX7.CreateColorRGBA(0#, 0#, 0#, 1#), 1, 0
  Device.BeginScene

  'restliche Welt "normal" rendern
  Device.SetTransform D3DTRANSFORMSTATE_WORLD, helpMatrix(0)

  'Bilinearen Texturfilter verwenden damit die Textur nicht 
  'so grob gerastert wird
  Call Device.SetTextureStageState( _
        0, D3DTSS_MAGFILTER, D3DTFG_LINEAR)
  Call Device.SetTextureStageState( _
        0, D3DTSS_MINFILTER, D3DTFG_LINEAR)

  'alle Gruppen (Meshes) aus dem XFile rendern
  For i = 0 To GroupCount - 1
    Call Device.SetTexture(0, Groups(i).Texture)
    Call Device.DrawPrimitive( _
          D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, _
          Groups(i).RenderVertexList(0), _
          UBound(Groups(i).RenderVertexList) + 1, D3DDP_WAIT)
  Next
  Call Device.SetTexture(0, texFeuer)
  Call Device.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, True)

  'Objekt-Koordinaten in der WorldMatrix setzen
  For i = 0 To 1
    DX7.IdentityMatrix helpMatrix(i)
  Next

  'die World-Matrix der Planes transformieren
  Device.SetTransform D3DTRANSFORMSTATE_WORLD, FeuerWorldMatrix

  'HilfsMatrix in den Mittelpunkt der Plane schieben
  TranslateMatrix helpMatrix(1), FeuerMittelpunkt

  'Planes entsprechend drehen
  RotateYMatrix helpMatrix(0), FeuerRotateY * PI / 180

  'Hilfsmatrizen miteinander multiplizieren
  helpMatrix(1) = RetMatrixMult(helpMatrix(1), helpMatrix(0))

  'Änderungen der World-Matrix der Planes durchführen
  Device.MultiplyTransform D3DTRANSFORMSTATE_WORLD, helpMatrix(1)
  Call Device.DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, _
       vxFeuer(0), 6, D3DDP_WAIT)
  Call Device.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, False)
  Device.EndScene
End Sub

Private Sub Feuer()
  Dim SrcRect As RECT
  Dim intZeile As Integer

  intZeile = Int(FeuerAniStep) \ 8

  With SrcRect
    .Left = 32 * (Int(FeuerAniStep) - (intZeile * 8))
    .Right = .Left + 32
    .Top = 64 * intZeile: .Bottom = .Top + 64
  End With

  texFeuer.BltFast 0, 0, texFeuerAnimation, SrcRect, DDBLTFAST_WAIT
  FeuerAniStep = FeuerAniStep + 0.2

  If Int(FeuerAniStep) > FeuerAniMax Then FeuerAniStep = 0

End Sub
 
Weitere Links zum Thema
Textur-Blending (einfach)
Texturen mit transparenter Farbe (ColorKey)
Hinweis
Um dieses Beispiel ausführen zu können, wird die DirectX 7 for Visual Basic Type Library benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (81,3 kB) Downloads bisher: [ 571 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Dienstag, 30. August 2011