Billboards verschwinden

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Billboards verschwinden

Beitrag von Makke »

Hallo zusammen,

ich hänge bei einem kleinen Testprogramm an folgendem merkwürdigem Problem fest. Ich erstelle eine Billboardgruppe mit mehreren Billboards und lasse die "wandern", zugleich wandert die Kamera in die andere Richtung. Das ganze geht auch ein zwei mal gut (Billboard läuft durch den Bildschirm, aber beim dritten mal oder vierten mal verschwindet das Billboard (ist schwierig zu erklären). Vor allem verschwindet das Billboard einfach mitten beim "wandern" und nicht wenn es erst "am Ende des Bildschirms" ist. Hier eine ganz einfaches Beispiel dazu:

Code: Alles auswählen

EnableExplicit
If InitEngine3D()
  If InitSprite() And InitKeyboard() And InitMouse()
    If OpenWindow(0, 0, 0, 1200, 720, "Purebasic", #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      If OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0, #PB_Screen_WaitSynchronization)
        Debug "Hardware init done!"
      Else
        Debug "Error: can't open windowed screen!"
        End
      EndIf
    Else
      Debug "Error: can't open window!"
      End
    EndIf
  Else
    Debug "Error: can't init screen, keyboard and mouse!"
    End
  EndIf
Else
  Debug "Error: can't init 3d engine!"
  End
EndIf

Define.i i, ExitProgram, billboard
Define.f x, y, z

CreateTexture(0, 32, 32)
StartDrawing(TextureOutput(0))
For i = 0 To TextureHeight(0)/2-1
  Circle(TextureWidth(0)/2, TextureHeight(0)/2, TextureHeight(0)/2-i, RGB(15*i,15*i,15*i))
Next
StopDrawing()

CreateMaterial(0, TextureID(0))

CreateNode(0)

CreateBillboardGroup(0, MaterialID(0), 4, 4)
billboard = AddBillboard(0, 0, 0, Random(30)-15)

CreateCamera(0, 0, 0, 100, 100)
RotateCamera(0, -90, 0, 0, #PB_Absolute)
MoveCamera(0, 0, 50, 0, #PB_Absolute)

AttachNodeObject(0, CameraID(0))
AttachNodeObject(0, BillboardGroupID(0))

Repeat
  
  If IsWindow(0)
    While WindowEvent() : Wend
  EndIf

  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      ExitProgram = #True
    EndIf
  EndIf
  
  ExamineMouse() ; not used here
  
  MoveNode(0, 0, 0, -0.05)
  
  MoveBillboard(billboard, 0, 0, 0, 0.1)
  If CameraProjectionY(0, BillboardX(billboard, 0), BillboardY(billboard, 0), BillboardZ(billboard, 0)) = -1
    x = BillboardX(billboard, 0)
    y = 0.0
    z = NodeZ(0)-10
    BillboardLocate(billboard, 0, x, y, z)
    Debug "Distance from node to billboard: " + Sqr( Pow( NodeX(0) - x , 2 ) + Pow( NodeZ(0) - z , 2 ) )
  EndIf
  
  RenderWorld()
  
  FlipBuffers()
  
Until ExitProgram = #True

End 0
Wenn jemand Rat weiß, ich bin für jeden Tip dankbar. Ich möchte das ungerne mit Sprites machen.
---
Windows 11 (64 bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Billboards verschwinden

Beitrag von STARGÅTE »

Das liegt daran, das du mit BillboardZ(billboard, 0) die Projektion abfragst, aber das Billboard an einem Node hängt, welche ja auch eine Z-Position hat, die nicht zu BillboardZ() hinzuaddiert wird.

Danach kannst du auch nicht
z = NodeZ(0)-10
verwenden, weil die Camera ja mit im Node hängt, also hier nur Z = -1

Code: Alles auswählen

EnableExplicit
If InitEngine3D()
  If InitSprite() And InitKeyboard() And InitMouse()
    If OpenWindow(0, 0, 0, 1200, 720, "Purebasic", #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      If OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0, #PB_Screen_WaitSynchronization)
        Debug "Hardware init done!"
      Else
        Debug "Error: can't open windowed screen!"
        End
      EndIf
    Else
      Debug "Error: can't open window!"
      End
    EndIf
  Else
    Debug "Error: can't init screen, keyboard and mouse!"
    End
  EndIf
Else
  Debug "Error: can't init 3d engine!"
  End
EndIf

Define.i i, ExitProgram, billboard
Define.f x, y, z

CreateTexture(0, 32, 32)
StartDrawing(TextureOutput(0))
For i = 0 To TextureHeight(0)/2-1
  Circle(TextureWidth(0)/2, TextureHeight(0)/2, TextureHeight(0)/2-i, RGB(15*i,15*i,15*i))
Next
StopDrawing()

CreateMaterial(0, TextureID(0))

CreateNode(0)

CreateBillboardGroup(0, MaterialID(0), 4, 4)
billboard = AddBillboard(0, 0, 0, Random(30)-15)

CreateCamera(0, 0, 0, 100, 100)
RotateCamera(0, -90, 0, 0, #PB_Absolute)
MoveCamera(0, 0, 50, 0, #PB_Absolute)

AttachNodeObject(0, CameraID(0))
AttachNodeObject(0, BillboardGroupID(0))

Repeat
  
  If IsWindow(0)
    While WindowEvent() : Wend
  EndIf

  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      ExitProgram = #True
    EndIf
  EndIf
  
  ExamineMouse() ; not used here
  
  MoveNode(0, 0, 0, -0.05)
  
  MoveBillboard(billboard, 0, 0, 0, 0.1)
  If CameraProjectionY(0, BillboardX(billboard, 0), BillboardY(billboard, 0), BillboardZ(billboard, 0)+NodeZ(0)) = -1
    x = BillboardX(billboard, 0)
    y = 0.0
    z = -10
    BillboardLocate(billboard, 0, x, y, z)
    Debug "Distance from node to billboard: " + Sqr( Pow( NodeX(0) - x , 2 ) + Pow( NodeZ(0) - z , 2 ) )
  EndIf
  
  RenderWorld()
  
  FlipBuffers()
  
Until ExitProgram = #True

End 0
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: Billboards verschwinden

Beitrag von Makke »

Alles klar. Danke Stargate für den Tip. Die ganzen Billboard Kommandos sind immer relativ zur Billboardgruppe.

Anleitung lesen sollte man schon. :|
---
Windows 11 (64 bit)
Antworten