UE5.4.3中如何在Tick时获取自定义GeometryCollection骨骼的质量与速度
Unreal Engine 5.4.3 获取GeometryCollection中每个骨骼的质量、线速度和角速度
问题修正说明
原代码引用了私有目录头文件Runtime/Experimental/Chaos/Private/Chaos/PhysicsObjectInternal.h,这属于不规范做法——私有目录的头文件不属于公开API,会引发编译兼容性问题,且引擎版本更新后大概率失效。以下是基于公开API的正确实现:
完整实现代码
#include "GeometryCollection/GeometryCollectionComponent.h" #include "Chaos/PBDRigidClusteredParticleHandle.h" #include "Chaos/PhysicsProxy.h" void ACustomGeometryCollection::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); if (!GeometryCollectionComponent.IsValid()) { return; } // 获取GeometryCollection的PhysicsProxy Chaos::TPhysicsProxy<Chaos::FPBDRigidClusteredPhysics>* PhysicsProxy = GeometryCollectionComponent->GetPhysicsProxy<Chaos::TPhysicsProxy<Chaos::FPBDRigidClusteredPhysics>>(); if (!PhysicsProxy) { return; } const int32 NumTransforms = GeometryCollectionComponent->GetDynamicCollection()->GetNumTransforms(); for (int32 i = 0; i < NumTransforms; ++i) { // 获取对应索引的粒子句柄 Chaos::FPBDRigidClusteredParticleHandle* ParticleHandle = PhysicsProxy->GetParticle(i); if (!ParticleHandle) { continue; } // 获取质量 const float Mass = ParticleHandle->GetMass(); // 获取全局空间线速度 const FVector LinearVelocity = ParticleHandle->GetLinearVelocity(); // 获取全局空间角速度 const FVector AngularVelocity = ParticleHandle->GetAngularVelocity(); // 示例:打印数据 UE_LOG(LogTemp, Log, TEXT("骨骼索引%d: 质量=%.2f, 线速度=(%.2f,%.2f,%.2f), 角速度=(%.2f,%.2f,%.2f)"), i, Mass, LinearVelocity.X, LinearVelocity.Y, LinearVelocity.Z, AngularVelocity.X, AngularVelocity.Y, AngularVelocity.Z); } }
关键说明
- 空指针检查:必须先验证
GeometryCollectionComponent和PhysicsProxy的有效性,避免运行时崩溃 - 粒子句柄获取:使用公开接口
GetParticle(i)替代私有接口GetParticle_Internal(i) - 属性获取方法:
- 质量:
ParticleHandle->GetMass() - 线速度:
ParticleHandle->GetLinearVelocity()(返回全局空间下的FVector) - 角速度:
ParticleHandle->GetAngularVelocity()(返回全局空间下的FVector)
- 质量:
- 头文件规范:仅引用公开的Chaos头文件,无需依赖私有目录内容
内容的提问来源于stack exchange,提问作者Nick Charney Kaye
相关产品推荐
相关产品推荐

