Merge pull request #740 from hyarion:fix/unity-fluidshape

PiperOrigin-RevId: 511791324
Change-Id: I28e98e55efe43ba053b803838082646289e4f09e
This commit is contained in:
Copybara-Service
2023-02-23 08:19:20 -08:00
2 changed files with 84 additions and 1 deletions
@@ -22,6 +22,10 @@ namespace Mujoco {
[Serializable]
public struct MjGeomSettings {
public enum FluidShapeTypes {
None,
Ellipsoid,
}
[Tooltip("Priority")]
public int Priority;
@@ -35,11 +39,20 @@ public struct MjGeomSettings {
[Tooltip("Contact friction parameters for dynamically generated contact pairs.")]
public GeomFriction Friction;
[Tooltip("Shape used for fluid simulation.")]
public FluidShapeTypes FluidShapeType;
[Tooltip("Dimensionless coefficients of fluid interaction model.")]
public GeomFluidCoefficients FluidCoefficients;
// Default geom settings.
public static MjGeomSettings Default = new MjGeomSettings() {
Solver = GeomSolver.Default,
Filtering = CollisionFiltering.Default,
Friction = GeomFriction.Default
Friction = GeomFriction.Default,
FluidShapeType = FluidShapeTypes.None,
FluidCoefficients = GeomFluidCoefficients.Default
};
public void FromMjcf(XmlElement mjcf) {
@@ -76,6 +89,20 @@ public struct MjGeomSettings {
Friction.Sliding = friction[0];
Friction.Torsional = friction[1];
Friction.Rolling = friction[2];
// Fluid settings.
FluidShapeType = mjcf.GetEnumAttribute<FluidShapeTypes>(
"fluidshape", FluidShapeTypes.None, ignoreCase: true);
var fluidcoef = mjcf.GetFloatArrayAttribute("fluidcoef", new float[] {
GeomFluidCoefficients.Default.BluntDrag, GeomFluidCoefficients.Default.SlenderDrag,
GeomFluidCoefficients.Default.AngularDrag, GeomFluidCoefficients.Default.KuttaLift,
GeomFluidCoefficients.Default.MagnusLift
});
FluidCoefficients.BluntDrag = fluidcoef[0];
FluidCoefficients.SlenderDrag = fluidcoef[1];
FluidCoefficients.AngularDrag = fluidcoef[2];
FluidCoefficients.KuttaLift = fluidcoef[3];
FluidCoefficients.MagnusLift = fluidcoef[4];
}
public void ToMjcf(XmlElement mjcf) {
@@ -97,6 +124,11 @@ public struct MjGeomSettings {
// Inertia and friction settings.
mjcf.SetAttribute("friction", MjEngineTool.MakeLocaleInvariant($"{Friction.Sliding} {Friction.Torsional} {Friction.Rolling}"));
// Fluid settings.
mjcf.SetAttribute("fluidshape", FluidShapeType.ToString().ToLower());
mjcf.SetAttribute("fluidcoef", MjEngineTool.MakeLocaleInvariant(
$"{FluidCoefficients.BluntDrag} {FluidCoefficients.SlenderDrag} {FluidCoefficients.AngularDrag} {FluidCoefficients.KuttaLift} {FluidCoefficients.MagnusLift}"));
}
}
@@ -155,4 +187,17 @@ public struct GeomSolver {
Margin = 0.0f, Gap = 0.0f
};
}
[Serializable]
public struct GeomFluidCoefficients {
public float BluntDrag;
public float SlenderDrag;
public float AngularDrag;
public float KuttaLift;
public float MagnusLift;
public static GeomFluidCoefficients Default = new GeomFluidCoefficients() {
BluntDrag = 5f, SlenderDrag = .25f, AngularDrag = 1.5f, KuttaLift = 1f, MagnusLift = 1f
};
}
}