Tipp 0362 Billboarding
Autor/Einsender:
Datum:
  Alexander Csadek
21.09.2003
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
Die Billboarding-Technik wird gern in 3D-Spielen benutzt um Ressourcen zu sparen und die Performance zu schonen. Wenn ein Objekt nicht unbedingt als 3D-Objekt (Mesh) dargestellt werden muss, dann genügt es auch, wenn aus zwei Polygonen (Dreiecke) ein Rechteck erstellt und auf diesem eine Textur gerendert wird.
Damit der Betrachter aber nicht hinter das Rechteck schauen kann, muss es immer so gedreht werden, dass die Textur dem Betrachter zugewandt ist. So entsteht für den Betrachter der Eindruck es wäre ein 3D-Objekt.
Man bildet also aus zwei Polygonen ein senkrecht stehendes Rechteck und auf dieses wird die entsprechende Textur gelegt. Jedes Mal, wenn der Betrachter die Position verändert, wird der Winkel zum Rechteck ermittelt. Dann kann das Rechteck entsprechend auf der Y-Achse gedreht werden.
Es folgt nun der für diesen Tipp relevante Code...
 
 'World-Koordinaten der Planes verändern
For i = 0 To UBound(PLANES())
   'Winkel zur Spielerposition pro Plane berechnen
  PLANES(i).RotateY = GetAngle(PLANES(i).WorldPos.x, _
        PLANES(i).WorldPos.z, PLAYER.x, PLAYER.z)
Next

Public Sub Render3D()
  Dim helpMatrix(1) As D3DMATRIX
  Dim i As Integer, j 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)
  Call Device.SetTexture(0, texTextur(0))

   'TexturKoordinaten ausserhalb der Textur werden nicht gespiegelt
  Call Device.SetTextureStageState( _
       0, D3DTSS_ADDRESS, D3DTADDRESS_WRAP)

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

  Call Device.DrawPrimitive(D3DPT_TRIANGLELIST, _
       D3DFVF_LVERTEX, vxSkyBox(0), 36, D3DDP_WAIT)

  Device.SetRenderState D3DRENDERSTATE_COLORKEYENABLE, True

   'Textur für Planes setzen
  Call Device.SetTexture(0, texTextur(1))

  For j = 0 To UBound(PLANES())
     '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, _
          PLANES(j).WorldMatrix

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

     'Planes entsprechend drehen
    RotateYMatrix helpMatrix(0), PLANES(j).RotateY * 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)

     'Plane rendern
    Call Device.DrawPrimitive(D3DPT_TRIANGLELIST, _
         D3DFVF_LVERTEX, vxPlane(0), 6, D3DDP_WAIT)
  Next j

  Device.SetRenderState D3DRENDERSTATE_COLORKEYENABLE, False
  Device.EndScene

End Sub
 
Weitere Links zum Thema
Himmel (SkyBox)
Nebel (Fog)
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  (103 kB) Downloads bisher: [ 971 ]

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: Samstag, 17. September 2011