如何在UE4 / c++中可视化我的四叉树

How can I visualize my quadtree in UE4 / c++

本文关键字:可视化 我的 四叉树 c++ UE4      更新时间:2023-10-16

我正在使用 c++ 在 UE4 中制作一个 Quadtree,我对 c++ 很陌生,所以我需要这方面的帮助。

我主要关心的是可视化四叉树。

基本上我有一个名为Quadtree的本机c ++类。在此类中,我拥有所有功能,例如插入点,细分等...我有一个名为 C_Quadtree(我知道是愚蠢的名字)的 AActor c++ 类,它有一个用于插入点的蓝图可调用函数和一个可视化方法。

这是我尝试可视化它的方式:

    void AC_Quadtree::show(Quadtree* Node)
{
    FVector BoxCenter = FVector(Node->GetBoundary().GetCenter(), 0);
    FVector BoxExtent = FVector(Node->GetBoundary().GetExtent(), 0);
    DrawDebugBox(GetWorld(), BoxCenter, BoxExtent, FColor::White, false, -1, 0, 3);
}
    void AC_Quadtree::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    for (Quadtree *Node : TreeNodes) {
        show(Node);
    }
}

我已经声明了一个数组来存储树节点,如下所示:

TArray<Quadtree*> TreeNodes; 

但是,我不知道如何将从本机四叉树类创建的四叉树添加到 Actor C_Quadtree 类内的数组中。

下面是在 Quadtree 类中声明的细分函数:

void Quadtree::subdivide()
{   
    //Init local variables to make the Math clearer.
    FVector2D Center = Boundary.GetCenter();
    FVector2D HalfExtent = Boundary.GetExtent() / 2;
    NorthWest = new Quadtree( FVector2D(Center.X + HalfExtent.X, Center.Y - HalfExtent.Y), HalfExtent);
    NorthEast = new Quadtree( Center + HalfExtent, HalfExtent);
    SouthWest = new Quadtree( Center - HalfExtent, HalfExtent);
    SouthEast = new Quadtree( FVector2D(Center.X - HalfExtent.X, Center.Y + HalfExtent.Y), HalfExtent);
}

有什么想法吗?

通过将四叉树压缩到数组中,您将失去四叉树的功能。您可以使用数组来存储 Quadtree 指针的副本,但我建议在 Quadtree 对象本身上使用递归函数来实现功能。递归将沿着指针向下到四叉树的每个分支,以 nullptr 结束。示例函数:

Quadtree::SubdivideEach()
{
    if(NorthWest != nullptr)
        NorthWest->SubdivideEach();
    else
        subdivide();
    if(NorthEast != nullptr)
        NorthEast->SubdivideEach();
    else
        subdivide();
    //and the others
}

为了保持编辑器中视图和蓝图的兼容性,您可能需要为Quadtree类添加UE4 API。最简单的方法是为 UObject 的子类执行 File ->"New C++ Class" -> 选项,然后复制粘贴现有代码。