Triangles absprengen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Black Spider

Betreff: Triangles absprengen

BeitragSa, Sep 30, 2006 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute,
ihr kennt wahrscheinlich das Explode Sample von birdie,
wo man die Triangles von einem Objekt absprengen kann.
Wollte sowas ähnliches schreiben, allerdings als SingleSurface, da es einfach viel zu aufwendig wäre jedes Tris einzeln als Mesh zu berechnen.
Ansatz hab ich schon,
doch da ist n Fehler drinne, den ich echt nicht finde. Alle Tris sind an einem Zusammengepappt und fliegen nach oben anstatt alle in andere Richtungen...
Weiss einer Rat?

Code: [AUSKLAPPEN]


Type expl
   Field mesh
   Field surface
   Field surf
   Field zt#
   Field tris
   Field ver.tri
End Type

Type tri
   Field x#
   Field y#
   Field z#
   Field dx#
   Field dy#
   Field dz#
   Field cnt
   Field ex
   Field pitch#
   Field yaw#
   Field ind
End Type




Function Create_SS_Explosion(obj)
ex.expl = New expl

ex\mesh = CreateMesh()
ex\surf = CreateSurface(ex\mesh)
ex\zt    = 100

ex\surface = GetSurface(obj,CountSurfaces(obj))
ex\tris = CountTriangles(ex\surface)

;--- Für jedes Triangle wird ein neues erstellt und an das Explosionsmesh geheftet ---
For count = 0 To ex\tris - 1
   Set_Tris(ex,count)
Next

PositionEntity ex\mesh,EntityX(obj,1),EntityY(obj,1),EntityZ(obj,1)
ScaleEntity ex\mesh,2,2,2

End Function


Function Update_SS_Tris()

For ex.expl = Each expl

ex\zt = ex\zt - 1

For tr.tri = Each tri

If tr\ex <> 0 Then


VertexCoords ex\surf,tr\ind,VertexX(ex\surf,tr\ind)+(Sin(tr\yaw)*tr\dx*Cos(tr\pitch)),VertexY(ex\surf,tr\ind)+(Sin(tr\pitch)*tr\dy),VertexZ(ex\surf,tr\ind)+(Cos(tr\yaw)*tr\dz*Sin(tr\pitch))
VertexCoords ex\surf,tr\ind+1,VertexX(ex\surf,tr\ind+1)+(Sin(tr\yaw)*tr\dx*Cos(tr\pitch)),VertexY(ex\surf,tr\ind+1)+(Sin(tr\pitch)*tr\dy),VertexZ(ex\surf,tr\ind+1)+(Cos(tr\yaw)*tr\dz*Sin(tr\pitch))
VertexCoords ex\surf,tr\ind+2,VertexX(ex\surf,tr\ind+2)+(Sin(tr\yaw)*tr\dx*Cos(tr\pitch)),VertexY(ex\surf,tr\ind+2)+(Sin(tr\pitch)*tr\dy),VertexZ(ex\surf,tr\ind+2)+(Cos(tr\yaw)*tr\dz*Sin(tr\pitch))




End If

Next


If ex\zt <= 0 Then
   FreeEntity ex\mesh
   ClearSurface ex\surf
   Delete ex
End If

Next

End Function



Function Set_Tris(ex.expl,count#)
   ex\ver = New tri
   ex\ver\ex = 1
   ;ex\ver\pitch# = Rnd(360)
   ;ex\ver\yaw# = Rnd(360)
      
   ex\ver\pitch#    = (ex\ver\pitch# + 10) Mod 360
   ex\ver\yaw#    = (ex\ver\yaw# + 10) Mod 360
   
   i0 = TriangleVertex(ex\surface,count,0)
   i1 = TriangleVertex(ex\surface,count,1)
   i2 = TriangleVertex(ex\surface,count,2)
   
   ex\ver\x# = VertexX(ex\surface,i0)
   ex\ver\y# = VertexY(ex\surface,i0)
   ex\ver\z# = VertexZ(ex\surface,i0)
   
   ex\ver\dx# = ex\ver\x*(Rnd(.1,.4))
   ex\ver\dy# = ex\ver\y*(Rnd(.1,.4))
   ex\ver\dz# = ex\ver\z*(Rnd(.1,.4))
   
   ;l=AddVertex(ex\surf,VertexX(ex\surface,i0)-ex\ver\x,VertexY(ex\surface,i0)-ex\ver\y,VertexZ(ex\surface,i0)-ex\ver\z)
   ;AddVertex(ex\surf,VertexX(ex\surface,i1)-ex\ver\x,VertexY(ex\surface,i1)-ex\ver\y,VertexZ(ex\surface,i1)-ex\ver\z)
   ;AddVertex(ex\surf,VertexX(ex\surface,i2)-ex\ver\x,VertexY(ex\surface,i2)-ex\ver\y,VertexZ(ex\surface,i2)-ex\ver\z)

   l=AddVertex(ex\surf,VertexX(ex\surface,i0)+Rnd(2),VertexY(ex\surface,i0)+Rnd(2),VertexZ(ex\surface,i0)+Rnd(2))
   AddVertex(ex\surf,VertexX(ex\surface,i1)+Rnd(2),VertexY(ex\surface,i1)+Rnd(2),VertexZ(ex\surface,i1)+Rnd(2))
   AddVertex(ex\surf,VertexX(ex\surface,i2)+Rnd(2),VertexY(ex\surface,i2)+Rnd(2),VertexZ(ex\surface,i2)+Rnd(2))


   AddTriangle(ex\surf,i,i+1,i+2)
   AddTriangle(ex\surf,i,i+2,i+1)
   
   ex\ver\ind = l
End Function
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

Blitzcoder

Newsposter

BeitragSa, Sep 30, 2006 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir deinen Code nicht angeshen, aber du kannst doch die Richtung sehr leicht bestimmen, in dem du die Koordinaten der Vertices und den Grundkoords des Meshs vergleichst.


MfG Blitzcoder
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
 

Ava

Gast

BeitragSa, Sep 30, 2006 15:32
Antworten mit Zitat
Am einfachsten ist es eigentlich, wenn Du für die Bewegung und Ausrichtung (ect) Deiner Particle einen Pivot zur Hilfe nimmst.

Mr.Keks

BeitragSa, Sep 30, 2006 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
manman, in meinem leben fehlt es mir soo sehr an herausforderungen. zum glück habe ich ja dich, black spider! du gibst mir einfach so deinen code voller kryptischer einbuchstabenvariablen ohne kommentare und das dann auch noch ohne beispielcode zum direkten ausführen. so darf ich selber herausfinden, wie das system funktioniert und was das ganze zeugs bedeutet. supi, sonst wär's ja zu einfach, dir zu helfen! Wink

blubb:
Code: [AUSKLAPPEN]
Type expl
   Field mesh
   Field surface
   Field surf
   Field zt#
   Field tris
End Type

Type tri
   Field x#
   Field y#
   Field z#
   Field dx#
   Field dy#
   Field dz#
   Field cnt
   Field ex.expl
   Field pitch#
   Field yaw#
   Field ind
End Type

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

sphere = CreateSphere()
Create_SS_Explosion(sphere)

cam = CreateCamera()
MoveEntity cam,0,0,-5

light = CreateLight()
TurnEntity light,0,90,0

EntityAlpha sphere,.5

;WireFrame 1

Repeat
   Cls
   
   Update_SS_Tris()
   UpdateWorld()
   RenderWorld()
   
   Delay 40
   Text 0,0,TrisRendered()
   Flip
Until KeyHit(1)
End

Function Create_SS_Explosion(obj)
   ex.expl = New expl
   
   ex\mesh = CreateMesh()
   ex\surf = CreateSurface(ex\mesh)
   ex\zt    = 100
   
   ex\surface = GetSurface(obj,1)
   ex\tris = CountTriangles(ex\surface)
   
   ;--- Für jedes Triangle wird ein neues erstellt und an das Explosionsmesh geheftet ---
   For count = 0 To ex\tris - 1
      Set_Tris(ex,count)
   Next
   
   PositionEntity ex\mesh,EntityX(obj,1),EntityY(obj,1),EntityZ(obj,1)   
End Function


Function Update_SS_Tris()
   
   For ex.expl = Each expl
      
      ex\zt = ex\zt - 1
      
      For tr.tri = Each tri
         
         If tr\ex = ex Then
            
            VertexCoords ex\surf,tr\ind,VertexX(ex\surf,tr\ind)+tr\dx,VertexY(ex\surf,tr\ind)+tr\dy,VertexZ(ex\surf,tr\ind)+tr\dz
            VertexCoords ex\surf,tr\ind+1,VertexX(ex\surf,tr\ind+1)+tr\dx,VertexY(ex\surf,tr\ind+1)+tr\dy,VertexZ(ex\surf,tr\ind+1)+tr\dz
            VertexCoords ex\surf,tr\ind+2,VertexX(ex\surf,tr\ind+2)+tr\dx,VertexY(ex\surf,tr\ind+2)+tr\dy,VertexZ(ex\surf,tr\ind+2)+tr\dz
            
            tr\dy = tr\dy - .001
            
         End If
         
      Next
      
      UpdateNormals ex\mesh
      
      If ex\zt <= 0 Then
         FreeEntity ex\mesh
         ClearSurface ex\surf
         Delete ex
      End If
      
   Next
   
End Function



Function Set_Tris(ex.expl,count)
   ; ver als feld in expl zu haben, macht keinen sinn...
   ver.tri = New tri
   ver\ex = ex
 
   i0 = TriangleVertex(ex\surface,count,0)
   i1 = TriangleVertex(ex\surface,count,1)
   i2 = TriangleVertex(ex\surface,count,2)
   
   ver\x# = VertexX(ex\surface,i0)
   ver\y# = VertexY(ex\surface,i0)
   ver\z# = VertexZ(ex\surface,i0)
   
   ; habe für die bewegungsrichtung einfacherweise die oberflächennormalen gewählt
   ver\dx# = (VertexNX(ex\surface,i0)+VertexNX(ex\surface,i1)+VertexNX(ex\surface,i2))/100
   ver\dy# = (VertexNY(ex\surface,i0)+VertexNY(ex\surface,i1)+VertexNY(ex\surface,i2))/100+Rnd(.02)
   ver\dz# = (VertexNZ(ex\surface,i0)+VertexNZ(ex\surface,i1)+VertexNZ(ex\surface,i2))/100
   
   
   ; hier war irgendwas mit i und l durcheinander gebracht worden... dadurch wurde nur eine sache erstellt
   i=AddVertex(ex\surf,VertexX(ex\surface,i0),VertexY(ex\surface,i0),VertexZ(ex\surface,i0))
   AddVertex(ex\surf,VertexX(ex\surface,i1),VertexY(ex\surface,i1),VertexZ(ex\surface,i1))
   AddVertex(ex\surf,VertexX(ex\surface,i2),VertexY(ex\surface,i2),VertexZ(ex\surface,i2))


   AddTriangle(ex\surf,i,i+1,i+2)
   AddTriangle(ex\surf,i,i+2,i+1)
   
   ver\ind = i
End Function
MrKeks.net
 

lettorTrepuS

BeitragSo, Okt 01, 2006 2:25
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Black Spider

BeitragSo, Okt 01, 2006 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Inarie!

Das mit dem i und l war der gravierende Fehler (*kopfvordiewandhau*)

Sry dass der Code so unkommentiert war und keine Beispielebene dabei war...

Vielen dank man!
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group