Seite 1 von 2

Billboard - mathem. Hintergrund verstehen

Verfasst: 05.07.2006 15:34
von Cardian
(Als Einführung ...
Ein Billboard ist ein Sprite, was sich immer nach dem Betrachter ausrichtet. In PureBasic gibt es Extra-Abteilung dafür. Es ist damit möglich zum Beispiel Bäume durch einen einzigen Sprite darzustellen, was die Rechenpower drastisch reduzieren kann.)

Egal, ich will verstehen wie das funktioniert. Leider bin ich eine mathematische Fehlgeburt ... habe drei Arme, 17,4 Finger und 0,928 Gehirn ... wie soll man damit rechnen...?

Ich habe mich die letzten Tage mit sinus, cosinus, Einheitskreis, Vertexen und diesen MulMatrix beschäftigt.
Habe auch einen englischen Artikel samt Beispielcode für Visual C++ gefunden (http://nehe.gamedev.net/data/articles/a ... article=19).
Kenne mich auch mit C++ aus, aber mathematisch bin ich eben nicht durchgestiegen. :( *schnief*


Gegeben:
Koordinatensystem: X(Breite), Z(Tiefe), Y(Höhe)
AugeX, AugeZ -> Betrachterposition
BaumX, BaumZ -> auszurichtender Baum (Mittelpunkt)
BaumR -> Radius des Baums

Welche Berechnung muß man anstellen, damit der Baum sich immer zum Auge ausrichtet. Um es zu vereinfachen, ändert sich daß Auge des Betrachters nicht in der Höhe(y).

Ich hoffe, ihr könnt mir bitte helfen.

Verfasst: 05.07.2006 16:57
von Kaeru Gaman
ähm..

eigentlich ist es so, dass man für "billboards" keine berechnungen anstellen muss.
man muss nur die größe und position auf dem screen berechnen, dann stellt man einfach die texture dar.
für ein in die 3D-welt eingebundenes polygon muss man umfangreiche berechnungen anstellen,
um es eben perspektivisch korrekt darzustellen.

aber die darstellung dieser "billboards" ist schon in openGL eingebunden, da gibts nen eigenen befehl dafür,
und D3D müsste diesen objekttyp auch kennen.

die graka selber führt eben dafür keine perspektivenverzerrung durch, sondern nur eine entfernungs-verkleinerung und positionierung.

Verfasst: 05.07.2006 17:17
von Cardian
Die Billboards sind in OpenGL eingebunden? Da find ich aber gar nichts ...

Dafür hab ich unter VC6.0 in einem Beispiel ein Partikel-Beispiel gefunden, welches eine Billboard-Darstellungs nutzt (SSMaze.c).

Na das werd ich mir jetzt mal ansehn ...

Verfasst: 06.07.2006 11:20
von Kaeru Gaman
such im RedBook mal nach "Sprites". die heißen in oGL nicht "Billboards", den begriff hab ich in PB zum ersten mal gehört.

Verfasst: 06.07.2006 16:48
von Hades
Der Unterschied zwischen Billboards und Sprites ist, dass Sprites vor der Scene (in der Bildschirmebene), Billboards in der Scene dargestellt werden.

Es gibt verschiedene Möglichkeiten Billboards zu berechnen, und sooo schwierig sind die alle nicht. Es hängt nur davon ab was Du brauchst.

Ich hab irgendwo ne nette Beschreibung gesehen. Werd mal versuchen die wieder zu finden...

Edit: Verdammt, ist ja der gleiche den Du oben angegeben hast.

Ok Cardian, erklär doch bitte mal wo Du in dem Artikel von NeHe hängen bleibst.

Ich versuche Dir mal zu schildern wie Du aus dem was Du oben gegeben hast zu dem kommst was in dem NeHe Artikel gegeben ist.

Ich vermute Du stehst aufrecht und der Baum auch, also ist Dein
'up vector':
ux=0.0
uy=1.0
uz=0.0

der 'look vector' vom billboard ist:
lx=BaumX-AugeX
ly=BaumY-AugeY
lz=Baumz-AugeZ

den erst noch normalisieren:
l=sqr(lx*lx + ly*ly + lz*lz)
lx=lx/l
ly=ly/l
lz=lz/l

und dann noch der 'right vector' berechnen (cross product):
rx=uy*lz - uz*ly
ry=uz*lx - ux*lz
rz=ux*ly - uy*lx

Hilft das schon?

Verfasst: 07.07.2006 14:10
von hardfalcon
@Kaeru: Billboards werden z.B. bei manchen Multiplayergames auf manchen Maps angezeigt, die Textur is dann eine Art Werbebanner für den Serverbetreiber. Perspektivische Verzerrung wird da natürlich nicht benötigt, dafür muss aber Berechnet werden, welche 3D-Objekte vor dem Billdboard (und welche dahinter) angezeigt werden müssen. Im Grunde sind Billboards normale 3D-Objekte, die eben nur immer dem Betrachter zugewand sind... Sprites dagegen werden, Hades schon gesagt hat, vor den ganzen Rest auf den Bildschirm gepappt, quasi wie ein "Brett vorm Kopf/vor der Kamera"... :allright:

Verfasst: 07.07.2006 15:09
von Hades
Ich hab hier mal ne kleine Demonstration in 2D Draufsicht programmiert.
Einfach das Programm starten und den Mauszeiger über dem Fenster bewegen.

Code: Alles auswählen

If InitSprite() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

Procedure TurnBB(BBX.f, BBZ.f, BBSize.f, AugeX.f, AugeZ.f)
  Protected LookX.f, LookZ.f, VLength.f, RightX.f, RightZ.f
  Protected X1.f, Y1.f, Z1.f, X2.f, Y2.f, Z2.f
  LookX = AugeX - BBX
  LookZ = AugeZ - BBZ
  
  VLength = Sqr(LookX * LookX + LookZ * LookZ)
  LookX = LookX / VLength
  LookZ = LookZ / VLength
  
  RightX = LookZ
  RightZ = -LookX
  
  X1 = BBX + -BBSize * RightX
  Z1 = BBZ + -BBSize * RightZ
  
  X2 = BBX + BBSize * RightX
  Z2 = BBZ + BBSize * RightZ
  
  LineXY(X1, Z1, X2, Z2, RGB(255,255,255))
EndProcedure

If OpenWindow(0,0,0,400,400,"Billboard math in 2D", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0),0,0,400,400,0,0,0)
    Repeat
      ClearScreen(RGB(0,0,0))
      StartDrawing(ScreenOutput())
      
      TurnBB(200.0, 200.0, 40.0, WindowMouseX(0), WindowMouseY(0))
      TurnBB(100.0, 300.0, 20.0, WindowMouseX(0), WindowMouseY(0))
      
      StopDrawing()
      FlipBuffers()
      Delay(1)
      Event.l = WindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
EndIf  

Um das ganze in 3D zu bekommen brauchst Du nur die relative Position und die Höhe der Bäume mit einbeziehen.
z.B.:
Y1 = BBY - AugeY - BBSize
Y2 = BBY - AugeY + BBSize

Und damit hast Du dann die vier Ecken des Billboards. (x1,y1,z1 / x2,y1,z2 / x1,y2,z1 / x2,y2,z2)


PS: Die Formel die ich im Programm benutzt hab ist die gleiche wie die, die ich weiter oben gepostet hab. Da bei Dir allerdings der up vector immer 0,1,0 ist und Y hier nicht genutzt wird hab ich alles unnütze rausgekürzt.

Verfasst: 07.07.2006 16:56
von Alves
Nach hardfalcon zu schließen, werden Billboards in PureStein verwendet. Ein Spiel mit der Raycasting Library. Finde aber den Link nicht mehr.

Verfasst: 07.07.2006 17:27
von Zaphod
Bei einem Raycaster ist das auch nicht sehr schwierig, denn da gibt es ja nur einen Winkel um den man sich kümmern muß.

Bei Billboards in einer richtigen 3D welt gibt es drei verschiedene arten.
Direktional (keine ahnung wie man das richtig nennt) dabei werden die Polygone linear alle in richtung kammera gedreht. Das geht sehr schnell, führt aber zu verzerrungen, Zylindrisch und Spherisch. Spherisch gibt die besten Resultate.
Ein kurzes Googlen hat mich hierher geführt: http://wiki.delphigl.com/index.php/sph% ... _Billboard

ist zwar auf Delphi bezogen, aber es wird ja hauptsächlich mit GL Calls gearbeitet, sollte also kein Problem sein. Auf der opengl webseite (www.opengl.org) gibt es auch irgendwo ein Tutorial dazu, bin aber grade zu faul zum suchen ;)

Verfasst: 07.07.2006 18:08
von Hades
Ob Du es glaubst oder nicht... Mit der kleinen Erweiterung (Y1/Y2) die ich nach dem code geposted hab ist das die Berechnung für Billboards in einer 'richtigen 3D Welt'. Und zwar Axis aligned Billboards in der Y-Achse. Genau das, was man für Bäume und alles andere was auf dem Boden steht braucht.

Ich hätte auch ne 3D-Version programmieren können. Das hätte wesentlich länger gedauert, der Code wäre 10x so lang gewesen, hätte warscheinlich ne API genutzt mit der wieder viele nichts anfangen können und es wäre schwerer zu verstehen gewesen.

Wenn jemand Probleme hat das in seine Engine zu integrieren helf ich gern. :wink: