WinCNT

Physics.Raycast가 (Mesh)Collider의 BackFace를 Hit 못 하는 이슈 본문

Unity/Unity 개발 중 발생한 이슈 정리

Physics.Raycast가 (Mesh)Collider의 BackFace를 Hit 못 하는 이슈

WinCNT_SSS 2023. 2. 28. 11:43

발생한 이슈

Physics.queriesHitBackfaces를 true로 설정했음에도

Raycast가 Colldier(특히 MeshCollider)의 BackFace를 감지 못 하는 이슈가 발생했다


이슈 상세

이슈는 버텍스마다 특정 방향으로 Ray를 날려서 충돌하는 오브젝트가 있으면 그 거리를 버텍스 컬러에 저장하는 스크립트를 만드는 도중 발견되었다

 

아래의 이미지는 그 스크립트의 결과물이다(큐브는 옆으로 살짝 치움)

예상대로라면 오브젝트의 내부에도 흰색이 나와야 하는데 안 나오고 있다

Physics.queriesHitBackfaces = true;
bool isCollision = Physics.Raycast(targetVertex, forward, out RaycastHit raycastHit, maxDistance);
if (isCollision)
{
    if (tmpDistance[i] == 0.0f)
        tmpDistance[i] = maxDistance - raycastHit.distance;
}

발생 원인

검색해본 결과, 유니티의 버그인 것 같았다

【Unity】Raycast 時に MeshCollider の裏側でもヒットするようにする - うにてぃブログ

 

【Unity】Raycast 時に MeshCollider の裏側でもヒットするようにする - うにてぃブログ

Physics.queriesHitBackfaces を利用すれば Mesh の裏側から Ray を飛ばしてもヒットするとあったので試してみました 検証 処理はこちら、Physics.Raycast の前に Physics.queriesHitBackfaces = true をすることで裏

hacchi-man.hatenablog.com

 

유니티의 ISSUE TRACKER에 같은 이슈가 등록되어 있었다

Physics: Fixed some of the Physics.Raycast overloads ignoring the Physics.queriesHitBackfaces setting. (UUM-9353) First seen in 2023.1.0a4.

 

위의 블로그에 따르면 버전을 바꾸니 해결됐다고 한다 부럽다


해결법

버전을 마음대로 올릴 수도 없고 포기하려고 했던 필자에게

선배가 “역방향 레이로 한 번 더 측정하면 되지 않을까?”라는 어드바이스를 해줬다

아닛!!

바로 적용해봤다

// Ray을 날려서 충돌한 물체가 있는지 체크
bool isCollision = Physics.Raycast(targetVertex, forward, out RaycastHit raycastHit, maxDistance);
if (isCollision)
{
    // 충돌한 물체가 버텍스와 가까울수록 값을 1로 함
    float adjustDistanceValue = 1.0f - raycastHit.distance;
    if (tmpDistance[i] < adjustDistanceValue)
        tmpDistance[i] = adjustDistanceValue;
}

// 역방향 레이를 날리는 부분 추가
isCollision = Physics.Raycast(targetVertex + forward * maxDistance, -forward, out raycastHit, maxDistance);
if (isCollision)
{
    // 충돌한 물체가 버텍스와 가까울수록 값을 1로 함(역방향이므로 값을 조정하진 않음)
    float adjustDistanceValue = raycastHit.distance;
    if (tmpDistance[i] < adjustDistanceValue)
        tmpDistance[i] = adjustDistanceValue;
}

깔끔하게 해결됐다!


마무리

역시 어떻게든 해결책을 내는 것이 프로그래머의 역할인 것 같다

나는 아직 멀었다 흑흑


참고 자료

【Unity】Raycast 時に MeshCollider の裏側でもヒットするようにする - うにてぃブログ

 

【Unity】Raycast 時に MeshCollider の裏側でもヒットするようにする - うにてぃブログ

Physics.queriesHitBackfaces を利用すれば Mesh の裏側から Ray を飛ばしてもヒットするとあったので試してみました 検証 処理はこちら、Physics.Raycast の前に Physics.queriesHitBackfaces = true をすることで裏

hacchi-man.hatenablog.com

【Unity】一部メソッドで Physics.queriesHitBackfaces が動作しない - うにてぃブログ

 

【Unity】一部メソッドで Physics.queriesHitBackfaces が動作しない - うにてぃブログ

https://hacchi-man.hatenablog.com/entry/2023/01/14/220000hacchi-man.hatenablog.com 上記の記事で書いたように、Unity2021、2022では Physics.queriesHitBackfaces = true だとしても一部メソッドを除いて正しい挙動を行わない

hacchi-man.hatenablog.com