ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20230927 PhysX RayCast와 DirectX Indersects
    기록 2023. 9. 27. 20:06

    목표 : 플레이어가 사다리를 타고 올라간 부분에서 떨어지는 상태가 존재하는데플레이어가 Falling(떨어지는 상태)에서 Idle로 State를 변경해야하는 시점을 알아내야한다.

    현재 플레이어는 PhysX의 Capsule Component를 이용하여 navimesh위를 걷도록 설정되어 있다.


    프로젝트에서 할 수 있는 방법은 두가지가 있다.

    1. 네비메쉬의 vertex를 가져와 DirectX::TriangleTests::Intersects 함수를 사용하여 바닥위치와 플레이어 위치 차이를 체크하는 방법

    2. PhysX에서 제공하는 RayCast를 이용하여 Vertex를 체크하고 충돌(콜리전)포인트를 리턴하는 함수를 사용하는 방법이다.

    PhysX에서 네비메쉬의 vertex를 가져오는 기능은 현재 구현되어있지 않기 때문에 2번 방법을 선택하였다.


    문제점

    상황1)

    시작위치 : Player위치 - float4{0.0f, 1000.0f, 0.0f},

    방향 : float4::UP

    cast거리 : 2000.0 f

     

    이때 플레이어 위치의 아래에서 확인하는것이기 때문에

    다음과 같이 바닥 위에 플랫폼이 있다면 플랫폼을 체크하지 못한다.

    상황2)

    시작위치 : Player위치 - float4{0.0f, 2.0f, 0.0f}

    방향 : float4::DOWN

    거리 : 2000.0f

    이 때 일반적인 Move State는 상관이 없지만 Falling 시 플레이어의 vertex를 raycasting한 결과가 나오기 때문에 바닥이 아닌 플레이어가 체크되는 문제가 있다.

     

    +추가) 시작위치를 Player위치 - float4{0.0f, 50.0f, 0.0f}으로 한 경우 바닥을 인식하지 못하는경우가 생겨 다음과 같은 Falling State가 지속되는 오류가 발생한다.


    PhysX의 Raycast 할 때  Capsule을 인식하지 않드록 Flag를 설정하였다.

    m_pShape->setFlag(physx::PxShapeFlag::eSCENE_QUERY_SHAPE, false);

     

    프로젝트에서 장애물이 될 수 있는 static mesh는 박스 컴포넌트를 사용하기로하고 플레이어와 Movable object는 모두 캡슐 컴포넌트로 설정하기로 약속을 한 상태이기 때문에 위의 예외처리가 적절하게 사용되었다.

     

    캡슐 컴포넌트는 체크하지않기 때문에시작위치 : Player위치방향 : float4::DOWN거리 : 2000.0f다음과 같은 설정으로 변경하여 해결되었다.


    결과

     

    댓글

Designed by Tistory.