Orthogonales Rendern
Übersicht

![]() |
NoobodyBetreff: Orthogonales Rendern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Siehe http://wiki.delphigl.com/index...llboarding
Über GetMatElement solltest du die ModelViewMatrix der Kamera rankommen. mfg olli |
||
vertex.dreamfall.at | GitHub |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
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![]() |
||
MrKeks.net |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Inaries Tipp hat wunderbar funktioniert.
Vielen Dank! Damit hast du mir einiges rumgemurkse erspart ![]() |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group