[UE5] Project_StackBlock #2 - DynamicMeshComponent 활용 및 메쉬 불리언 연산 문제 해결

ChangJin·2024년 7월 24일
0

Unreal Engine5

목록 보기
87/114
post-thumbnail

2024.07.24

이번 글에서는 Unreal Engine 5에서 DynamicMeshComponent와 메쉬 불리언 연산에 대해 설명합니다.


다이나믹 메쉬
다이나믹 메쉬 일부분 뚫림

1. 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();
}

2. Apply Mesh Boolean을 사용한 메쉬 불리언 연산

문제

블루프린트 노드인 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));
}

3. 프로젝트 모듈 추가

필요한 모듈을 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에서 동적 메쉬를 다루는 데 필요한 주요 기능을 구현하는 방법을 설명했으며, 프로젝트에서 발생할 수 있는 문제를 해결하는 구체적인 방법을 제공했습니다. 이 내용을 통해 동적 메쉬와 관련된 기능을 효율적으로 구현할 수 있기를 바랍니다. 추가적인 질문이나 수정이 필요하다면 언제든지 알려주세요!

profile
게임 프로그래머

0개의 댓글