在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
相关产品推荐
相关产品推荐

