Tipp 0356 Objekte unabhängig im 3D-Raum bewegen
Autor/Einsender:
Datum:
  Alexander Csadek
28.08.2003
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
In einer virtuellen 3D-Welt steht nicht alles still und immer an der gleichen Position. Meist sind es Türen, Aufzüge oder andere Spielfiguren, die sich in einem 3D-Raum bewegen. Die Frage ist nun, wie kann ein 3D-Objekt im 3D-Raum bewegt werden, wenn die Vertexe des Objektes an eine fixe Koordinate gebunden sind.
Die Antwort liegt in der Welt-Matrix (World-Matrix), die uns Direct3D anbietet. Mit ihr können Objekte unabhängig voneinander verschoben, gedreht und skaliert werden. Hierbei ist zu beachten, dass der restliche 3D-Raum nicht verändert wird, so müssen nicht bei jeder Veränderung alle Vertexe eines Objektes neu positioniert werden.
Damit der Tipp nicht unnötig kompliziert wird, habe ich nur Würfel als 3D-Objekte verwendet, und er baut auf die Tipps Bewegen im 3D-Raum und Himmel (SkyBox) auf.
Es folgt nun der für diesen Tipp relevante Code...
 
'World-Koordinaten der Boxen verändern
For i = 0 To UBound(BOXEN())
  BOXEN(i).Rotate = BOXEN(i).Rotate + BOXEN(i).RotateStep
  If BOXEN(i).Rotate > 360 Then BOXEN(i).Rotate = 0
  Select Case BOXEN(i).Direction
    Case 0:
      BOXEN(i).WorldPos.y = BOXEN(i).WorldPos.y + 1
      If BOXEN(i).WorldPos.y > 300 Then BOXEN(i).Direction = 1
    Case 1:
      BOXEN(i).WorldPos.y = BOXEN(i).WorldPos.y - 1
      If BOXEN(i).WorldPos.y < -300 Then BOXEN(i).Direction = 0
  End Select
  DX7.IdentityMatrix BOXEN(i).WorldMatrix
  TranslateMatrix BOXEN(i).WorldMatrix, BOXEN(i).WorldPos
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)

  For j = 0 To UBound(BOXEN())
    'Textur für Box setzen
    Call Device.SetTexture(0, texTextur(BOXEN(j).Textur))

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

    'Die World-Matrix der Box transformieren
    Device.SetTransform _
          D3DTRANSFORMSTATE_WORLD, BOXEN(j).WorldMatrix
    'HilfsMatrix in den Mittelpunkt der Box schieben
    TranslateMatrix helpMatrix(1), BOXEN(j).Mittelpunkt

    'Boxen entsprechend drehen
    Select Case BOXEN(j).Achse
      Case "X"
        RotateXMatrix helpMatrix(0), BOXEN(j).Rotate * PI / 180
      Case "Y"
        RotateYMatrix helpMatrix(0), BOXEN(j).Rotate * PI / 180
      Case "Z"
        RotateZMatrix helpMatrix(0), BOXEN(j).Rotate * PI / 180
    End Select

    'Hilfsmatrizen miteinander multiplizieren
    helpMatrix(1) = RetMatrixMult(helpMatrix(1), helpMatrix(0))
    'Änderungen der World-Matrix der Box durchführen
    Device.MultiplyTransform D3DTRANSFORMSTATE_WORLD, helpMatrix(1)
    'Box rendern
    Call Device.DrawPrimitive(D3DPT_TRIANGLELIST, _
          D3DFVF_LVERTEX, BOXEN(j).vxBox(0), 36, D3DDP_WAIT)
  Next j

  Device.EndScene
End Sub
 
Weitere Links zum Thema
X-Files laden und rendern
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  (166 kB) Downloads bisher: [ 2052 ]

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, 20. September 2011