Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 3d
- VR
- 메모리 누수
- working set
- 프로그래밍 기초
- 벡터
- 가상 바이트
- OculusMotionVectorPass
- Rim Light
- Windows Build
- URP
- Cell Look
- Private Bytes
- Specular
- ColorGradingLutPass
- Three(Two) Tone Shading
- Virtual Byte
- C언어
- URP로 변경
- Cartoon Rendering
- Toon Shader
- ASW(Application SpaceWarp)
- AppSW
- 게임 수학
- 작업 집합
- 개인 바이트
- Cell Shader
Archives
- Today
- Total
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 の裏側でもヒットするようにする - うにてぃブログ
유니티의 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 > Unity 개발 중 발생한 이슈 정리' 카테고리의 다른 글
텍스처의 가장자리 패딩하기 (0) | 2023.05.19 |
---|---|
Normal Map이 격자 형태로 출력되는 이슈 (0) | 2023.03.24 |
URP 14이전 버전에서 커스텀 Post Processing 사용이 안 되는 이슈 (0) | 2023.02.13 |
URP의 디폴트 ShadowCaster와 SRP Batcher (0) | 2023.01.27 |
“sampler2D object does not have methods” 에러 발생(URP) (0) | 2023.01.24 |