Witam. Stawiam właśnie pierwsze kroki w używaniu silników fizycznych, wybór padł na ODE. Już mam za sobą tutoriale i chciałem napisać "symulację" dostosowaną do potrzeb mojego projektu, aby później to co napiszę odpowiednio wdrożyć w projekt.
Mam już tworzenie i rysowanie obiektów oraz wykrywanie i obsługę kolizji. Na chwilę obecną już sporo przykładów do ODE przeglądnąłem, ale nie mogłem znaleźć rozwiązania. Chodzi o to, że chcę aby rotacja box'a po odbiciu od przeszkody była cały czas zgodna z jego kierunkiem lotu. W chwili obecnej mój przykład jest wykonany w ten sposób, że box leci z pewnej pozycji pod kątem 45 stopni w przeszkodę. Fragmenty tworzenia obiektu:
self.odeBody2 = ode.Body(self.odeWorld) # blaster
angle=135.0
ca = math.cos (math.radians(angle))
sa = math.sin (math.radians(angle))
self.odeBody2.setRotation([ca, -sa, 0.0,
sa, ca, 0.0,
0.0, 0.0, 1.0])
#...
self.odeBody2.setPosition( (4,4,0) )
self.odeBody2.setForce( (-50,-50,0) )
Grawitacja jest ustawiona na 0.0 bo można przyjąć, że na promienie blastera nie działa grawitacja.
Jak blaster leci na takim ustawieniu (kod i screen 1 - załącznik) to po odbiciu (screen 2 - załącznik) obraca się tak jak mu się podoba zgodnie z ustawionymi parametrami fizycznymi.
Kolizję obsługuję raczej w dość standardowy dla ODE sposób:
contacts = ode.collide(self.odeGeom1, self.odeGeom2)
for contact in contacts:
contact.setBounce(4.0)
contact.setMu(0)
contact.setMu2(0)
j = ode.ContactJoint(self.odeWorld, self.odeContactGroup,contact=contact)
j.attach(None, self.odeGeom2.getBody()) #None bo nie chcemy aby na miecz sie odbijal od blastera
Jak zrobić to co napisałem w jakiś sposób aby ODE za mnie wykonał brudną robotę z tym obrotem, da się :) ?
Mieczem świetlnym poruszam myszą ( http://www.gamedev.pl/screens.php?x=view&id=7811 ), strzał z blastera mogę odbić z każdej strony, więc potrzebuję dokładną kolizję z blaster'em, mieczem można wykonywać ruchy i obracać go (do obrotów użyję setAngularVel(), żeby obrót miał wpływ na kierunek lotu odbitego wystrzału).