Autor Wątek: [ODE] Box zawsze zwrócony w kierunku ruchu  (Przeczytany 670 razy)

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Listopad 16, 2010, 02:50:41
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) to po odbiciu (screen 2) 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ę :) ?
« Ostatnia zmiana: Listopad 16, 2010, 02:52:59 wysłana przez JasonVoorhees »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline owyn

  • Użytkownik

# Listopad 16, 2010, 10:31:27
A nie prościej zrobić to na poziomie grafiki? Tzn. na przykład w silniku fizycznym symulować pocisk z blastera jako małą kulkę, a w silniku graficznym rysować boxa zawsze skierowanego w kierunku poruszania się?

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Listopad 16, 2010, 12:00:01
Jak dla mnie to raczej tak nie będzie prościej i w ogóle nie będzie działało tak jak chciałem. Mieczem świetlnym poruszam myszą ( http://www.warsztat.gd/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). Gdybym miał zrobić blaster jako małą kulkę to bym musiał dla tego blastera do narysowania ciągle wyliczać kąt, no i kolizja by szwankowała. Tak więc wolałbym aby symulacja się opierała tylko na ODE. Przecież jak ludzie tworzą jakieś np. samonaprowadzające się rakiety to muszą to jakoś uwzględnić w silniku fizycznym ;)
« Ostatnia zmiana: Listopad 16, 2010, 12:04:56 wysłana przez JasonVoorhees »