Orthogonales Rendern

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Noobody

Betreff: Orthogonales Rendern

BeitragMi, Mai 07, 2008 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie der Titel schon sagt, zermartere ich mir gerade den Kopf darüber, wie ich selbiges umgesetzt bekomme.
Es geht nämlich um ein 3D - Partikelsystem, bei dem die Quads natürlich immer senkrecht zur Kamera stehen müssen.

Mein Ansatz war, dass man zuerst einen Vektor zwischen Kamera und dem Zentrum des Quads bildet und diesen als Normalenvektor für eine Ebene zu verwenden.
Da alle vier Eckpunkte des Quads auf dieser Ebene liegen müssen, hat man immerhin schon mal einen Anhaltspunkt auf ihre Position.
Danach berechnet man die Achsenschnittpunkte der Ebene (also dort, wo sie die Koordinatenachsen berührt) und bildet zwei Vektoren aus diesen Punkten.
Diese erhaltenen Vektoren normiert man auf 1 und multipliziert sie jeweils mit der Breite und Höhe des Quads, um auf den Abstand zwischen Mittelpunkt und einem Eckpunkt zu kommen.
Dann subtrahiert oder addiert man diese Werte zu den Koordinaten des Mittelpunkts, und das Quad sollte senkrecht zur Kamera stehen.

Soweit zur Theorie....
In der Praxis funktioniert das leider gar nicht so rund.

Wer sich das ganze mal anschauen möchte:
Code: [AUSKLAPPEN]
 Graphics3D 800, 600, 0, 2
SetBuffer BackBuffer()

Type TParticle
   Field X#
   Field Y#
   Field Z#
   Field Width#
   Field Height#
   Field Vertex
   Field Surface
End Type

;----- Grafikkram
Cam = CreateCamera()
PositionEntity Cam, 1, 1, -10
CreateLight()
CreateCube()
;-----


Mesh = CreateMesh()

Particle.TParticle = New TParticle
   Particle\Height# = 1
   Particle\Width# = 1
   Particle\X# = 0.5
   Particle\Y# = 0.5
   Particle\Z# = 10
   Particle\Surface = CreateSurface( Mesh )
   Particle\Vertex = AddVertex( Particle\Surface, 0, 0, 0 )

AddVertex( Particle\Surface, 0, 0, 0 )
AddVertex( Particle\Surface, 0, 0, 0 )
AddVertex( Particle\Surface, 0, 0, 0 )

AddTriangle( Particle\Surface, Particle\Vertex, Particle\Vertex + 2, Particle\Vertex + 1 )
AddTriangle( Particle\Surface, Particle\Vertex + 3, Particle\Vertex + 2, Particle\Vertex )


Timer = CreateTimer( 60 )

While Not KeyHit( 1 )
   Cls
   RenderWorld
   
   MoveEntity Cam, ( KeyDown( 205 ) - KeyDown( 203 ) )/5., 0, ( KeyDown( 200 ) - KeyDown( 208 ) )/5.
   TurnEntity Cam, MouseYSpeed(), -MouseXSpeed(), 0
        MoveMouse 400, 300
   UpdateParticles( Cam )
   UpdateNormals Mesh
   
   Flip 0
   WaitTimer Timer
Wend

End

Function UpdateParticles( Camera )
   Local SideVector1#[ 2 ], SideVector2#[ 2 ]
   CamX# = EntityX( Camera, 1 )
   CamY# = EntityY( Camera, 1 )
   CamZ# = EntityZ( Camera, 1 )
   
   For Particle.TParticle = Each TParticle
      VectorX# = CamX# - Particle\X#
      VectorY# = CamY# - Particle\Y#
      VectorZ# = CamZ# - Particle\Z#
      
      D# = -( VectorX#*Particle\X# + VectorY#*Particle\Y# + VectorZ#*Particle\Z# )
      ZeroesX# = -D#/VectorX#
      ZeroesY# = -D#/VectorY#
      ZeroesZ# = -D#/VectorZ#
      
      SideVector1[ 0 ] = -ZeroesX#
      SideVector1[ 1 ] = ZeroesY#
      SideVector1[ 2 ] = 0
      
      SideVector2[ 0 ] = ZeroesX#
      SideVector2[ 1 ] = 0
      SideVector2[ 2 ] = -ZeroesZ#
      
      Length1 = Sqr( SideVector1[ 0 ]*SideVector1[ 0 ] + SideVector1[ 1 ]*SideVector1[ 1 ] )
      Length2 = Sqr( SideVector2[ 0 ]*SideVector2[ 0 ] + SideVector2[ 2 ]*SideVector2[ 2 ] )
      
      SideVector1[ 0 ] = SideVector1[ 0 ]/Length1
      SideVector1[ 1 ] = SideVector1[ 1 ]/Length1
      
      SideVector2[ 0 ] = SideVector2[ 0 ]/Length2
      SideVector2[ 2 ] = SideVector2[ 2 ]/Length2
      
      VertexCoords Particle\Surface, Particle\Vertex + 0, Particle\X# - SideVector1[ 0 ]*Particle\Height/2 - SideVector2[ 0 ]*Particle\Width/2, Particle\Y# - SideVector1[ 1 ]*Particle\Height/2, Particle\Z# - SideVector2[ 2 ]*Particle\Width/2
      VertexCoords Particle\Surface, Particle\Vertex + 1, Particle\X# - SideVector1[ 0 ]*Particle\Height/2 + SideVector2[ 0 ]*Particle\Width/2, Particle\Y# - SideVector1[ 1 ]*Particle\Height/2, Particle\Z# + SideVector2[ 2 ]*Particle\Width/2
      VertexCoords Particle\Surface, Particle\Vertex + 2, Particle\X# + SideVector1[ 0 ]*Particle\Height/2 + SideVector2[ 0 ]*Particle\Width/2, Particle\Y# + SideVector1[ 1 ]*Particle\Height/2, Particle\Z# + SideVector2[ 2 ]*Particle\Width/2
      VertexCoords Particle\Surface, Particle\Vertex + 3, Particle\X# + SideVector1[ 0 ]*Particle\Height/2 - SideVector2[ 0 ]*Particle\Width/2, Particle\Y# + SideVector1[ 1 ]*Particle\Height/2, Particle\Z# - SideVector2[ 2 ]*Particle\Width/2
   Next
End Function


Ich habe einiges ausprobiert, komme aber auf keinen grünen Zweig, daher wäre ich sehr froh um Hilfe Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Vertex

BeitragMi, Mai 07, 2008 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe http://wiki.delphigl.com/index...llboarding
Über GetMatElement solltest du die ModelViewMatrix der Kamera rankommen.

mfg olli
vertex.dreamfall.at | GitHub

Mr.Keks

BeitragMi, Mai 07, 2008 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ich mache das immer so, dass ich das mesh, in das ich die singlesurfacepartikel packe, vor jeder aktualisierung an die position und drehung der kamera setze und die koordinaten der partikel dann mit tformpoint in den raum dieses meshes hole. einziger stress hiermit ist, wenn man verhindern möchte, dass die partikel sich mitdrehen, wenn man die kamera rollt.
MrKeks.net

Noobody

BeitragDo, Mai 08, 2008 12:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Inaries Tipp hat wunderbar funktioniert.

Vielen Dank!
Damit hast du mir einiges rumgemurkse erspart Wink
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group