Tipp 0525 Sichtbarkeit in 3D überprüfen
Autor/Einsender:
Datum:
  Felix Epple
17.12.2006
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
Mit den folgenden Funktionen kann man die Sichtbarkeit eines Objekts in 3D überprüfen. Dieser Tipp ist auf das Winkelsystem des Tipps Objekte im 3D-Raum bewegen angepasst.
 
'Function zur Berechnung des Arcus-Cosinus
Public Function Acs(Number As Double) As Double
  If Number = 1 Then
    Acs = 0
  ElseIf Number = -1 Then
    Acs = PI
  Else
    Acs = 2 * Atn(1) - Atn(Number / Sqr(-Number * Number + 1))
  End If
End Function

'Hilfsfunktion, um einen Winkel zwischen 0 und 360 zu setzen
Public Function GetAngle360(Angle As Single)
  GetAngle360 = Angle
  Do While GetAngle360 < 0
    GetAngle360 = GetAngle360 + 360
  Loop
  Do While GetAngle360 > 359
    GetAngle360 = GetAngle360 - 360
  Loop
End Function

'Funktion zur Berechnung des horizontalen Winkels
Public Function GetAngleH(v As D3DVECTOR) As Single
  Dim DeltaX As Single
  Dim DeltaY As Single
  Dim DeltaZ As Single

  'Setzen der Deltas (Differenzen)
  DeltaX = v.x - Spieler.WorldPos.x
  DeltaY = v.y - Spieler.WorldPos.y
  DeltaZ = v.z - Spieler.WorldPos.z

  'Hier wird überprüft, ob DeltaZ = 0 ist,
  'um eine Division durch 0 zu vermeiden
  If DeltaZ = 0 Then
    'Wenn ja, ist der Winkel entweder 180 oder 0
    If DeltaX > 0 Then GetAngleH = 90
    If DeltaX <= 0 Then GetAngleH = 270
  Else
    'Wenn nein, wird der Winkel durch eine Formel berechnet
    GetAngleH = Atn(DeltaX / DeltaZ) / PI * 180 - 180
  End If

  'Wenn DeltaZ > 0, muss der Winkel noch verändert werden
  If DeltaZ > 0 Then GetAngleH = GetAngleH - 180

  'Falls der Winkel < 0 oder > 360 ist, berechnen
  GetAngleH = GetAngle360(GetAngleH)

  'Winkel noch umändern, damit er verglichen werden kann
  Dim Erhöhen As Boolean
  Dim Vermindern As Boolean

  If GetAngleH - (Spieler.AngleY - 22.5) < -45 And _
        (Spieler.AngleY < 90 Or Spieler.AngleY > 270) Then _
        Erhöhen = True
  If GetAngleH - (Spieler.AngleY + 22.5) > 315 Then _
        Vermindern = True
  If Vermindern = True Then GetAngleH = GetAngleH - 360
  If Erhöhen = True Then GetAngleH = GetAngleH + 360
End Function

'Funktion zur Berechnung des vertikalen Winkels
Public Function GetAngleV(v As D3DVECTOR) As Single
  Dim DeltaX As Single
  Dim DeltaY As Single
  Dim DeltaZ As Single

  'Setzen der Deltas (Differenzen)
  DeltaX = v.x - Spieler.WorldPos.x
  DeltaY = v.y - Spieler.WorldPos.y
  DeltaZ = v.z - Spieler.WorldPos.z

  'Wenn alle Deltas gleich sind, darf der Winkel nicht berechnet
  'werden, da sonst ein Überlauf die Folge wäre
  If DeltaX = 0 And DeltaY = 0 And DeltaZ = 0 Then
    GetAngleV = 0
  Else
    GetAngleV = Acs(Sqr((DeltaX ^ 2 + DeltaZ ^ 2) / _
          (DeltaX ^ 2 + DeltaY ^ 2 + DeltaZ ^ 2))) * 180 / PI
  End If

  'Falls der Winkel < 0 oder > 360 ist, berechnen
  GetAngleV = GetAngle360(GetAngleV)

  'Wenn DeltaY > 0 ist, muss der Winkel noch verändert werden
  If DeltaY > 0 Then GetAngleV = -GetAngleV
End Function

'Sichtbarkeitsfunktion (berechnet die Sichtbarkeit anhand eines
'Punktes und den Winkeln des Spielers)
Public Function Sichtbar(v As D3DVECTOR) As Boolean
  Dim AngleV As Single
  Dim AngleH As Single

  AngleH = GetAngleH(v)
  AngleV = GetAngleV(v)

  'Errechnen anhand der Winkel, ob der Punkt sichtbar ist
  Sichtbar = (AngleH > Spieler.AngleY - 22.5) And _
             (AngleH < Spieler.AngleY + 22.5) And _
             (AngleV > Spieler.AngleX - 22.5) And _
             (AngleV < Spieler.AngleX + 22.5)
End Function
 
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
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (90,2 kB) Downloads bisher: [ 195 ]

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: Sonntag, 15. Mai 2011