"Wabbelige" Gummi-objekte

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Chrise

Betreff: "Wabbelige" Gummi-objekte

BeitragSo, Mai 24, 2009 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo beisammen!

Hatte neulich mal wieder ne ganz witzige Idee. Ich denke die Umsetzung davon entspricht ungefähr meiner Vorstellung von der Idee Smile

Interessant wird das ganze leider erst bei eigenen Objekten. Ihr könnt es euch ja mal ansehen und ein wenig rumprobieren Wink

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]

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]
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)

;Demonstrationszwecke
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
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.
 

aletes

BeitragSo, Mai 24, 2009 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ich wüsst zwar nicht wofür man das gebrauchen kann, sieht aber lustig aus Very Happy

Chrise

BeitragSo, Mai 24, 2009 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
nunja Anwendungsgebiete wären da natürlich Gegenstände im Spiel, die aus Gummi bestehen *g*
Oder wabbelig sind, wie zum Beispiel ein Wackelpudding. Hmmm....Wackelpudding ^^
Aber solange es lustig aussieht hat es seinen Zweck erfüllt Wink
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group