Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Fizyka RayQuery widoczna przez teren
#1
Próbuję użyć kwerendy z fizyki, ale powraca ona do prawdziwych przez niektóre ściany i teren, oto moja funkcja, poza czasami podawaniem nieprawidłowego wyniku, to działa dobrze. Czy ktoś może mi w tym pomóc?       Kod:   statyczny Bool IsVisible (D3DXVECTOR3 * vFrom, D3DXVECTOR3 * vTo, bool i visible) { if (! IsValidPtr (vFrom) ||! IsValidPtr (vTo)) return false; ClientGameContext * p_GameContext = ClientGameContext :: GetInstance (); if (! IsValidPtr (p_GameContext)) return false; HavokPhysicsManager * pHavok = p_GameContext-> m_pPhysicsManager; if (! IsValidPtr (pHavok)) return false; GameWorld * pGameWorld = pHavok-> m_GameWorld; if (! IsValidPtr (pGameWorld)) return false; IPhysicsRayCaster * pRayCaster = pGameWorld-> m_RayCaster; if (! IsValidPtr (pRayCaster)) return false; RayCastHit ray;      __declspec (wyrównanie (16)) D3DXVECTOR4 vFinalFrom = D3DXVECTOR4 (vFrom-> x, vFrom-> y, vFrom-> z, 0);      __declspec (wyrównanie (16)) D3DXVECTOR4 vFinalTo = D3DXVECTOR4 (vTo-> x, vTo-> y, vTo-> z, 0); visible =! pRayCaster-> PhysicsRayQuery ("OnGroundState :: update", i vFinalFrom, i vFinalTo, i ray, IPhysicsRayCaster :: DontCheckCharacter | IPhysicsRayCaster :: DontCheckWater | IPhysicsRayCaster :: DontCheckRagdoll | IPhysicsRayCaster :: DontCheckPhantoms, NULL); return true; }   i używam go w ten sposób     Kod:   bool widoczny; if (! IsVisible (& shootspace, i EnemyVec, visible)) // upewnij się, że rzeczywiście przeczytaliśmy o visiblity dalej; if (! visible) // jeśli nie jest widoczny test next player dalej;
Reply
#2
Miałem ten sam problem i znalazłem próbkę użycia dudeinberlin, on faktycznie opcjonalnie używa flagi 0x4, nie wiem, co to jest, ale działa w ten sposób Najlepszym sposobem byłoby opcjonalne sprawdzenie flag materiałowych, jeśli możesz przejrzeć lub strzelać przez coś, te materialne rzeczy znajdują się gdzieś w RayCastHit Kod: bool cEngine :: IsVisible (wektor od, wektor do) { if (IsValid (m_GameContext)) { fb :: HavokPhysicsManager * pPhysicsManager = m_GameContext-> m_pPhysicsManager; if (pPhysicsManager) { fb :: GameWorld * pGameWorld = pPhysicsManager-> m_GameWorld; if (IsValid (pGameWorld)) { fb :: IPhysicsRayCaster * pRayCaster = pGameWorld-> m_RayCaster; if (IsValid (pRayCaster)) { fb :: RayCastHit ray; return! pRayCaster-> PhysicsRayQuery ("ControllableFinder" z &, do & ray, (0x4
Reply
#3
dodając 0x4 jako flagę i usunięcie dontcheckwater wydaje się działać z jakiegokolwiek powodu, dzięki za pomoc "musi rozprzestrzeniać rep"
Reply
#4
nigdy żadnych problemów Kod: BOOL is_Visible (NerdVec * target, bool occlus) // dudeinberlin { if (! fb :: ActivePointer (m_GameWorld)) zwraca false; eastl :: fixed_vector wyklucza; if (this-> bImAVehicle && fb :: ActivePointer (m_myCP-> getVehicle ())) excludes.push_back (m_myCP-> getVehicle () -> physicsEntity ()); jeszcze excludes.push_back (m_Me-> physics ()); RayCastHit MaxHit; __declspec (align (16)) fb :: Vec3 from = vecNerd.Origin.toFbVec3 (); __declspec (align (16)) fb :: Vec3 to = target-> toFbVec3 (); if (! m_GameWorld-> physicsRayQuery ("controllableFinder", i od, & do, i MaxHit, 0x4 | 0x10 | 0x20 | 0x80, i wyklucza)) return true; jeszcze { if (bAutoWall &&! occluded) { if (! fb :: ActivePointer (MaxHit.m_physicsObject)) return false; if (Statics :: IsSeeThrough (MaxHit.m_material) || Statics :: IsPenetrable (MaxHit.m_material)) return true; } return false; } }
Reply
#5
co przekazujesz jako wykluczenia i czy wiesz, czym jest flaga 0x4.
Reply
#6
wyklucza to fizykontentlistę, więc możesz zignorować jakieś specjalne byty w świecie gry, w rzeczywistości przydatne, btw dude: czy robisz widoczne kontrole i dodatkowo sprawdzasz bool m_occluded dla żołnierzy?
Reply
#7
kiedy wykonujesz kontrole materiałowe i zobaczysz okno pomiędzy mną a graczem, który będzie pokazywał jako widoczny. więc sprawiłem, że kontrole materiałowe są aktywne tylko wtedy, gdy żołnierz nie jest zatkany, sux dla pojazdów, ale nie jest to wielka sprawa. Myślałem, że to dlatego, że jest nazwane wykluczeniem i widzisz, co cofnę, że faktycznie wiesz, co robi. Kod: enum ETraceActorFlags {
Reply
#8
Jaką pozycję chcielibyście wykorzystać dla lokalnego wroga? Pochodzenie z kamery? Lokalne położenie oczu?
Reply
#9
fb :: ClientWeapon :: m_shootSpace powinien być dokładnie moim zdaniem
Reply
#10
używam m_shootspace do lokalizacji kości wroga
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)