Seite 1 von 1

Billboards verschwinden

Verfasst: 04.06.2016 07:38
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.

Re: Billboards verschwinden

Verfasst: 04.06.2016 09:29
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

Re: Billboards verschwinden

Verfasst: 13.06.2016 23:10
von Makke
Alles klar. Danke Stargate für den Tip. Die ganzen Billboard Kommandos sind immer relativ zur Billboardgruppe.

Anleitung lesen sollte man schon. :|