Autor Wątek: Ruch Wahadłowy/Sprężynki  (Przeczytany 2386 razy)

Offline Vizzzard

  • Użytkownik

# Sierpień 04, 2007, 17:24:52
Witam i prosze o pomoc :)

wie ktos moze jak uzyskac w symualcji 2D ruch wachadłowy kuli? Poniewarz owszem znajdowałem róznorakie wzrory i przeliczenia na ten temat, ale niebardzo wiem jak przystosowac tez wrozy do koordynatów X i Y. Lub tez znajdowałem kody które nie działały jak powinny albo były głupie :D.

oczywiscie napisałem troche kodu na ten temat ale nie działa jak powinien a mianowicie wcale nie działa:
mBall[1].VecX = 0; //wektor kierunku x
mBall[1].VecY = 0; // j.w y
mBall[1].x = 0; //x
mBall[1].y = 0; //y

    if (vars[0] > M_PI) //vars[0] = PI/4
      vars[0] = vars[0] - 2*M_PI*floor(vars[0]/M_PI);
    else if (vars[0] < -M_PI)
      vars[0] = vars[0] - 2*M_PI*ceil(vars[0]/M_PI);

    // set the position of the pendulum according to the angle
    double len = 30;
    double w = 9/2; //promien / 2
    mBall[1].x = len*sin(vars[0]) - w;
    mBall[1].y = len*cos(vars[0]) - w;

jak widac kod jest troszke bezsensu lecz niewiem co zrobic zeby smigało

moze wie ktos jak to powinno sie robic lub poda jakis w miare jasny i działajacy kod :)

Pozdrawiam

Offline Mr. Spam

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

Offline ziomber

  • Użytkownik

  • Zbanowany
# Sierpień 04, 2007, 17:45:40
no to patrz
sinus i cosinus


mamy środek czyli punkt zaczepienia, zakładam że linka jest sztywna i nie ugina się.

dalej

kąt 0 stopni to poziom -------------------------------

90 to pion nie wiem w którą stronę ale chyba w prawo czyli w dół
|
|
|
|



to mamy już punkt na samym dole chyba najwieksza jak pamietam energia kinetyczna\

teraz  wystarczy wybrać sobie maksymalny kat odchylenia od tych 90 stopni powiedzmy że nie używamy żadnych danych do symulacji i ten kąt to 45 stopni


wiadomym będzie, że jak np. poruszamy sie od lewej do prawej to początkowym kątem będzie 135 który będzie się obniżał do 90-max_kat_wychylenia = 45

po tym kącie powinno się zmienić kierunek ruchu kuli na -1 (przemnożyć), adekwatnie do tej strony robimy to samo ze stroną z prawej do lewej, ale pozostaje problem przemieszczania sie kuli z pewną prędkością żeby hamowała do 0 m/s przy kącie 45 i 135

nie bede tego rozpisywał bo sam na ślepo to tłumacze ale można uzależnić prędkość kuli od 'odległości kątów', gdy kąt będzie równy 90 stopni trzeba będzie naszej zmiennaej nadać wartość 1, czyli i nie wiem jak to uogólnić w tym przykładzie ale:

będą dwa warunki jak kula znajduje sie po lewej i jak w prawej żeby obliczenia działały

no i tutaj mi myslenie zawodzi bo: wiem że 90-aktualny_kat jest złe ponieważ przydało by się to odwrócić aby ta stała nam zmniejszała prędkość w zależności od tego jak blisko jesteśmy kąta maksymalnego a gdy aktualny kąt = 90 to wtedy ta stała przyjmuje wartość 1

Offline Vizzzard

  • Użytkownik

# Sierpień 04, 2007, 17:54:54
ciekawy kocept, wszedzie gdzie patrzyłem uwzgledniane było theta, i niby powinno działac ale nie działało co do samego teamtu to moze nie koniecznie chodzi mi o wachadła a bardzie o cos co w silnikach fizycznych nazywa sie joint (połączenia linowe, ale mysle ze wachadła tez do nich naleza.

znalazłem tez takie coś: http://www.digilutionary.com/?p=28 Probowałem to zaimplementwac lecz bez skutku. Troszke brak mi pomysłów jak to zrobic poprawnie fizycznie  :-\

z tego co mnie sie wydaje to połozenie x i y powinno byc pozycja startową kuli a reszta powinna być wyliczana z ich wektorów prędkosci Vx i Vy tak zeby te wektory po przeliczeniach dawały kierunek wachadłowy. Lecz narazie sposob poprawnej implementacji to czarna magia.

 ???plz help :)

gskupien

  • Gość
# Sierpień 04, 2007, 18:42:55
Ustal warunki poczatkowe a w petli obliczaj:

r - dlugosc nitki.
dt=0.01 // okres pomiedzy kolejnymi klatkami animacji
g=9.8 // przyspiesznie ziemskie
omega=0.0 // poczatkowa predkosc katowa
theta=4.0 // odchylenie, czyli troche ponad PI

omega += (g/r)*sin(theta)*dt;
theta += omega*dt;
x = r*sin(theta);
y = r*cos(theta);

//EDIT: opisalem zmienne, to rozwiazanie korzysta z metody eulera, ktora w tym przypadku wystarcza.
« Ostatnia zmiana: Sierpień 04, 2007, 19:51:42 wysłana przez Grzesiek »

Offline Vizzzard

  • Użytkownik

# Sierpień 04, 2007, 18:50:50
w kwesti wyjasnienia w razie czego:

omega = ? czy poprostu podaj jakas wartosc kąta i nie liczyc go
theta = ? j.w o ile pamietam theta = atan2(x,y) ? policzyc czy podac wartosc?
dt = Delta czas = delta czas + (czas który minoł - ostatni czas) (w swoim silniku wogole nie uzwgledniam zmian czasu bo petla update działa 1/100) wiec moze dt ustawie poprostu jako 1?

x i y to juz na 100% wiadomo :)

oczywiscie sprawdze, moze dam screeny i prosze o odp :)


Offline Vizzzard

  • Użytkownik

# Sierpień 04, 2007, 20:23:31
ok wiec wzglednie chodzi :) dzieki bardzo

tylko teraz tak to wachadło wogole nie wychamowuje, i tak sobie mysle ze skoro mam w swoim silniku rozne masy kul to ruch wachadłowy tez jest jakos zalezny od masy kuli która jest doczepiona do linki, i wieksza masa tym szybsza predkosc chamowania (chyba)

i jeszcze mam pytanie, bo obecnie poruszamy to o x i y a ze ja do poruszania obiektów uzywam ich wektorów predkosci x i y to moze by to z tym zintegrowac?

aaa no i jak by mozna to zrobic ze przy kolizji z innym obiektem (kulą) nasza kulka na lince poruszajaca sie wachadłowo odskoczy itp tzn chodzi mi o elastyczną line. przykład z zycia to kulka na lince gdy ustawimy ją na poziomie 90stopni roznow z punktem linki to dostaniemy ruch wachadłowy ale jesli jednak ją udezymy to juz mamy zupełnie co innego

chodzi mi o taki ostateczny efekt :)

nie jestem pewnien czy przeliczenia wahadłowe woogle mi sie tu przydadza ale ktos moze wie jak doprowadzic do takiej potencjalnej symulacji jak opisałem :)

Offline ziomber

  • Użytkownik

  • Zbanowany
# Sierpień 05, 2007, 01:46:35
wez to ougólnij :D:D:D:D bo widzisz ja sie meczylem a i tak wyszlo ze nie tak jhak ja chcesz robic to wiec wiecej ino potrzebuje

Offline Vizzzard

  • Użytkownik

# Sierpień 05, 2007, 02:12:11
ok to juz uogulniam :)

chodzi mi o połączenia linowe, takie jakie wystepują w prawie kazdym silniku do fizyki, zakładamy sobie hak moze byc to inna kula lub cokolwiek ten obiekt trzyma nam line, podem do tej liny doczepiamy np kule i to autentycznie zachowuje sie jak kula na lince, ODE np wyróznia kilka rodzaow takich lin np sprezynowe (typowe spręzynki) liny twarde, giętkie, pekające itp, mnie puki co chodzi o prostą kulke na linie (proste to pojecie wzgledne)

z początku myslalem ze ruch wahadłowy załatwi mi sprawe, ale cos widze ze nie koniecznie, wszelkie wzory na wahadła z kodami uwzgledniaja x i y bili ja jednak potrzebował bym kontrolowac Vx i Vy bili bo obecnie moja kula na linjie poruszajaca sie ruchem wachadłowym nie działa na kolizje z innymi kulami a przy kolizji to własnie Vx i Vy są obliczane :). Kolejna sprawa to taka ze zdałem sobie sprawe ze uderzona kula na lince przez inny obiekt od spodu np to juz nie ruch wachadłowy a typowo linowy.

ciezko o jakies wzory a tym bardziej przeliczenia w x i y zeby dopasowac to do programu.

wpisywanie joint tutorial np owocuje tylko przykładami jak to w ODE zrobic.

wiec zna ktos moze kody lub cokolwiek dotyczacych połączeń linowych? Owszem znowu takowe występują w BOX 2D ale owszem jak zawsze nic z kodu nie rozumiem :D

z góry dzieki za wszelkie odpowiedzi :)

Offline Cytadela

  • Użytkownik
    • KacperDEV

# Sierpień 06, 2007, 04:06:30
Szukajcie a znajdziecie

Offline Vizzzard

  • Użytkownik

# Sierpień 06, 2007, 13:12:22
no faktycznie cos znalazłem, i chyba pozostane narazie przy implementacji sprężynki, pełna wypasiona lina z kulką zaczepioną u dołu wymaga naprawde niezłego zrozumienia tematu, ale w kazym razie robi sie je z lekko zmodyfikowanych sprężynek.

 :)

podam link, faktycznie wygląda to zabujczo http://www.gamasutra.com/features/20011005/oliveira_02.htm bede z siebie dumny jak to zrobie haha :D:D:D

Offline Spider100

  • Moderator
    • Strona domowa

# Sierpień 06, 2007, 15:17:16
Witam!

Cytuj
wiec zna ktos moze kody lub cokolwiek dotyczacych połączeń linowych? Owszem znowu takowe występują w BOX 2D ale owszem jak zawsze nic z kodu nie rozumiem
Gdzie spotkałeś się z terminem 'połaczenie liniowe' ? Wydaje mi się że chodzi Ci o znane z silników 'joint'

Masz już napisane coś do obsługi ciał sztywnych ? bo inaczej będzie trudno.

Kiedyś chciałem napisać na ten temat artykuł i jest nawet zaczątek więc pozwolę sobie wkleić ten kawałek:

Co to są stawy ?
Połączenie dwóch obiektów mające na celu ograniczenie ruchu jednego z nich względem drugiego nazywamy stawem (joint). Nie ma jednak konieczności łączenia dwóch obiektów typu rigid body (musi być przynajmniej jeden), dzięki czemu stawy mogą być wykorzystywane w animacji poprzez doczepienie swobodnego obiektu fizycznego do kości. Jednak takie połączenia powodujące przymocowanie ciał nie jest całkowicie dokładne i mogą pojawiać się pewnego rodzaju uszczerbki przy wykonywaniu ruchu gdyż trudno zachować względność, jeśli jedno z ciał nagle zmienia swoją orientacje oraz prędkość. Dlatego lepiej łączyć dwa ciała geometryczne.
W silniku fizycznym mamy tak naprawdę odczynienia z tylko jednym typem stawów tzw. Stawem kulistym (Ball joint) ,a reszta typów opiera się na tym jednym podstawowym np. (Staw Brzegowy)Revolute Joint to zestawienie dwóch Ball joint na końcach osi. Typy jointów wyróżnione są za pomocą stopni swobody (Degrees of freedom)  które to pozwalają na niezależny ruch

Klasyfikacja stawów jaką stworzyłem na podstawie obserwacji tego co się dzieje w innych silnikach min ODE:
Symbol   Nazwa   Typ   Opis   DOF(Degrees of freedom (Stopnie swobody))
R   Fixed   Holding joints   Stałe połączenie    0
R   Hinge   Revolute joints   Obrót wokół jednej osi   1
P   Slider   Prismatic joints   Przesunięcie wzdłuż jednej osi   1
H   Screw   Helical joinst   Ruch śrubowy i spiralny   1
C   Hybrid(Whell)   Cylindrical joinst   Obrót i Przesunięcie jednocześnie   2
S   Universal   Spherical joints   Kula i panewka   3
R   Hinge2   Spherical joints   Obrót wokół dwóch osi   2
sN   Normal Spring   Spring force   Połaczenie sprężyste   3
sA   Axis Spring   Spring force   Połączenie sprężyste do wyrównania osią   3

Ok to koniec ogólnego opisu :) Spotkałem się jeszcze z distance joints i paroma innymi ale wszystko można napisać rozumiejąc podstawową ideę.

Jak stworzyć połączenia stawowe ? Doszukałem się dwóch dobrych rozwiązań:

1. BOX 2D - podejście jest o tyle dobre że dla dwóch obiektów połączonych stawem wystarczy jedna iteracja by wszystko działało i wyglądało jak należy.  jeśli nie rozumiesz tego kodu to postaraj się poukładać to co w nim jest bo twórca nie zadbał do końca o czytelność ale można... Druga sprawa ja tu kiedyś dałem tego linka do demka ale tak na prawdę powinienem odesłać do innego forum na którym sam twórca się wypowiada i można zadawać mu konkretne pytania tyle ze w języku angielskim: http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=273

2. jiggle - Rozwiązanie wymagające kilku iteracji nawet dla dwóch obiektów, ale także pozwala stworzyć ragdolla i inne podobne efekty. Link do całego silnika fizycznego wraz ze źródłami http://www.rowlhouse.co.uk/jiggle/
Polega na zmiennie prędkości punktów zaczepienia (nadanie impulsu w ich miejscach) dla obu ciał. Impulsy te liczone są z masy, momentu obrotowego ciał, prędkości względnej dla punktów zaczepienia oraz odchylenia tych punktów (dla redukcji błedu). Odpowiednie wzory sa w kodzie...
 
Obydwa typy połączeń stawowych zaimplementowałem w swoim silniku fizycznym i działają znakomicie więc warto się zainteresować.

Mam nadzieję że w jakiś sposób pomogłem co prawda nie jest to cały artykuł bo nie miałem czasu go napisać ale zawsze coś.
Pozdrawiam!

Offline Vizzzard

  • Użytkownik

# Sierpień 06, 2007, 15:34:22
Cytuj
Masz już napisane coś do obsługi ciał sztywnych ? bo inaczej będzie trudno.

zalezy jak to rozumiec?, jesli chodzi ci o fizyke kuli z kulą + rozwiązaywanie kolizji miedzy nimi i wszelkie podstawowe prawa jak grawitacja, tarcie, odbijalonsc itp to mam (+funkcja na ruch wachadłowy kuli na lice :D)

Rzeczywiscie racja chodzi mi tu o stawy, nie wiedziałem jak joint przełozyć na polski tak zeby znaczyło to własnie co przytoczyłeś. Oczywiście zajrze w kody jeszcze raz i wszystko po kolei przejrze, bo naprawde zalezy mi na impelentacji stawów chociazby podstawowych, bo daja nieocenione mozliwosci.

czyli własciwie narazie udało mi sie zaimplemntowac staw spiralny lub wahadłowy jak kto chce, lecz pewnie co do saej implementacji stawu wg poprawnych technik zupełnie inaczej sie to robi.

ps. wielka szkoda ze nie dokonczyłes Artykułu, w polskim internecie przydało by sie troche wiecej artów o fizyce 2d i 3d bo jest tego mało naprawde :)

dzieki za odp :)

btw. mozna zobaczyc gdzies twój silnik 2D w akcji?? bo ciekaw go bardzo jestem
« Ostatnia zmiana: Sierpień 06, 2007, 15:37:56 wysłana przez Vizzzard »

Offline Spider100

  • Moderator
    • Strona domowa

# Sierpień 06, 2007, 18:22:27
Cytuj
Masz już napisane coś do obsługi ciał sztywnych ? bo inaczej będzie trudno.

zalezy jak to rozumiec?, jesli chodzi ci o fizyke kuli z kulą + rozwiązaywanie kolizji miedzy nimi i wszelkie podstawowe prawa jak grawitacja, tarcie, odbijalonsc itp to mam (+funkcja na ruch wachadłowy kuli na lice :D)

Pytałem tylko czy masz coś odpowiedzialnego za ruch obiektu liniowy, obrotowy, dodawanie impulsów w punkcie,
Hmm szczerze to budowanie silnika fizycznego opierając się na kulkach może wyjść Ci niedługo bokiem. Na początek polecam stworzyć obiekt półpłaszczyzny po za ktorą nie będzie mogło nic wyjść niech to będzie podłoże drugi obiekt to kwadrat kolizje tych dwóch obiektów jest bardzo łatwo wykryć teraz wystarczy rzucić kwadrat z wysokości i patrzeć czy zachowuje sie poprawnie wtedy będziesz mógł napisać czy masz coś odpowiedzialnego za ciała sztywne :)

Cytuj
ps. wielka szkoda ze nie dokonczyłes Artykułu, w polskim internecie przydało by sie troche wiecej artów o fizyce 2d i 3d bo jest tego mało naprawde
Tak też bywa wiele rzeczy bym chciał napisać a nie mam kiedy bo czas zarabiać.

Cytuj
btw. mozna zobaczyc gdzies twój silnik 2D w akcji?? bo ciekaw go bardzo jestem
Cóż swego czasu (jakiś rok temu) dawałem na forum dema z silnika (PhyLum)  ale linki już nie są aktualne ... jak większość maniaków robie coś później o tym zapominam tak samo jest teraz został tylko silnik, a nic z testów :D

Offline Vizzzard

  • Użytkownik

# Sierpień 06, 2007, 22:37:49
Cytuj
Pytałem tylko czy masz coś odpowiedzialnego za ruch obiektu liniowy, obrotowy, dodawanie impulsów w punkcie,
Hmm szczerze to budowanie silnika fizycznego opierając się na kulkach może wyjść Ci niedługo bokiem. Na początek polecam stworzyć obiekt półpłaszczyzny po za ktorą nie będzie mogło nic wyjść niech to będzie podłoże drugi obiekt to kwadrat kolizje tych dwóch obiektów jest bardzo łatwo wykryć teraz wystarczy rzucić kwadrat z wysokości i patrzeć czy zachowuje sie poprawnie wtedy będziesz mógł napisać czy masz coś odpowiedzialnego za ciała sztywne


hehe no to juz od dawna mam, działa az miło, nie zaimplementowałem jeszcze kwadratów itp, bo musze poczytać o tym jak zrobic poprawną kolizje kuli z kwadratem i kwadrat z kwadratem, oczywiscie wiem o metodzie sat i metanet :D ale te wizualne lekcje do mnie nie przemawiaja pozatym, metoda cross przy kolizji kula kwadrat ponoć jest niezła. A co do kulek to juz mi bokiem wychodzi ciagle i ten sam stress test wiec niebawem bede musiał dodac nowe obiekty do kolidowania ze soba :D (zobacz moj poprzedni temat o odsuwaniu kuli od siebie tam są obrazki z mojego silnika :) )

z samymi kwadratami bedzie problem techniczny bo oczywisice o ile kulek nie trzeba obracac zeby otrzymać ten sam efekt co z obrotem to juz kwadraty wręcz trzeba, a framework z którego korzystam wywołuje obroty przez funckje gdzie trzeba podać kąt obrotu, i recznie w funkcji update doprowadzic do tego kata, ale na dłuższą mete nie powinno byc problemem :)

np Transform.Rotate(int angle) //wywolanie jakiejkolwiek rotacji

co do Phylum, to ja realizuje swój silnik z 2 powodów

1. Chce sie nauczyc podstaw fizyki i matematyki bo do dupy jestem z tego + naucze sie troche jezyka C++ bo tak to tylko w C# siedzialem a od niedawna poznaje C++.

2. ten silnik przyda mi sie jako silnik odłamkowy/fizyczny za pomoca którego zrealizuje niektóre efekty w grze którą równierz pisze :) (idnie game biznes)

Cytuj
Tak też bywa wiele rzeczy bym chciał napisać a nie mam kiedy bo czas zarabiać.

święta prawda. Może mnie sie uda stworzyć kilka dokumentacji które komus pomogą

Pozdrawiam