As I wasn’t able to find much documentation on how trigger and apply physics fields against a UGeometryCollection in C++. So, I figured I would post a small example:
// Generic Metadata
TObjectPtr<UFieldSystemMetaDataFilter> MetaData = NewObject<UFieldSystemMetaDataFilter>();
MetaData->SetMetaDataFilterType(
EFieldFilterType::Field_Filter_All,
EFieldObjectType::Field_Object_All,
EFieldPositionType::Field_Position_CenterOfMass);
// Apply uniform external strain
TObjectPtr<UUniformScalar> UniformScalar = NewObject<UUniformScalar>();
UniformScalar->Magnitude = 9999999999.0;
GeometryCollection->ApplyPhysicsField(
true, EGeometryCollectionPhysicsTypeEnum::Chaos_ExternalClusterStrain, MetaData.Get(), UniformScalar.Get());
// Apply radial velocity
TObjectPtr<URadialVector> RadialVector = NewObject<URadialVector>();
RadialVector->Magnitude = 50.0;
RadialVector->Position = GetActorLocation();
GeometryCollection->ApplyPhysicsField(
true, EGeometryCollectionPhysicsTypeEnum::Chaos_AngularVelocity, MetaData.Get(), RadialVector.Get());
// Apply A Uniform up Vector
TObjectPtr<UUniformVector> UniformVector = NewObject<UUniformVector>();
UniformVector->Magnitude = 100;
UniformVector->Direction = FVector(0, 0, 1);
GeometryCollection->ApplyPhysicsField(true, EGeometryCollectionPhysicsTypeEnum::Chaos_LinearVelocity, MetaData.Get(), UniformVector.Get());
This is similar to some of the processing that happens via the FS_MasterField Field Node Blueprint from the Engine Content. I have not figured out how to apply a UNoiseField.
Perhaps, this is going to help someone.