Autor Wątek: Przekazywanie siły  (Przeczytany 1907 razy)

Offline txt

  • Użytkownik

# Styczeń 17, 2013, 22:58:59
Mam problem przy przekazywaniu siły.
Otóż po zderzeniu obiektów przekazywana jest siła, problem jednak w tym, że prędkość jest aktualna, ale siły nie mogę przekazać ponieważ zeruję ją po każdym przebiegu pętli. Jak moę to zrobić, żeby operować na siłach.
Oto skrócony kod:
void update(scale)
{
// zmiana prędkości przez działające na ciało siły
rigBodies[i]->velocity.x = rigBodies[i]->velocity.x + ( rigBodies[i]->force.x*scale/rigBodies[i]->mass );
rigBodies[i]->velocity.y = rigBodies[i]->velocity.y + ( rigBodies[i]->force.y * scale / rigBodies[i]->mass );

// wpływ oporu na obiekt
rigBodies[i]->velocity.x = rigBodies[i]->velocity.x * ( 1.0f - rigBodies[i]->world.resistance );
rigBodies[i]->velocity.y = rigBodies[i]->velocity.y * ( 1.0f - rigBodies[i]->world.resistance );

// zmiana pozycji przez prędkość
rigBodies[i]->position.x = rigBodies[i]->position.x + rigBodies[i]->velocity.x;
rigBodies[i]->position.y = rigBodies[i]->position.y + rigBodies[i]->velocity.y;

        // zerowanie siły wypadkowej
        rigBodies[i]->force = vec2d( 0.0f, 0.0f );
}
//w main
/* ..... */
if( CircleCollision( mainBall->position, 0.05f, colideBall->position, 0.05f ) )
colideBall->force = colideBall->force + mainBall->force;

Offline Mr. Spam

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

Offline RedHot

  • Użytkownik

  • +1
# Styczeń 17, 2013, 23:18:43
Co oznacza "prędkość jest aktualna" ? 
Odpowiadając : nie zeruj :D

Offline txt

  • Użytkownik

# Styczeń 17, 2013, 23:26:45
Właśnie chodzi o to, że nie mogę nie zerować, ponieważ siła jaką np. dodam w pętli  będzie ciągle taka sama i opór nie będzie działał.

Cytuj
Co oznacza "prędkość jest aktualna" ?

Oznacza to po prostu tyle, że nie jest ona zerowana i zmniejsza się pod wpływem oporu. ;)

Offline Xirdus

  • Redaktor

# Styczeń 18, 2013, 01:57:57
Ja bym zrobił tak, że oprócz wektora wypadkowego obiekt ma listę jego składowych, i przy dodawaniu siły do obiektu jest dodawana i do wypadkowej i do listy. Możesz sobie tą listę zrobić jako mapa string=>wektor, wtedy będziesz mógł modyfikować konkretną siłę, np. object->applyForce ("ciag silnika", vec2d(6.f, 0.f)) i potem zwiększyć ciąg object->applyForce ("ciag silnika", vec2d(12.f, 0.f)). Nie doda to nowego ciągu, tylko zmieni stary (pamiętaj o odjęciu od wypadkowej starego wektora przed dodaniem nowego). Pewnie jest to bez sensu, ale co tam :)

A, i przeciąż sobie operatory dla wektora ;)

Offline txt

  • Użytkownik

# Styczeń 18, 2013, 09:51:30
@Xirdus Dzięki, to jest dobry pomysł i zamierzam go wypróbować.

Cytuj
A, i przeciąż sobie operatory dla wektora ;)
Wiem, ale bardziej byłem zajęty fizyką i nie miałem czasu na przeciążenie.

Mam jeszcze jesno pytanko odnośnie metody wykrywania kolizji AABB.
Czy znacie jakieś materiały odnośnie tej techniki, ponieważ znalazłem tylko teorię, a potrzebny mi jest kod.
Co prawda z teorii dowiedziałem się na czym ta technika polega, ale nie wiem, jak zmienia się wielkość prostokąta otaczającego obiekt pod wpływem obrotu danego obiektu. Skracając to wszystko, nie wiem po prostu jaki wysoki i szeroki jest obiekt w danym momencie podczas obrotu.

Offline bluebat

  • Użytkownik

  • +3
# Styczeń 18, 2013, 11:59:11
Nie ma siły w zderzeniach, to pęd jest przekazywany. Czyli zmieniasz prędkości adekwatnie do mas ciał. Wzór wygląda jakoś tak:
float j = (-(1+cr) * ((v2-v1) * normal)) / ((normal*normal) * (1/mass1 + 1/mass2));
v1 += (j * normal) / mass1;
v2 -= (j * normal) / mass2;
Gdzie * na wektorach to iloczyn skalarny, a cr to 'sprężystość' kolizji - np. 0.5. Normal to wektor normalny kolizji - dla kół to będzie normalize(pos2-pos1).

Offline txt

  • Użytkownik

# Styczeń 19, 2013, 15:58:48
@bluebat Dzięki za pomoc.
Cytuj
Nie ma siły w zderzeniach, to pęd jest przekazywany

Pamiętaj jednak, że pęd i popęd opiera się na drugiej zasadzie dynamiki Newtona, w której  F = ma, czyli wracamy do punktu wyjścia i mówimy o siłach.

Offline koirat

  • Użytkownik

# Styczeń 19, 2013, 17:19:34
Najpierw policz sobie normalnie prędkości ciał tak jak zaproponował @bluebat z zasady zachowania pędu.
Jak już obliczysz wynikowe wektory prędkości to odejmiesz od nich aktualne wektory prędkości, co w wyniku będzie zmianą prędkości w pewnym czasie, czyli przyspieszeniem (tym czasem może być delta używana do updatowania fizyki). Dzięki temu możesz obliczyć siłę działającą na ciało w czasie jednej ramki fizyki.

Offline txt

  • Użytkownik

# Styczeń 19, 2013, 19:17:56
Jest kilka sposobów, ale czy każda metoda jest równie dobra?