![]() |
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
|
|
|
|
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: [ 191 ]
|
|
|