Physikengine
Übersicht

![]() |
Black SpiderBetreff: Physikengine |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group