Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - taki_tam

Strony: [1] 2
1
Matematyka i fizyka / Odpowiedź kolizji ciał sztywnych
« dnia: Marzec 30, 2012, 17:14:31 »
Siema!
Długoo nie pisałem nic, co nie znaczy, że nie śledzę forum.
Na początku chciałbym wyrazić zadowolenie z nowego warsztatu 3.0, jak dla mnie świetny (poza paroma błędami, 1 ważny zamieściłem w bug-truckerze).

A teraz do rzeczy.

Ostatnio zacząłem pisać od nowa mój silnik fizyczny, tym razem prawdziwe ciała sztywne.
Poprzedni symulował ciała (nie tylko sztywne) typu "Verlet-based rigid body".
Zdecydowałem się na napisanie wszystkiego od nowa, tym razem wg. dokumentu Pana Chrisa Heckera, ponieważ pojawiły się problemy ze stabilnością i wydajnością przy ogromnej liczbie przeróżnych ciał(mimo podziału przestrzeni - tutaj jednak znaczenie na wydajność miał mój zabytkowy komputer na który jestem jeszcze skazany, podział przestrzeni działał sprawnie). Jednakże Verletowskie ciała sztywne/miękkie wymagają nieco więcej od procesora, a w zasadzie miękkie nie są mi do niczego potrzebne.

Odpowiedź kolizji na prędkość liniową wyglądają bez zarzutu, jednak z prędkością kątową są już jaja.
Na początek przedstawię mini schemat działania silnika:
1: sprawdzanie kolizji metodą SAT
- jeśli jest odsuwam ciała o MTD(jest znormalizowany więc mnożę go przez głębokość)
- liczę odpowiedź kolizji
2: liczenie prędkości
3: liczenie pozycji
4: pętla
5: render

Dla kolizji liczę dwa punkty kontaktu jeśli to możliwe(obliczenia działają bez zarzutu)

Teraz przedstawię równania, które biorą udział w odpowiedzi kolizji.

R1, R2 - wektor od punktu kontaktu do środka masy
VA, VB - wektor prędkości w punkcie kontaktu
VAB - Prędkość względna w punkcie kontaktu
N - wektor normalny kolizji
e - współczynnik restytucji <0, 1>
J - impuls

Teraz tak
R1 = contact.pos - bodyA.pos
R2 = contact.pos - bodyB.pos
VA = bodyA.vel + Cross(R1, bodyA.AngVel)
VB = bodyB.vel + Cross(R2, bodyB.AngVel)
VAB = VB - VA
VN = Dot(VAB, N)
J = (-(1.0 - e) * VN) / (Dot(N, N) * (bodyA.InvMass + bodyB.InvMass) + (Sqr(Dot(R1, N)) * bodyA.InvI) + (Sqr(Dot(R2, N)) * bodyB.InvI))

Nowe prędkości:
bodyA.vel = bodyA.vel + N * J / bodyA.InvMass
bodyA.AngVel = bodyA.AngVel + Dot(R1, N*J) / bodyA.InvI

bodyB.vel = bodyB.vel - N * J / bodyB.InvMass
bodyB.AngVel = bodyB.AngVel - Dot(R2, N*J) / bodyB.InvI

Objawy: Tak jak napisałem na początku, obliczenia dla prędkości liniowej wyglądają w porządku, jednak dla prędkości kątowej wygląda to tak, że ciało przewraca się cały czas z jednego boku na drugi i z powrotem.

Osobiści przez 2 noce przeglądałem źródła, czytałem dokument Heckera ale bez skutku decydując się na prośbę o pomoc na forum.

Edit: Oo, żeby nie lamić, zapomniałem pytania :P Co robię źle, czy moje obliczenia są poprawne?
Jeśli to konieczne mogę dodać RAR'a z demkiem.

Pozdrawiam! ;)

taki_tam

2
Matematyka i fizyka / Tarcie i restytucja.
« dnia: Lipiec 04, 2011, 15:02:19 »
Siema, dawno mnie nie było ;)

Napisana przeze mnie fizyka ciała sztywnego działała elegancko do czasu kiedy nie zaimplementowałem tarcia i restytucji. Nadmienię tutaj, że wykorzystałem tutaj integracje Verleta(ciała zbudowane z punktów materialnych połączone sztywnymi sprężynami). Napisze teraz bardziej ogólnie co się dzieje po kolei.
Sprawdzam czy Bounding-Box'y ciał nachodzą na siebie - jeśli tak sprawdzam kolizje SAT'em i jeśli kolizja zchodzi pobieram poszczególne informacje: Normalna kolizji, długość tego wektora, ściana jednego ciała, wierzchołek drugiego ciała. Przeszukując internet jak napisać odpowiedź kolizji dla takich ciał(gdyż nie jest to w zasadzie bryła sztywna i zasady dynamiki bryły sztywnej na nic się tu praktycznie nie zdadzą) znalazłem dobry artykuł na gamedev.net "A Verlet based approuch for 2D game physics". Jest tam wyjaśniona kwestia odpowiedzi kolizji w zrozumiały i klarowny sposób. Jedyny mankament jest taki, że koleś nie uwzględnił właściwości tarcia i restytucji tłumacząc sie, że to już nie będzie takie proste. I owszem dla ześlizgiwania się ciała(ściany) po wierzchołku drugiego ciała może i proste nie jest(nic mi do głowy nie przychodzi jak to zrobić) ale dla wierzchołków wydawało mi się to banalne do póki okazało się, że coś tu nie działa. Przytoczę tu kod procedurki odpowiedzialnej za odpowiedź kolizji wraz z komentarzami, a Wy jeśli możecie napiszcie czemu to nie działa(już pare dni mi to mamuci w głowie i kompletnie nie mam pojęcia dlaczego nie działa) i czy w zasadzie ma prawo działać ;)

//INFORMACJE O KOLIZJI
  TUnCollisionInfo2D = record
    sDepth: Single;
    vNormal: TV2D;

    xEdge: TUnConstraint2D;
    xParticle: TUnParticle2D;
  end;

//ODPOWIEDŹ KOLIZJI
procedure TUnPhysX2D.ProcessCollision();
var
  vCollisionVector: TV2D; 
  T, Lambda: Single;
  xPA, xPB: TUnParticle2D;
  sEdgeMass: Single;
  sInvCollisionMass: Single;
  sRatio1, sRatio2: Single;
  vVelocity, vVelT, vVelN: TV2D;
  sRestitution, sFriction: Single;
begin
  //Cząsteczki należące do krawędzi, na której jest kolizja (ciało 1)
  xPA:= TUnBody2D(m_xCollisionInfo.xEdge.Parent).Particle[m_xCollisionInfo.xEdge.ParticleA];
  xPB:= TUnBody2D(m_xCollisionInfo.xEdge.Parent).Particle[m_xCollisionInfo.xEdge.ParticleB];

  //Właściwości kolidującego ciała.
  sRestitution:= TUnBody2D(m_xCollisionInfo.xEdge.Parent).Restitution;
  sFriction:= TUnBody2D(m_xCollisionInfo.xEdge.Parent).Friction;

  //Wektor kolizji.
  vCollisionVector:= V2D_Scale(m_xCollisionInfo.vNormal, m_xCollisionInfo.sDepth);

  if Abs(xPA.Position.X - xPB.Position.X) > (xPA.Position.Y - xPB.Position.Y) then
   T:= (m_xCollisionInfo.xParticle.Position.X - vCollisionVector.X - xPA.Position.X) / (xPB.Position.X - xPA.Position.X)
  else
   T:= (m_xCollisionInfo.xParticle.Position.Y - vCollisionVector.Y - xPA.Position.Y) / (xPB.Position.Y - xPA.Position.Y);

  Lambda:= 1.0 / (T * T + (1.0 - T) * (1.0 - T));

  sEdgeMass:= T * xPB.Mass + (1.0 - T) * xPA.Mass;
  sInvCollisionMass:= 1.0 / (sEdgeMass + m_xCollisionInfo.xParticle.Mass);

  sRatio1:= m_xCollisionInfo.xParticle.Mass * sInvCollisionMass;
  sRatio2:= sEdgeMass * sInvCollisionMass;

  //Odpowiedź kolizji dla cząsteczek z krawędzi na której jest kolizją (ciało 1)
  if xPA.Active then
   xPA.Position:= V2D_Sub(xPA.Position, V2D_Scale(vCollisionVector, (1.0 - T) * sRatio1 * Lambda));
  if xPB.Active then
   xPB.Position:= V2D_Sub(xPB.Position, V2D_Scale(vCollisionVector, T * sRatio1 * Lambda));

  //Odpowiedź kolizji dla cząsteczki która koliduje z ciałem 1. (ciało 2)
  if m_xCollisionInfo.xParticle.Active then
   begin
     //najpierw odsuwam ją od ciała 1     
     m_xCollisionInfo.xParticle.Position:= V2D_Add(m_xCollisionInfo.xParticle.Position, V2D_Scale(vCollisionVector, sRatio2));

     //Tutaj liczę prędkość cząsteczki po kolizji uwzględniając tarcie i restytucję. Nie mam zielonego pojęcia dlaczego to nie działa.
     vVelN:= V2D_Scale(m_xCollisionInfo.vNormal, V2D_Dot(m_xCollisionInfo.vNormal, m_xCollisionInfo.xParticle.Velocity));
     vVelT:= V2D_Sub(m_xCollisionInfo.xParticle.Velocity, vVelN);
     vVelocity:= V2D_Add(V2D_Scale(vVelT, 1.0 - sFriction), V2D_Scale(vVelN, -sRestitution));

     m_xCollisionInfo.xParticle.Velocity:= vVelocity;
   end;
end;

Dodam też, że czasem przy kolizji (uwzględniając tarcie i restytucję) ciała potrafią zniknąć (pozycja w nieskończoność idzie).

Jeśli ktoś ma jakiś pomysł będę bardzo wdzięczny bo w sumie bez tego stoję w miejscu. Jeśli ktoś nie rozumie wzorów na prędkość wliczając restytucję i tarcie mogę podesłać kawałem objaśnienia wraz z rysunkiem.

Pozdrawiam!

3
Compo i bitwy / WSOC 2k9
« dnia: Czerwiec 13, 2009, 20:24:07 »
Elo! ;)

Odbywa się?

Pozdrawiam! ;)

4
Matematyka i fizyka / Symulacja śmigłowca 2D
« dnia: Marzec 23, 2009, 23:26:43 »
Yo! ; ) Dawno nie pisałem bo hasło mi znikło ;P

Napisałem sobie silnik ciał sztywnych 2D. Chcę symulować lot śmigłowca(podstawię za niego boxa AB w silniku fiz.)
I nie wiem do końca jak się za to zabrać. Mój schemat wygląda tak(jakby co to podajcie jakiś konkretniejszy, jak
Wy byście to zrobili bo to jedyne co mi do głowy przychodzi):
- strzałki góra/dół zmiana obrotów silnika wirnika głownego
- liczę sobie powierzchnie łopat wirnika, a z tego siłę ciągu.
- strzałki lewo/prawo zmieniam obrót ciała sztywnego(śmigłowca), tworzę macież 2x2 z orientacji ciała po czym
  mnożę wektor siły ciągu przez tą macierz i pięknie otrzymuje siłe którą przykładam do ciała.

Robiłem tak dla symulacji rakiety(w sumie lądownika, coś jak w grze Lander Reloaded <- polecam zwrócić uwagę ; ] )
i wyszło identycznie jak w wymienionej wyżej grze.

To jakby co to piszcie swoje pomysły. Chcę w miarę możliwości zachować duży realizm ale już bez przesady ;]

Pozdrawiam! ;)

Edit: Jak komuś się nie chce zasysać tej gry to moge dać demko z mojego silnika fizycznego z identycznym modelem symulacji.

5
Matematyka i fizyka / Odpowiedź kolizji.
« dnia: Październik 23, 2008, 19:47:46 »
Elo elo.

Pisze sobie nowy silnik fizyczny bo stary działa niezadowalająco. Wcześniej korzystałem z tutka "Advanced Character Physics".
Ale punkty materialne reprezentowałem jako sfery(koła). I teraz pisze dokładni to samo ale punkty materialne jako zwykłe punkty(bez rozmiaru).
No i tak, kolizje chce wykrywać techniką SAT(chyba że polecicie coś innego). Tyle że mam z tym dwa problemy. Ciało zbudowane jest
z 4 punktów w sposób:

np.:
TCialo = class
 V1,
 V2,
 V3,
 V4: TMaterialPoint;
 ...
end;

A punkty materialne jako:

np:

TMaterialPoint = class
 Pos: TVector2D;
 ...
end;

No więc znajdę kolizję, dowiem się gdzie leży punkt kolizji i co powinienem był zrobić z wierzchołkami(punktami materialnymi) żeby ciało poruszało się(odbiło się) realistycznie?

Pozdrawiam! ;)

6
Matematyka i fizyka / Kolizje szybko poruszających się obiektów.
« dnia: Czerwiec 24, 2008, 18:44:45 »
Siemka! ;)

Słowem wstępu. Robię swego rodzaju strzelankę. Pocisk to punkt materialny.
Używam integracji Verleta.

Sprawa jest dla mnie dość ciężka, bo pociski z reguły przemieszczają się bardzo szybko.

W jaki sposób wykrywać kolizje pocisku z graczem? Jak rozwiązano to w grze Soldat?(przykładowo, nie robie klona ;])
Chodzi mi o to że w mojej grze gracz również będzie niedużym obiektem przez co pocisk w łatwy sposób może przelecieć
przez gracza nie wykrywając kolizji.

Jak polecalibyście to zrobić?
Ew. może macie pod ręką jakiś tutorial?

PS. Załączam demko z mojego engina fizycznego. Na demku będzie można zauważyć mój problem z szybko poruszającymi się obiektami. Zmaksymalizujcie sobie okno z demkiem.
http://www.yousendit.com/transfer.php?action=check_download&ufid=648EE9AC62585AD7&key=abfb844656cec9a2e40bca3bfd0f225e3e2c6b85

Pozdrawiam! ;)

7
Matematyka i fizyka / Ciała miękkie
« dnia: Grudzień 06, 2007, 17:32:38 »
Siema! ;)

Od jakiegoś czasu pisze sobie silniczek 2D graficzny i fizyczny (taki kombajn) i napotkałem pewien problem z ciałami miękkimi. Z początku myślałem, że sobie poradzę w parę chwil, ale pipram się z tym już 2 dni.

Moduł zajmujący się ciałem miękkim posiada:
+ punkt materialny
+ sprężynę
+ ciało miękkie (jego skład to: 2 punkty materialne i jedna sprężyna)

Chce sobie zrobić jakby line z paru ciał miękkich.
Jeśli sznurek składa się tylko z jednego ciała miękkiego to wszystko jest ok. Ale ja zadeklarowałem sobie tablicę takich ciał (np. 4) i chce by do każdego końca było przymocowane kolejne ciało(do 1-2, do 2-3, do 3-4).
Więc daje by punkt pierwszy ciała drugiego był punktem drugim ciała pierwszego, punkt pierwszy ciała trzeciego był drugim punktem ciała drugiego itd.
I wszystko fajnie się łączy, ale symulacja nie przebiega prawidłowo(realnie), gdyż na każdy drugi punkt kolejnego ciała powinny oddziaływać siły ciał przyczepionych niżej.(sry, wiem że strasznie zagmatwałem, ale najlepiej będzie to widać na demku) Wygląda to tak jakby wszytskie ciała przyczepione były uzależnione od ciała pierwszego tylko i wyłącznie.
Więc chodzi mi o to jak obliczyć siłę działającą na te drugie punkty?

Link: http://www.sendspace.pl/file/gXuRTqrt/

Pozdrawiam! ;) kompustelnik taki_tam

8
Sieć i multiplayer / Lobby Server
« dnia: Listopad 26, 2007, 21:40:39 »
Siema! ;)

Pisze grę od jakiegoś czasu i bardzo mi zależy na tym, by był multi.
Ale jak na razie nie stać mnie na zakup własnego servera.

Więc wspomniałem sobie Soldata.
Zawsze jak uruchamiałem grę i zakładałem server, to po wczytaniu mapy pisało że gra jest rejestrowana w Lobby Server (i jeszcze coś o ASP było).
I wtedy wystarczyło, że podam kumplom moje IP wewnętrzne(!) i można było nawalać do woli.

Mam prośbe.
Czy jest ktoś z Was w stanie wytłumaczyć mi mniej więcej o co w tym chodzi? Czy za to się coś płaci? Na prawde, nie mam o tym zielonego pojęcia. W ogóle jak i czym się to je?

Pozdrawiam! ;) kompustelnik taki_tam

9
Matematyka i fizyka / Troszeczke inne MTD.
« dnia: Listopad 13, 2007, 19:19:40 »
Siema! ;)

Od razu zaznaczam, że nie jest to SAT.
Robie sobie własną kolizję. I chcę aby działała na zasadzie:
- sprawdzenie czy punkt leży na trójkącie(zrobione).
- jeśli tak to połącz punkt odcinkiem prostopadłym do każdej ze ścian.
- sprawdź który z nich jest najkrótszy.
- przesuń punkt o ten odcinek.

Pytanie jest takie. W jaki sposób mam połączyć punkt ze ścianą odcinkiem prostopadłym? Tzn. wiem, że to jest odcinek najkrótszy. Ale jak go wyliczyć?
Dokładnie chodzi mi o punkt 2.

Pozdrawiam! ;) kompustelnik taki_tam

10
Design / Deszcz w grach.
« dnia: Listopad 13, 2007, 16:46:41 »
Hejka wszystkim! ;)

Mam takie małe pytanie. W jaki sposób Wy robicie deszcz w grach? (2D)
Sprity czy może jeszcze jakoś inaczej?

Pozdrawiam! ;) kompustelnik taki_tam

11
OpenGL / Wielokąty. Obliczenie U i V
« dnia: Listopad 12, 2007, 17:27:05 »
Siema! ;)

Krótkie pytanie.
Jak na podstawia współrzędnych wierzchołków trójkąta moge policzyć sobie U i V?
Chodzi mi o uzyskanie efektu takiego jak w Soldat, aby tekstura była jakby zapętlona na wielokącie.
Dodam jeszcze ze rozmiary tekstury wynoszą 128x128

Pozdrawiam! ;) kompustelnik taki_tam

// edit by bies
Wielokąty, na litość... Poligony możesz mieć po bliższym spotkaniu z WKU.

12
Matematyka i fizyka / Test kolizji z poligonem.
« dnia: Wrzesień 21, 2007, 13:44:26 »
Hejka :)
Jest pewien problem. Nie chodzi mi o te jak wykryc kolizje z poligonem tylko kiedy to robic ;)
Tzn. jesli mam gre 2D, mapa z poligonow. Wiadomo poligonow bedzie sporo. Wiec wykrywanie w kazdej klatce gry czy punkt nie zawiera sie w danym poligonie(wiadomo punktow bedzie mnostwo(gracze, obiekty itd.)). I test kazdego punktu z kazdym poligonem to wydaje mi sie dosyc ciezka praca dla kompa. W jaki sposob Wy to robicie?

Pozdrawiam! ;) kompustelnik taki_tam

13
Projekty rozpoczęte / Map Maker - testy
« dnia: Sierpień 02, 2007, 00:49:19 »
Hejka krejzole xD

Napisalem na moim starym komputerze(500MHz 96 RAM itd.) Map Maker do mojej gry. Na nim wszystko gra fajnie sie blyszczy i w ogole.
Ale komputer stoi u babki a ze nie czesto tam bywam przytaszczylem projekt na mojego kompa w domu(2.6GHz, 256 RAM itd.). I tu pojawily sie pewne niewyjasnione rzeczy (dziwne rzeczy >:() Dodam jeszcze ze na starym kalkulatorze mam Windows 2000 a na nowym XP.

Mam prosbe. Niech ktos z Was (kto ma czas i dobre checi) przetestuje moje dzielo i powie czy wszystko dziala ok.

Tu link: http://www.lajcior.za.pl/GMM.rar

Pozdrawiam! ;) kompustelnik taki_tam

14
Inne / Fajny kompilator jezyka Light
« dnia: Marzec 21, 2007, 16:56:03 »
Wczoraj tj. 20 III 07 zaczalem pisac moj pierwszy w zyciu kompilator. ::) No i skonczylem dziada.
Chcialbym aby ktos oblukał efekt mojej pracy. Kompilator 16-bitowy. Warto zaznaczyc ze w przykladzie
"prezentacja.lsf" jest adres pewnej strony www. Ta strona to I w moim zyciu ktorej i tak nie robie i robic
nie bede. Tak wiec jak ktos ma troszke czasu to niech zawiesi oko na tym malym bajerku. Caly opis
kompilatora jest spakowany wraz z programem. Fajnie by bylo gdybym dostal jakies informacje o bledach.
Planuje tez rozwinac mikrusa np. dodac zmienne itp. Ale to wszystko w swoim czasie. O kompilatorze
napisalem juz na jednym forum i tam jednemu z uzytkownikow wyskoczyl blad przy uruchamianiu juz
skompilowanego pliku w moim kompilatorze. Posiada on XP. Problem tkwi w tym ze ja tez mam XP
i u mnie dziala dobrze. Tu link: http://www.scripter.za.pl/Light_01b.rar

Soróweczka za troche przydlugawy post. ;)

Pozdrawiam!! ;)

15
Matematyka i fizyka / Czy to "prawdziwa fizyka"?? (grawitacja)
« dnia: Luty 24, 2007, 00:38:30 »
Stworzylem cos takiego:
Jest to wynik mojej pracy z ksiazka od fizyki z 1 i 2 klasy gimnazjum.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Label1: TLabel;
    procedure AppOnIdle(Sender: TObject; var Done: Boolean);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  //wartosci
  PY: Double;
  Przyspieszenie, Masa, Wypadkowa, Grawitacja: Double;
  Czas1, Czas2, dt: Double;

implementation

{$R *.dfm}

procedure TForm1.AppOnIdle(Sender: TObject; var Done: Boolean);
begin
  Done:= False;

  Czas1:= Time();
  dt:= Czas1 - Czas2;
  Czas2:= Time();

  Wypadkowa:= Grawitacja * Masa;
  Przyspieszenie:= (Przyspieszenie + (Wypadkowa * (dt / Masa)));

  PY:= PY + Przyspieszenie;

  Shape1.Top:= Round(PY);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  Grawitacja:= 9.81;
  Masa:= 5;

  Application.OnIdle := AppOnIdle;
end;

end.

I nie wiem czy to jest tak jak w rzeczywistosci...(zalezy mi na tym)

Uwzglednilem tylko:
- Mase obiektu
- Sile grawitacji

A jesli to jest poprawne to jak to spowolnic by nie zlamac praw fizyki....
Bo zapier...a zdrowasko :o.

Pozdrawiam ;)!

// edit by bies
Zamiast pogrubienia ([ b ]) sugeruję [ code ].
^----- dzieki za cynk... ;)

//Poprawilem [ code ]
//Kod caly bo chce by ktos oblukał czy to jest dobre czy tez lipa
//Pozdrawiam raz jeszcze! ;) :D

Strony: [1] 2