2024.07.24
이번 글에서는 Unreal Engine 5에서 DynamicMeshComponent와 메쉬 불리언 연산에 대해 설명합니다.
다이나믹 메쉬 |
다이나믹 메쉬 일부분 뚫림 |
DynamicMeshComponent에 충돌을 추가하는 방법을 찾는 것이 어려웠습니다. 기본적으로 DynamicMeshComponent는 충돌을 지원하지 않기 때문에 추가적인 설정이 필요합니다.
DynamicMeshComponent에 UBodySetup을 생성하고 설정하여 충돌을 적용할 수 있습니다. 기존 메쉬 데이터를 사용하여 충돌 데이터를 초기화하고 적용하는 방법은 다음과 같습니다.
#include "DynamicMeshComponent.h"
#include "PhysicsEngine/BodySetup.h"
void SetupCollision(UDynamicMeshComponent* DynamicMeshComponent)
{
if (!DynamicMeshComponent) return;
UBodySetup* BodySetup = NewObject<UBodySetup>(DynamicMeshComponent);
if (!BodySetup) return;
BodySetup->CollisionTraceFlag = CTF_UseComplexAsSimple;
BodySetup->bGenerateMirroredCollision = false;
BodySetup->bDoubleSidedGeometry = true;
BodySetup->CreatePhysicsMeshes();
DynamicMeshComponent->BodySetup = BodySetup;
DynamicMeshComponent->RecreatePhysicsState();
}
블루프린트 노드인 Apply Mesh Boolean
을 C++에서 사용하고자 했으나, 관련 API가 문서화되지 않았고, 적절한 방법을 찾기 어려웠습니다. C++에서 이 함수를 사용하는 방법을 알고 계시면 알려주세요. ㅠㅠ
Geometry Script 라이브러리를 사용하지 않고, FMeshBoolean 클래스를 직접 사용하여 불리언 연산을 수행하는 방법을 선택했습니다. 이를 통해 두 개의 FDynamicMesh3 객체를 사용하여 불리언 연산을 수행할 수 있었습니다.
#include "DynamicMeshActor.h"
#include "Engine/StaticMeshActor.h"
#include "DynamicMesh3.h"
#include "MeshTransforms.h"
#include "Operations/MeshBoolean.h"
#include "MeshDescriptionToDynamicMesh.h"
#include "DynamicMeshToMeshDescription.h"
ADynamicMeshActor::ADynamicMeshActor()
{
PrimaryActorTick.bCanEverTick = true;
DynamicMeshComponent = CreateDefaultSubobject<UDynamicMeshComponent>(TEXT("DynamicMeshComponent"));
RootComponent = DynamicMeshComponent;
}
void ADynamicMeshActor::ApplyMeshBoolean(AStaticMeshActor* CuttingMeshActor)
{
if (!DynamicMeshComponent || !CuttingMeshActor) return;
FDynamicMesh3* OriginalMesh = DynamicMeshComponent->GetMesh();
if (!OriginalMesh) return;
UStaticMeshComponent* CuttingMeshComponent = CuttingMeshActor->GetStaticMeshComponent();
if (!CuttingMeshComponent) return;
UStaticMesh* CuttingStaticMesh = CuttingMeshComponent->GetStaticMesh();
if (!CuttingStaticMesh || !CuttingStaticMesh->RenderData) return;
FDynamicMesh3 CuttingMesh;
FMeshDescriptionToDynamicMesh Converter;
Converter.Convert(CuttingStaticMesh->GetMeshDescription(0), CuttingMesh);
FDynamicMesh3 ResultMesh;
FMeshBoolean BooleanOp(OriginalMesh, &CuttingMesh, &ResultMesh, EMeshBooleanOperation::Difference);
BooleanOp.Compute();
DynamicMeshComponent->SetMesh(MakeShared<FDynamicMesh3>(ResultMesh));
}
필요한 모듈을 Build.cs 파일에 추가하지 않으면, 필요한 헤더 파일이나 클래스에 접근할 수 없습니다.
프로젝트의 Build.cs 파일을 수정하여 필요한 모듈을 추가해야합니다.
using UnrealBuildTool;
public class YourProject : ModuleRules
{
public YourProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine",
"InputCore",
"GeometryCore",
"GeometryFramework",
"DynamicMesh"
});
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}
이번 글에서는 DynamicMeshComponent의 충돌 설정 문제와 메쉬 불리언 연산 적용 문제를 해결하는 과정을 다루었습니다. Unreal Engine 5에서 동적 메쉬를 다루는 데 필요한 주요 기능을 구현하는 방법을 설명했으며, 프로젝트에서 발생할 수 있는 문제를 해결하는 구체적인 방법을 제공했습니다. 이 내용을 통해 동적 메쉬와 관련된 기능을 효율적으로 구현할 수 있기를 바랍니다. 추가적인 질문이나 수정이 필요하다면 언제든지 알려주세요!