You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Unreal C++中如何获取Actor的世界空间有向包围盒8个顶点?

在C++中获取Actor世界空间有向包围盒(OBB)8个顶点的方法

先明确几个UE边界类的空间属性:

  • FBox:属于轴对齐包围盒(AABB),空间属性取决于来源(比如静态Mesh的原始Bounds是局部空间)。
  • FBoxSphereBounds:包含AABB和包围球,默认是局部空间,需通过变换转换到世界空间。

你的代码思路是对的,但还需要补充生成8个顶点的步骤,完整实现如下:

// 获取目标Actor的StaticMeshComponent
UStaticMeshComponent* MeshComp = Cast<UStaticMeshComponent>(Actor->GetComponentByClass(UStaticMeshComponent::StaticClass()));
if (!MeshComp) return;

UStaticMesh* StaticMesh = MeshComp->GetStaticMesh();
if (!StaticMesh || !StaticMesh->GetRenderData()) return;

// 获取静态Mesh的局部空间Bounds(FBoxSphereBounds为局部空间)
FBoxSphereBounds LocalBounds = StaticMesh->GetRenderData()->Bounds;

// 将局部Bounds转换为世界空间的有向包围盒
// 注意:用组件变换而非Actor变换,组件可能有独立于Actor的偏移/旋转
FTransform ComponentTransform = MeshComp->GetComponentTransform();
FOrientedBox WorldOBB = LocalBounds.TransformBy(ComponentTransform).GetOrientedBox();

// 提取OBB的8个世界空间顶点
TArray<FVector> OBBVertices;
OBBVertices.Reserve(8);
for (int32 X = 0; X < 2; X++)
{
    for (int32 Y = 0; Y < 2; Y++)
    {
        for (int32 Z = 0; Z < 2; Z++)
        {
            FVector Vertex = WorldOBB.Center 
                + (X == 0 ? -WorldOBB.Halves.X : WorldOBB.Halves.X) * WorldOBB.AxisX 
                + (Y == 0 ? -WorldOBB.Halves.Y : WorldOBB.Halves.Y) * WorldOBB.AxisY 
                + (Z == 0 ? -WorldOBB.Halves.Z : WorldOBB.Halves.Z) * WorldOBB.AxisZ;
            OBBVertices.Add(Vertex);
        }
    }
}

// OBBVertices数组中存储的就是OBB的8个世界空间顶点

关键细节说明:

  • 优先使用组件的GetComponentTransform():StaticMeshComponent可能存在独立于Actor的变换(比如偏移、旋转),用组件变换能保证坐标准确。
  • FOrientedBox是UE专门用于表示有向包围盒的结构,包含中心、三个正交轴向量、三个轴方向的半长值,通过它可以直接计算出所有顶点。
  • 三重循环遍历X/Y/Z的正负组合,结合OBB的轴和半长值,即可得到8个顶点的世界坐标。

内容的提问来源于stack exchange,提问作者user2566720

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:15:41