Autor Wątek: PhysX - sześcian staje na kancie  (Przeczytany 1100 razy)

Offline ctrl_home

  • Użytkownik

# Wrzesień 11, 2010, 22:29:22
Symuluję sobie sześcian w PhysX. Na początku sześcian spoczywa sobie na `GroundPlane`. Klawiszem zadaję siłę na ten sześcian tak że unosi się do góry:
Kod: (cpp) [Zaznacz]
ApplyForceToActor(box, NxVec3(0, 1, 0), 20000);
Kod: (cpp) [Zaznacz]
NxVec3 ApplyForceToActor(NxActor *actor, const NxVec3 &forceDir, const NxReal forceStrength)
{
NxVec3 forceVec = forceStrength * forceDir * gDeltaTime;
actor->addForce(forceVec);
return forceVec;
}

Innym klawiszem gdy sześcian jest jeszcze w górze zadaję siłę działającą w bok (wzdłuż osi x). Sześcian jest w górze, choć spada w dół jednocześnie poruszając się w bok. Gdy dolatuje do GroundPlane odbija się i obraca kilkukrotnie. Wszystko wygląda dość realnie i jest super poza tym że czasem sześcian zatrzymuje się na jednej ze swoich krawędzi lub po prostu nie leży dokładnie na GroundPlane (dołączyłem obrazek). Czy ktoś się z tym spotkał lub może wie co mogę robić nie tak?
Dodam że bieżącą pozycję sześcianu i jego orientację dostaję tak:

box_position = box->getGlobalPosition();
box_orientation = box->getGlobalOrientation();

Rendering jest w DirectX a macierz obrotu jest budowana tak:
Kod: (cpp) [Zaznacz]
box_orientation.getRow(0, row);
rt_mx._11 = row.x; rt_mx._12 = row.y; rt_mx._13 = row.z; rt_mx._14 = 0.0f;

box_orientation.getRow(1, row);
rt_mx._21 = row.x; rt_mx._22 = row.y; rt_mx._23 = row.z; rt_mx._24 = 0.0f;

box_orientation.getRow(2, row);
rt_mx._31 = row.x; rt_mx._32 = row.y; rt_mx._33 = row.z; rt_mx._34 = 0.0f;
rt_mx._41 = 0.0f; rt_mx._42 = 0.0f; rt_mx._43 = 0.0f; rt_mx._44 = 1.0f;

Offline Mr. Spam

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

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Wrzesień 12, 2010, 09:14:35
Sprawdź jak wygląda scena w PhysX Visual Debbugerze.

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Wrzesień 12, 2010, 12:33:58
Jak gruba skóre masz ustawiona i zaladuj cala macierz boxa w DX (Actor->GetGlobalPose().getColumnMajor44(MatrixDX.m); i wysiwetl :) I jestes pewny ze skale sa ok? modelu fizycznego wzgledem Renderowanego?

Offline ctrl_home

  • Użytkownik

# Wrzesień 12, 2010, 17:48:18
Dzieki .:NOXY:.
Rzeczywiście to było to: box->getGlobalPose().getColumnMajor44((NxF32*)&rt_mx.m);
Teraz sześcian zachowuje się tak jak powinien. Skórę miałem ustawioną na 0.01f. Skale obu modeli (fiz i renderowanego są ok).
Many thanks :)

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Wrzesień 12, 2010, 18:47:19
You are welcome ;)