Physikengine

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Black Spider

Betreff: Physikengine

BeitragDo, Feb 22, 2007 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
so, bin gerade damit beschäftigt eine rigrid-body Physikengine zu schreiben (erstmal für Kisten, Blöcke usw.),
und die idee ist folgende:
An den Körper (hier Würfel) werden 8 "Punkte" gehängt, und zwar genau in die ecken des Würfels.
Auf die Punkte wirken kräfte, hier wirkt nur Schwerkraft und Rückstellkraft, rest kommt noch.
Die Punkte werden halt entsprechend verschoben (bleiben aber Parent vom eigentlichen Objekt), und das Objekt soll jetzt "nachziehen", ich dachte da an AlingToVector, wie im driver sample, und dann werden die Punkte wieder Re-Positioniert (also wieder an ihre Ausgangsposition verschoben, damit sie nicht irgendwann ausserhalb des Objektes sind).
Doch bei AlingToVector ergibt sich ein Problem, und zwar weiss ich net wie ich den Vektor zwischen den Punkten ausrechne.
Vektorrechnung hatten wir in der Schule noch nicht, hab´ mir aber einiges selbst beigebracht, doch hier haperts...

lange Rede kurzer sinn, damit ihr euch das besser vorstellen könnt, hier der Code:



Code: [AUSKLAPPEN]

Init_Graphics()

Const k_W = 1
Const k_G = 2
Const K_GS= 3

Collisions k_g,k_w,2,1
Collisions K_GS,K_W,2,3
Collisions K_G,k_GS,2,3

Global Camera    = CreateCamera()
MoveEntity camera,0,5,-5
CameraRange camera,.1,1500
CameraClsColor camera,255,255,255

cub1 = CreateCube()
PositionEntity cub1,-3,3,9
ScaleEntity cub1,1,7,5
RotateEntity cub1,0,135,-45
EntityType cub1,k_w
EntityColor cub1,90,90,90

cub3 = CreateCube()
ScaleEntity cub3,7,7,1
PositionEntity cub3,9,3,9
EntityColor cub3,70,70,70
EntityType cub3,k_w
EntityRadius cub3,6,6
TurnEntity cub3,0,30,0


cub2 = CreatePlane()
PositionEntity cub2,0,-3,0
EntityType cub2,k_w
EntityColor cub2,80,80,80
EntityFX cub2,1

CreateLight()

Type gr_P
Field obj

Field x#, y#, z#
Field mx#, my#, mz#

Field time#
Field jump#
End Type

;sry, noch alter Code ^^
Global granate = CreateSphere()
ScaleEntity granate,.5,.5,.5
EntityColor granate,50,150,50
;EntityFX granate,1
HideEntity granate


Dim Point(7)
;0-Hinten,Links,Unten
;1-Hinten,Links,Oben
;2-Hinten,Rechts,Unten
;3-Hinten,Rechts,Oben
;4-Vorne,Links,Unten
;5-Vorne,Links,Oben
;6-Vorne,Rechts,Unten
;7-Vorne,Rechts,Oben

MovCube = CreateCube()
PositionEntity MovCube,13,2,1
ScaleEntity MovCube,2,2,2
EntityAlpha MovCube,.7
Point(0) = Add_Point(-1,-1,1,MovCube)
Point(1) = Add_Point(-1,1,1,MovCube)
Point(2) = Add_Point(1,-1,1,MovCube)
Point(3) = Add_Point(1,1,1,MovCube)
Point(4) = Add_Point(-1,-1,-1,MovCube)
Point(5) = Add_Point(-1,1,-1,MovCube)
Point(6) = Add_Point(1,-1,-1,MovCube)
Point(7) = Add_Point(1,1,-1,MovCube)


;-Hauptschleife-
While Not(KeyHit(1))

If KeyDown(205) Then TurnEntity camera,0,-1,0
If KeyDown(203) Then TurnEntity camera,0,1,0

If KeyDown(208) Then MoveEntity camera,0,0,-.3
If KeyDown(200) Then MoveEntity camera,0,0,.3







For g.gr_P = Each gr_P
Update_Points(g)
Next

;hier müsste das Objekt dann mit AlingToVector entsprechend ausgerichtet werden

For g.gr_P = Each gr_P
Repos_Points(g)
Next


UpdateWorld
RenderWorld
Color 0,0,0

Flip
Wend
End


Function Add_Point(x#, y#, z#, Parent)
g.gr_P = New gr_P
g\obj =  CopyEntity(granate)
EntityParent g\obj,Parent
PositionEntity g\obj,x#, y#, z#
g\x# = x#
g\y# = y#
g\z# = z#
g\time# = 1
g\jump# = .5

EntityType g\obj,k_g
EntityRadius g\obj,2,2

Return g\obj
End Function



Function Update_Points(g.gr_P)

For k=1 To CountCollisions(g\obj)
If GetEntityType(CollisionEntity(g\obj,k)) = k_w Then
   d#=-2.0*(g\mx*CollisionNX(g\obj,k) + g\my*CollisionNY(g\obj,k) + g\mz*CollisionNZ(g\obj,k))
   g\mx=(g\mx + d * CollisionNX(g\obj,k)) * g\jump;0.7
   g\my=(g\my + d * CollisionNY(g\obj,k)) * g\jump;0.7
   g\mz=(g\mz + d * CollisionNZ(g\obj,k)) * g\jump;0.7
End If
Next

TranslateEntity g\obj,g\mx#,g\my#,g\mz#


g\mx = g\mx * 0.98
g\my = (g\my - 0.02) * 0.98
g\mz = g\mz * 0.98

End Function


Function Repos_Points(g.gr_P,del=1)
If del = 0 Then
FreeEntity g\obj
Delete g
Else
PositionEntity g\obj,g\x#,g\y#,g\z#
End If
End Function


Function Init_Graphics()
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
HidePointer()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
End Function


Danke!
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif
 

coldie

BeitragDo, Feb 22, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenns dir nur um den Vektor geht:

Ziehe von den Koordinaten von Punkt A die Koordinaten von Punkt B ab, und du erhälst den Vektor von A zu B.

Wenn mich nicht alles Täuscht solltest du den Vektor auch mit dem Befehl TformPoint ausrechnen können.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 22, 2007 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier https://www.blitzforum.de/foru...hp?t=20596 findest du genau das gleiche schonmal. Allerdings habe ich genau das gleiche Problem gehabt, und es erstmal durch ein workaround gelöst. Es geht aber mit TFormNormal auszurechnen. Ist aber in meinem Beispiel noch nicht eingebaut.

Black Spider

BeitragSo, Feb 25, 2007 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
so, erstmal Danke für die Antworten.

In deinem Code, hectic, weiss ich net so wirklich wo das Fahrzeug an den Punkten angepasst wird,
und mein kram mit AlingToVector hat auch nicht so wirklich geklappt...
Weil ich den kram aber sowiso nur für Kisten brauche, könnte ich es doch auch per VertexCoords machen;
funktioniert sogar einigermaßen!
das Problem ist jetzt folgendes: Die Points rutschen aus ihrer Position raus, und wenn ich sie wieder richtig Re-Positionieren will, dann springen sie nicht mehr, und die ganze Kiste bleibt starr.
Wie bekomme ich das hin, die Points miteinander zu verbinden, als ob da Stangen zwischen wären?

neuer Code:
Code: [AUSKLAPPEN]

Init_Graphics()

Const k_W = 1
Const k_G = 2
Const K_GS= 3

Collisions k_g,k_w,2,3
Collisions K_GS,K_W,2,3
Collisions K_G,k_GS,2,3

Global Camera    = CreateCamera()
MoveEntity camera,0,5,-5
CameraRange camera,.1,1500
CameraClsColor camera,255,255,255

cub1 = CreateCube()
PositionEntity cub1,-3,3,9
ScaleEntity cub1,1,7,5
RotateEntity cub1,0,0,-45
EntityType cub1,k_w
EntityColor cub1,90,90,90




cub2 = CreatePlane()
PositionEntity cub2,0,-3,0
EntityType cub2,k_w
EntityColor cub2,80,80,80
EntityFX cub2,1

CreateLight()

Type gr_P
Field obj

Field x#
Field y#
Field z#
Field mx#, my#, mz#

Field time#
Field jump#
End Type


Global granate = CreateSphere()
ScaleEntity granate,.5,.5,.5
EntityColor granate,50,150,50
HideEntity granate


Dim Point(7)
;0-Hinten,Links,Unten
;1-Hinten,Links,Oben
;2-Hinten,Rechts,Unten
;3-Hinten,Rechts,Oben
;4-Vorne,Links,Unten
;5-Vorne,Links,Oben
;6-Vorne,Rechts,Unten
;7-Vorne,Rechts,Oben

MovCube = CreateMesh();Cube()
MSurf = CreateSurface(MovCube)
PositionEntity MovCube,-3,20,8;,13,2,1
;ScaleEntity MovCube,2,2,2
EntityAlpha MovCube,.7
EntityType MovCube,K_GS
EntityRadius MovCube,2,2

Point(0) = Add_Point(-1,-1,1,MovCube)
Point(1) = Add_Point(-1,1,1,MovCube)
Point(2) = Add_Point(1,-1,1,MovCube)
Point(3) = Add_Point(1,1,1,MovCube)
Point(4) = Add_Point(-1,-1,-1,MovCube)
Point(5) = Add_Point(-1,1,-1,MovCube)
Point(6) = Add_Point(1,-1,-1,MovCube)
Point(7) = Add_Point(1,1,-1,MovCube)


i = AddVertex(MSurf,-1,-1,1);0
AddVertex(MSurf,-1,1,1)      ;1
AddVertex(MSurf,1,-1,1)      ;2
AddVertex(MSurf,1,1,1)      ;3
AddVertex(MSurf,-1,-1,-1)   ;4
AddVertex(MSurf,-1,1,-1)   ;5
AddVertex(MSurf,1,-1,-1)   ;6
AddVertex(MSurf,1,1,-1)      ;7

;Vorne
AddTriangle MSurf,i+4,i+5,i+6
AddTriangle MSurf,i+6,i+5,i+7
;Hinten
AddTriangle MSurf,i,i+2,i+1
AddTriangle MSurf,i+2,i+3,i+1
;Links
AddTriangle MSurf,i,i+1,i+4
AddTriangle MSurf,i+4,i+1,i+5
;Rechts
AddTriangle MSurf,i+6,i+7,i+2
AddTriangle MSurf,i+2,i+7,i+3
;Oben
AddTriangle MSurf,i+5,i+1,i+7
AddTriangle MSurf,i+7,i+1,i+3
;Unten
AddTriangle MSurf,i,i+6,i+2
AddTriangle MSurf,i+6,i,i+4


While Not(KeyHit(1))

If KeyDown(205) Then TurnEntity camera,0,-1,0
If KeyDown(203) Then TurnEntity camera,0,1,0

If KeyDown(208) Then MoveEntity camera,0,0,-.3
If KeyDown(200) Then MoveEntity camera,0,0,.3


If KeyDown(2) Then Jump# = Jump# + .01
If KeyDown(3) Then JUMP# = JUMP# - .01

If KeyDown(4) Then TIME# = TIME# + .1
If KeyDown(5) Then TIME# = TIME# - .1

If KeyDown(6) Then WUMMS# = WUMMS# + .1
If KeyDown(7) Then WUMMS# = WUMMS# - .1





For g.gr_P = Each gr_P
Update_Points(g)
Next

TranslateEntity MovCube,0,-.2,0

If KeyDown(17) Then TranslateEntity MovCube,0,0,.2
If KeyDown(57) Then TranslateEntity MovCube,0,.3,0
If KeyDown(31) Then TranslateEntity MovCube,0,0,-.2
If KeyDown(30) Then TranslateEntity MovCube,-.2,0,0
If KeyDown(32) Then TranslateEntity MovCube,.2,0,0

EntityColor Point(2),255,0,0
EntityColor Point(6),255,0,0
EntityColor Point(0),255,0,0
EntityColor Point(4),255,0,0

For I = 0 To CountVertices(Msurf)-1
VertexCoords Msurf,I,EntityX(Point(i)),EntityY(Point(i)),EntityZ(Point(i))
Next


For g.gr_P = Each gr_P
Repos_Points(g)
Next


UpdateWorld
RenderWorld
Color 0,0,0
Text 0,0,"Sprunghöhe: " + JUMP#
Text 0,20,"Timer: " + TIME#
Text 0,40,"Wumms: " + WUMMS#
Flip
Wend
End


Function Add_Point(x#, y#, z#, Parent)
g.gr_P = New gr_P
g\obj =  CopyEntity(granate)
EntityParent g\obj,Parent
PositionEntity g\obj,x#, y#, z#
g\x# = x#
g\y# = y#
g\z# = z#
g\time# = 1;TIME#
g\jump# = .39;JUMP#

EntityType g\obj,k_g
EntityRadius g\obj,.5,.5

;g\mx#=Sin( -EntityYaw  (camera) ) * WUMMS;1.5
;g\my#=Sin( -EntityPitch(camera) ) *   WUMMS;1.5
;g\mz#=Cos( -EntityYaw  (camera) ) * WUMMS;1.5
Return g\obj
End Function



Function Update_Points(g.gr_P)

For k=1 To CountCollisions(g\obj)
If GetEntityType(CollisionEntity(g\obj,k)) = k_w Then
   d#=-2*(g\mx*CollisionNX(g\obj,k) + g\my*CollisionNY(g\obj,k) + g\mz*CollisionNZ(g\obj,k))
   g\mx=(g\mx + d * CollisionNX(g\obj,k)) * g\jump;0.7
   g\my=(g\my + d * CollisionNY(g\obj,k)) * g\jump;0.7
   g\mz=(g\mz + d * CollisionNZ(g\obj,k)) * g\jump;0.7
End If
Next

TranslateEntity g\obj,g\mx#,g\my#,g\mz#


g\mx = g\mx * 0.98
g\my = (g\my - 0.02) * 0.98
g\mz = g\mz * 0.98

End Function


Function Repos_Points(g.gr_P,del=1)
If del = 0 Then
FreeEntity g\obj
Delete g
Else

PositionEntity g\obj,g\x#,g\y#,g\z#


End If
End Function


Function Init_Graphics()
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
HidePointer()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
End Function
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group