Hi also habe mir gestern und heut dann ein wenig ODE angesehen und scheinbar ist esfür meine Zwecke genau das richtige.
Also habe ich mich ein wenig in die Abläufe von ODE eingelesen und gleich versucht etwas umzusetzen...
leider wieder ohne großen Erfolg.
Ich habe 2. Modelle eines für den Boden und eines für ne Kiste...
Diese lade ich normal und platziere Sie so das die Kiste über dem Boden positioniert ist.
dann natürlich noch das aus ODE
Code:
world = Tao.Ode.Ode.dWorldCreate
space = Tao.Ode.Ode.dSimpleSpaceCreate(0)
Tao.Ode.Ode.dWorldSetGravity(world, 0, -0.01, 0)
Tao.Ode.Ode.dWorldSetERP(world, 0.2)
Tao.Ode.Ode.dWorldSetContactMaxCorrectingVel(world, 0.9)
Tao.Ode.Ode.dWorldSetContactSurfaceLayer(world, 0.001)
Tao.Ode.Ode.dWorldSetAutoDisableFlag(world, 1)
contactgroup = Ode.dJointGroupCreate(1000000) ' Habe ich so aus einem Tutorial übernommen.
' Fuer den Cube
body = Tao.Ode.Ode.dBodyCreate(world)
Tao.Ode.Ode.dBodySetPosition(body, 0, 200, 500) 'ist genau die Position des Irrlicht Nodes
Tao.Ode.Ode.dBodySetLinearVel(body, 0, 0, 0)
Dim matrix As New Tao.Ode.Ode.dMatrix3
Tao.Ode.Ode.dRFromAxisAndAngle(matrix, _
Ode.dRandReal * 2.0 - 1.0, _
Ode.dRandReal * 2.0 - 1.0, _
Ode.dRandReal * 2.0 - 1.0, _
Ode.dRandReal * 10.0 - 5.0)
Ode.dBodySetRotation(body, matrix)
Dim mass As New Ode.dMass(50, Nothing, Nothing)
Ode.dBodySetMass(body, mass)
Dim min As IrrlichtNETCP.Vector3D = cube.BoundingBox.MinEdge
Dim max As IrrlichtNETCP.Vector3D = cube.BoundingBox.MaxEdge
Dim sizeX As Single = max.X - min.X
Dim sizeY As Single = max.Y - min.Y
Dim sizeZ As Single = max.Z - min.Z
geom = Ode.dCreateBox(space, sizeX, sizeY, sizeZ)
Ode.dGeomSetBody(geom, body)
Und hier für den Boden
Code:
'Boden
Dim Bmin As IrrlichtNETCP.Vector3D = boden.BoundingBox.MinEdge
Dim Bmax As IrrlichtNETCP.Vector3D = boden.BoundingBox.MaxEdge
Dim BsizeX As Single = Bmax.X - Bmin.X
Dim BsizeY As Single = Bmax.Y - Bmin.Y
Dim BsizeZ As Single = Bmax.Z - Bmin.Z
body2 = Tao.Ode.Ode.dBodyCreate(world)
Tao.Ode.Ode.dBodySetPosition(body2, 0, -200, 500)
geom2 = Ode.dCreateBox(space, BsizeX, BsizeY, BsizeZ)
Ode.dGeomSetBody(geom2, body2)
Und dann habe ich dies in meiner Renderschleife stehen... vor DrawALL
Code:
engine.VideoDriver.BeginScene(True, True, New IrrlichtNETCP.Color(255, 0, 0, 0))
Ode.dSpaceCollide(space, 0, call_back)
Ode.dWorldQuickStep(world, 0.05)
Ode.dJointGroupEmpty(contactgroup)
tmppos = Ode.dGeomGetPosition(geom)
cube.Position = New IrrlichtNETCP.Vector3D(tmppos.X, tmppos.Y, tmppos.Z)
Und mein Callback
Code:
Public Sub Callback(ByVal data As System.IntPtr, ByVal o1 As System.IntPtr, ByVal o2 As System.IntPtr)
Dim i As Integer
Dim b1 As IntPtr = Ode.dGeomGetBody(o1)
Dim b2 As IntPtr = Ode.dGeomGetBody(o2)
Const N As Integer = 10
Dim contact(N) As Ode.dContact
Dim contactGeom(contact.Length) As Ode.dContactGeom
Dim numContacts = Ode.dCollide(o1, o2, contactGeom.Length, contactGeom, System.Runtime.InteropServices.Marshal.SizeOf(contactGeom(0)))
If numContacts > 0 Then
'MsgBox(numContacts)
For i = 0 To numContacts
MsgBox("Contact")
contact(i).surface.mode = Ode.dContactFlags.dContactBounce
contact(i).surface.mu = 0.8
contact(i).surface.mu2 = 0
contact(i).surface.bounce = 1.0
contact(i).surface.bounce_vel = 0.9F
'contact(i).surface.soft_erp = 1
'contact(i).surface.soft_cfm = 0.9F
Dim c As IntPtr = Ode.dJointCreateContact(world, contactgroup, contact(i))
Ode.dJointAttach(c, b1, b2)
Next
End If
End Sub
So wenn ich dies dann laufen lasse fällt die Box auch normal nach unten... Kollidiert aber nicht mit dem Boden ...
Wenn ich mit ode eine Bodenplain erstelle so kommt eine Kollision zustande.. aber meine Box verschwindet dann einfach
Habe mir mal beim rendern den Inhalt von tmppos (die position des Cubes) ausgeben lassen und festgestellt das bei einer Kollision dann nichtsmehr übertragen wird.
Hmm Hoffe jemand kann sich den Code mal ansehen und mir sagen was ich genau falsch mache...
Ps. ich Weis der der Code ist etwas dumm zusammengestellt (mit neue Vectoren in der Schleife erstellen usw...) aber ich wollte erstmal das es funktioniert bevor ich das alles auf Leistung umschreibe
Schönen Tag noch
Gruß
SAS