Procedural Mesh Component를 이용한 Convex Collision 생성

2025. 1. 31. 23:11·Unreal Engine/이것 저것

내일배움캠프에서 과제로 나온 플랫폼을 제작하면서 꿀렁거리는 플랫폼을 만들기 위해 알아본 내용을 정리했다.

정점이 약 2210개 정도의 메시이다.

위 사진과 같은 모양의 메시이기에 일반적인 Mesh의 충돌체로는 플레이어가 올라갔을 때, 정밀하지 않아서 처음에

Auto Convex Collision과 Convex Decomposition을 이용하여 좀 더 정밀한 Collision Bound를 만들었다.

여기까지는 행복하였으나...

문제는 꿀렁거리는 플랫폼을 위해서 전용 Material을 만들고 나서였다.

World Position Offset을 이용하여 위아래로 꺽이게 만들기 위해서 Absolute World Position 노드와 Time 노드를 이용해서 정점 위치가 동적으로 변경될 수 있도록 했다.

꿀렁거리게 만들기 위해 앞서 언급한 노드를 사용해서 만든 Material.
충돌체와 Material의 모양이 일치하지 않는다.

메시의 정점 위치를 바꿔주는 방법이 그나마 구현하기 쉬울 것이라 판단하여 해당 방법을 구현해 보기로 했다.

 

문제는

1. Static Mesh의 정점은 수정이 불가능하다는 점이 있었고.

2. 단순하게 생각해봐도 Material의 동작으로 정점의 위치가 변하는 동작은 GPU 단에서 수행되는데 Static Mesh의 정점 수정은 CPU 단에서 이루어지기 때문에 연산이 효율적이지 않다는 점이 있었다.

 

1 번 문제는 이전에 Virtual Buster를 제작해보면서 Procedural Mesh Component를 이용한 절단 효과를 구현했던 경험을 통해서 Procedural Mesh Component는 정점의 수정이 가능하다는 점을 알고 있었다. 따라서 이를 이용해보기로 했다. (애초에 Procedural Mesh Component에서 사용할 Mesh는 정점 데이터가 필요하다.) 하지만, 이미 준비된 Static Mesh가 있으므로 이를 복사해서 만들어주기로 했다.

기존에 있는 Static Mesh Component는 Procedural Mesh를 생성해 준 다음에는 사용할 필요가 없으므로 일단, None으로 변경해 In-Game에서 표시되지 않도록 변경해준다.

 

테스트 해 본 결과 정상적으로 Procedural Mesh가 생성된 것을 확인할 수 있어서 2번 문제를 해결해보기로 했다.

 

-1. 2 번 문제인 CPU단에서 실행된다는 점 + Tick Event에서 처리해주되 Tick의 갱신 주기를 0.5초 정도로 해보기로 했다.(테스트 결과, 이 정도 갱신주기여도 3000개 미만의 정점을 이용한 Static Mesh 6개면 프레임이 120에서 60으로 급감한다)

-2. Material의 Absolute World Position 노드에서 Masking해서 가져온 값이 Y좌표 값이므로 각 정점에 사용할 값도 Y좌표 값에서 추출해주기로 했다.(절대 좌표가 될 수 있도록 GetWorldLocation을 통해 Root의 Y좌표 값을 더해줬다.)

-3. 새로운 Collision Convext Mesh를 사용할 것이므로 Clear Collision Convex Meshes를 통해 충돌체를 제거해준다.

-4. 모든 계산이 끝나면 Add Collision Convex Mesh를 통해 수정된 정점들로 Convex Mesh를 생성해준다.

되는 줄 알고 행복했다.

잘 동작할 줄 알고 행복한 마음으로 테스트를 해 봤으나 바로 문제가 새로 발생했다.

일단, 첫 번째로 Collision Convex Mesh의 정밀도가 내가 생각한 것보다 떨어져 아래와 같은 결과가 나왔다.

Static Mesh로 사용되는 모델링 파일의 정점 수를 늘리는 방법으로 해결이 가능할 지 모르겠으나 일단 모든 Static Mesh에서 아래와 같은 결과가 나왔기 때문에 이 방법은 사실상 사용할 수 없게 되었다.

하지만 결과물은....

심각한 첫 번째 문제와 별개도 두 번째 문제도 심각했는데, 바로 Material의 꿀렁임과 Collision Convex Mesh의 꿀렁임이 일치하지 않는다는 문제였다. 

일치하지 않는다. 심지어, Wave Speed, Wave Height, Wave Divide를 다른 값을 주어야 그나마 일치하게라도 보일 수 있었다.

그래서 결국 해당 방법은 전부 폐기하고 기존의 정밀한 Collision Convex Mesh를 사용하기로 했다.

 

Material에서 World Position Offset을 사용하고자 한다면, 앞으로 충돌체에 크게 영향을 주지 않는 선에서 사용하거나, 필요하지 않은 경우에만 사용해야 한다는 결론을 얻을 수 있었다.

'Unreal Engine > 이것 저것' 카테고리의 다른 글

[Network] 채팅 프로그램 만들기  (0) 2025.03.17
게임 언패킹과 리타게팅, 그리고 머티리얼에 대하여 ( 1 )  (0) 2025.02.07
에디터에서 FVector 수정을 위한 UPROPERTY 사용  (0) 2025.02.03
유튜브 레퍼런스  (0) 2025.02.01
CDO와 Constructor  (0) 2025.01.08
'Unreal Engine/이것 저것' 카테고리의 다른 글
  • 게임 언패킹과 리타게팅, 그리고 머티리얼에 대하여 ( 1 )
  • 에디터에서 FVector 수정을 위한 UPROPERTY 사용
  • 유튜브 레퍼런스
  • CDO와 Constructor
DevJoo1120
DevJoo1120
  • DevJoo1120
    Jin's Programming
    DevJoo1120
  • 전체
    오늘
    어제
    • 분류 전체보기 (142)
      • 포트폴리오 (7)
        • Castlevania: Aria of Sorrow.. (7)
        • [UE5] KILL Everything (0)
      • C++ (0)
      • 라이브러리 (1)
      • 다이렉트X11 (0)
      • Unreal Engine (11)
        • Unreal Document (1)
        • 이것 저것 (8)
        • UI (1)
      • 자료구조 및 알고리즘 (0)
      • 책 정리 (3)
        • 코딩 테스트 합격자 되기 C++ 편 (10)
      • 코딩 테스트 (32)
        • 프로그래머스 (32)
      • 스파르타 코딩 언리얼 1기 (9)
        • 특강 (0)
        • C++와 Unreal Engine으로 3D .. (2)
      • TIL(Today I Learned) (63)
      • 영어 공부 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    문자열
    map
    Til
    스파르타 코딩 클럽
    코딩테스트
    배열
    책 정리
    프로그래머스
    반복문
    코딩 테스트
    코딩 테스트 합격자 되기 c++ 편
    Study
    Unreal Engine 5
    과제
    WINAPI
    정렬
    C++
    정리
    팀 프로젝트
    이중 반복문
  • hELLO· Designed By정상우.v4.10.5
DevJoo1120
Procedural Mesh Component를 이용한 Convex Collision 생성
상단으로

티스토리툴바