39512c45b6
- 创建DynamicIronBlock类,支持动态Box网格生成 - 集成BVH加速结构用于快速空间查询 - 添加可配置的Box大小和细分参数 - 更新Build.cs添加GeometryScript相关依赖模块 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
115 lines
2.8 KiB
C++
115 lines
2.8 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
#include "DynamicIronBlock.h"
|
|
|
|
#include "Components/DynamicMeshComponent.h"
|
|
#include "DynamicMesh/DynamicMesh3.h"
|
|
#include "GeometryScript/MeshPrimitiveFunctions.h"
|
|
#include "GeometryScript/MeshSpatialFunctions.h"
|
|
#include "GeometryScript/MeshBasicEditFunctions.h"
|
|
|
|
ADynamicIronBlock::ADynamicIronBlock()
|
|
{
|
|
// 设置此 Actor 在每帧调用 Tick()
|
|
PrimaryActorTick.bCanEverTick = false;
|
|
|
|
// 设置默认的 Box 大小
|
|
BoxSize = FVector(100.0f, 100.0f, 100.0f);
|
|
|
|
// 设置 BVH 快速构建选项
|
|
bEnableFastBuild = true;
|
|
}
|
|
|
|
void ADynamicIronBlock::BeginPlay()
|
|
{
|
|
Super::BeginPlay();
|
|
}
|
|
|
|
void ADynamicIronBlock::OnConstruction(const FTransform& Transform)
|
|
{
|
|
Super::OnConstruction(Transform);
|
|
|
|
// 初始化 Box 网格
|
|
InitializeBoxMesh();
|
|
}
|
|
|
|
void ADynamicIronBlock::InitializeBoxMesh()
|
|
{
|
|
// 获取 DynamicMeshComponent
|
|
UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent();
|
|
if (!DynMeshComp)
|
|
{
|
|
UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent"));
|
|
return;
|
|
}
|
|
|
|
// 获取 DynamicMesh
|
|
UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh();
|
|
if (!DynMesh)
|
|
{
|
|
UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh"));
|
|
return;
|
|
}
|
|
|
|
// 清除现有网格
|
|
DynMesh->Reset();
|
|
|
|
// 设置 Box 的选项
|
|
FGeometryScriptPrimitiveOptions PrimitiveOptions;
|
|
PrimitiveOptions.PolygroupMode = EGeometryScriptPrimitivePolygroupMode::SingleGroup;
|
|
PrimitiveOptions.bFlipOrientation = false;
|
|
|
|
// 创建 Box 的变换
|
|
FTransform BoxTransform = FTransform::Identity;
|
|
|
|
// 添加 Box 到网格
|
|
UGeometryScriptLibrary_MeshPrimitiveFunctions::AppendBox(
|
|
DynMesh,
|
|
PrimitiveOptions,
|
|
BoxTransform,
|
|
BoxSize.X,
|
|
BoxSize.Y,
|
|
BoxSize.Z,
|
|
NumSubDivide.X, NumSubDivide.Y, NumSubDivide.Z // X, Y, Z 轴的细分数
|
|
);
|
|
|
|
// 通知组件网格已更新
|
|
DynMeshComp->NotifyMeshUpdated();
|
|
|
|
// 生成 BVH
|
|
GenerateBVH();
|
|
|
|
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Box mesh initialized with size (%f, %f, %f)"),
|
|
BoxSize.X, BoxSize.Y, BoxSize.Z);
|
|
}
|
|
|
|
void ADynamicIronBlock::GenerateBVH()
|
|
{
|
|
// 获取 DynamicMeshComponent
|
|
UDynamicMeshComponent* DynMeshComp = GetDynamicMeshComponent();
|
|
if (!DynMeshComp)
|
|
{
|
|
UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMeshComponent for BVH generation"));
|
|
return;
|
|
}
|
|
|
|
// 获取 DynamicMesh
|
|
UDynamicMesh* DynMesh = DynMeshComp->GetDynamicMesh();
|
|
if (!DynMesh)
|
|
{
|
|
UE_LOG(LogTemp, Error, TEXT("DynamicIronBlock: Failed to get DynamicMesh for BVH generation"));
|
|
return;
|
|
}
|
|
|
|
// 构建 BVH
|
|
FGeometryScriptDynamicMeshBVH BVH;
|
|
UGeometryScriptLibrary_MeshSpatial::BuildBVHForMesh(
|
|
DynMesh,
|
|
BVH
|
|
);
|
|
|
|
// 可选:重置碰撞
|
|
DynMeshComp->UpdateCollision();
|
|
|
|
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: BVH generated successfully"));
|
|
} |