Triangles absprengen
Übersicht

![]() |
Black SpiderBetreff: Triangles absprengen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
AvaGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group