Hallo beisammen!
Hatte neulich mal wieder ne ganz witzige Idee. Ich denke die Umsetzung davon entspricht ungefähr meiner Vorstellung von der Idee
Interessant wird das ganze leider erst bei eigenen Objekten. Ihr könnt es euch ja mal ansehen und ein wenig rumprobieren
Ich denke den kurzen Beispielcode ansehen dürfte genügen, um die Handhabung zu erkennen.
Der Parameter Reset# gibt an, wie sehr das Objekt dazu gewillt ist, in seine ursprüungliche Form zurückzuspringen
Der Parameter Damp# gibt an, wie stark die Geschwindigkeit der einzelnen Vertices abgebremst wird.
Funktionen:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Function InitGum(Mesh) Local Surfaces,Surface,Vertices,Vertex,Index,Gum.Gum Surfaces=CountSurfaces(Mesh) For Index=1 To Surfaces Surface=GetSurface(Mesh,Index) Vertices=CountVertices(Surface) For Vertex=0 To Vertices-1 Gum.Gum=New Gum Gum\Mesh=Mesh Gum\Surface=Surface Gum\Vertex=Vertex Gum\X#=VertexX(Surface,Vertex) Gum\Y#=VertexY(Surface,Vertex) Gum\Z#=VertexZ(Surface,Vertex) Gum\D#=(Gum\X#*Gum\X#+Gum\Y#*Gum\Y#+Gum\Z#*Gum\Z#)^0.333333 TFormPoint Gum\X#,Gum\Y#,Gum\Z#,Mesh,0 Gum\XOld#=TFormedX() Gum\YOld#=TFormedY() Gum\ZOld#=TFormedZ() Next Next End Function Function UpdateGum(Mesh,Reset#=0.5,Damp#=0.5) Local Gum.Gum,Surface,Vertex,XNew#,YNew#,ZNew#,X#,Y#,Z# For Gum.Gum=Each Gum If Gum\Mesh=Mesh Then Surface=Gum\Surface:Vertex=Gum\Vertex TFormPoint VertexX(Surface,Vertex),VertexY(Surface,Vertex),VertexZ(Surface,Vertex),Mesh,0 X#=TFormedX() Y#=TFormedY() Z#=TFormedZ() TFormPoint Gum\X#,Gum\Y#,Gum\Z#,Mesh,0 Gum\XS#=Gum\XS#+(X#-Gum\XOld#)+(TFormedX()-X#)*Reset#*Gum\D# Gum\YS#=Gum\YS#+(Y#-Gum\YOld#)+(TFormedY()-Y#)*Reset#*Gum\D# Gum\ZS#=Gum\ZS#+(Z#-Gum\ZOld#)+(TFormedZ()-Z#)*Reset#*Gum\D# Gum\XS#=Gum\XS#*(1-Damp#) Gum\YS#=Gum\YS#*(1-Damp#) Gum\ZS#=Gum\ZS#*(1-Damp#) XNew#=X#+Gum\XS# YNew#=Y#+Gum\YS# ZNew#=Z#+Gum\ZS# TFormPoint XNew#,YNew#,ZNew#,0,Mesh VertexCoords Gum\Surface,Gum\Vertex,TFormedX(),TFormedY(),TFormedZ() Gum\XOld#=XNew# Gum\YOld#=YNew# Gum\ZOld#=ZNew# EndIf Next End Function Function ClearGum(Mesh,Shape=0) Local Gum.Gum For Gum.Gum=Each Gum If Gum\Mesh=Mesh Then If Shape=1 Then VertexCoords Gum\Surface,Gum\Vertex,Gum\X#,Gum\Y#,Gum\Z# Delete Gum.Gum EndIf Next End Function Type Gum Field Mesh,Surface,Vertex Field X#,Y#,Z#,D# Field XS#,YS#,ZS# Field XOld#,YOld#,ZOld# End Type
Beispielcode:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Timer=CreateTimer(25) SeedRnd MilliSecs() Graphics3D 1024,768,0,2 SetBuffer BackBuffer()
Local Camera=CreateCamera() PositionEntity Camera,0,0,-10 Local Light=CreateLight() RotateEntity Light,45,30,0
Mesh=CreateSphere(24) InitGum(Mesh)
WireFrame 1 While Not KeyHit(1) TurnEntity Mesh,0.5,0,0 PositionEntity Mesh,(Float(MouseX()-GraphicsWidth()/2)/GraphicsWidth())*8,0,0 TurnEntity Mesh,MouseYSpeed()/2,MouseXSpeed()/2,0 UpdateGum(Mesh,0.5,0.5) RenderWorld Text 50,50,"Sobald die Entertaste gedrückt wird, wird das Gummiobjekt aus dem Gummispeicher entfernt" Text 50,65,"und das Objekt verbleibt (bei ClearGum(Mesh,[Parameter=0]) so, wie es deformiert wurde." Text 50,80,"Bei angegebenen Parameter 1 wird das Objekt wieder in Ursprungsform zurückgesetzt." Text 50,105,"Interessant wird das ganze allerdings erst bei eigenen Meshes." Text 50,120,"Die Standartobjekte von BB3D sehen leider allesamt langweilig aus ^^! Viel Spaß beim probieren." If KeyHit(28) Then ClearGum(Mesh) WaitTimer Timer Flip 0 Wend End
Function InitGum(Mesh) Local Surfaces,Surface,Vertices,Vertex,Index,Gum.Gum Surfaces=CountSurfaces(Mesh) For Index=1 To Surfaces Surface=GetSurface(Mesh,Index) Vertices=CountVertices(Surface) For Vertex=0 To Vertices-1 Gum.Gum=New Gum Gum\Mesh=Mesh Gum\Surface=Surface Gum\Vertex=Vertex Gum\X#=VertexX(Surface,Vertex) Gum\Y#=VertexY(Surface,Vertex) Gum\Z#=VertexZ(Surface,Vertex) Gum\D#=(Gum\X#*Gum\X#+Gum\Y#*Gum\Y#+Gum\Z#*Gum\Z#)^0.333333 TFormPoint Gum\X#,Gum\Y#,Gum\Z#,Mesh,0 Gum\XOld#=TFormedX() Gum\YOld#=TFormedY() Gum\ZOld#=TFormedZ() Next Next End Function Function UpdateGum(Mesh,Reset#=0.5,Damp#=0.5) Local Gum.Gum,Surface,Vertex,XNew#,YNew#,ZNew#,X#,Y#,Z# For Gum.Gum=Each Gum If Gum\Mesh=Mesh Then Surface=Gum\Surface:Vertex=Gum\Vertex TFormPoint VertexX(Surface,Vertex),VertexY(Surface,Vertex),VertexZ(Surface,Vertex),Mesh,0 X#=TFormedX() Y#=TFormedY() Z#=TFormedZ() TFormPoint Gum\X#,Gum\Y#,Gum\Z#,Mesh,0 Gum\XS#=Gum\XS#+(X#-Gum\XOld#)+(TFormedX()-X#)*Reset#*Gum\D# Gum\YS#=Gum\YS#+(Y#-Gum\YOld#)+(TFormedY()-Y#)*Reset#*Gum\D# Gum\ZS#=Gum\ZS#+(Z#-Gum\ZOld#)+(TFormedZ()-Z#)*Reset#*Gum\D# Gum\XS#=Gum\XS#*(1-Damp#) Gum\YS#=Gum\YS#*(1-Damp#) Gum\ZS#=Gum\ZS#*(1-Damp#) XNew#=X#+Gum\XS# YNew#=Y#+Gum\YS# ZNew#=Z#+Gum\ZS# TFormPoint XNew#,YNew#,ZNew#,0,Mesh VertexCoords Gum\Surface,Gum\Vertex,TFormedX(),TFormedY(),TFormedZ() Gum\XOld#=XNew# Gum\YOld#=YNew# Gum\ZOld#=ZNew# EndIf Next End Function Function ClearGum(Mesh,Shape=0) Local Gum.Gum For Gum.Gum=Each Gum If Gum\Mesh=Mesh Then If Shape=1 Then VertexCoords Gum\Surface,Gum\Vertex,Gum\X#,Gum\Y#,Gum\Z# Delete Gum.Gum EndIf Next End Function Type Gum Field Mesh,Surface,Vertex Field X#,Y#,Z#,D# Field XS#,YS#,ZS# Field XOld#,YOld#,ZOld# End Type
|