Add support for fluid coefficients to Unity plugin
This commit is contained in:
@@ -42,12 +42,17 @@ public struct MjGeomSettings {
|
|||||||
[Tooltip("Shape used for fluid simulation.")]
|
[Tooltip("Shape used for fluid simulation.")]
|
||||||
public FluidShapeTypes FluidShapeType;
|
public FluidShapeTypes FluidShapeType;
|
||||||
|
|
||||||
|
[Tooltip("Dimensionless coefficients of fluid interaction model.")]
|
||||||
|
public GeomFluidCoefficients FluidCoefficients;
|
||||||
|
|
||||||
|
|
||||||
// Default geom settings.
|
// Default geom settings.
|
||||||
public static MjGeomSettings Default = new MjGeomSettings() {
|
public static MjGeomSettings Default = new MjGeomSettings() {
|
||||||
Solver = GeomSolver.Default,
|
Solver = GeomSolver.Default,
|
||||||
Filtering = CollisionFiltering.Default,
|
Filtering = CollisionFiltering.Default,
|
||||||
Friction = GeomFriction.Default,
|
Friction = GeomFriction.Default,
|
||||||
FluidShapeType = FluidShapeTypes.None
|
FluidShapeType = FluidShapeTypes.None,
|
||||||
|
FluidCoefficients = GeomFluidCoefficients.Default
|
||||||
};
|
};
|
||||||
|
|
||||||
public void FromMjcf(XmlElement mjcf) {
|
public void FromMjcf(XmlElement mjcf) {
|
||||||
@@ -85,9 +90,19 @@ public struct MjGeomSettings {
|
|||||||
Friction.Torsional = friction[1];
|
Friction.Torsional = friction[1];
|
||||||
Friction.Rolling = friction[2];
|
Friction.Rolling = friction[2];
|
||||||
|
|
||||||
// Fluid shape settings.
|
// Fluid settings.
|
||||||
FluidShapeType = mjcf.GetEnumAttribute<FluidShapeTypes>(
|
FluidShapeType = mjcf.GetEnumAttribute<FluidShapeTypes>(
|
||||||
"fluidshape", FluidShapeTypes.None, ignoreCase: true);
|
"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) {
|
public void ToMjcf(XmlElement mjcf) {
|
||||||
@@ -110,8 +125,10 @@ public struct MjGeomSettings {
|
|||||||
// Inertia and friction settings.
|
// Inertia and friction settings.
|
||||||
mjcf.SetAttribute("friction", MjEngineTool.MakeLocaleInvariant($"{Friction.Sliding} {Friction.Torsional} {Friction.Rolling}"));
|
mjcf.SetAttribute("friction", MjEngineTool.MakeLocaleInvariant($"{Friction.Sliding} {Friction.Torsional} {Friction.Rolling}"));
|
||||||
|
|
||||||
// Fluid shape settings.
|
// Fluid settings.
|
||||||
mjcf.SetAttribute("fluidshape", FluidShapeType.ToString().ToLower());
|
mjcf.SetAttribute("fluidshape", FluidShapeType.ToString().ToLower());
|
||||||
|
mjcf.SetAttribute("fluidcoef", MjEngineTool.MakeLocaleInvariant(
|
||||||
|
$"{FluidCoefficients.BluntDrag} {FluidCoefficients.SlenderDrag} {FluidCoefficients.AngularDrag} {FluidCoefficients.KuttaLift} {FluidCoefficients.MagnusLift}"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,4 +187,17 @@ public struct GeomSolver {
|
|||||||
Margin = 0.0f, Gap = 0.0f
|
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
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,17 @@ public class MjGeomSettingsGenerationTests {
|
|||||||
_settings.ToMjcf(_mjcf);
|
_settings.ToMjcf(_mjcf);
|
||||||
Assert.That(_doc.OuterXml, Does.Contain(@"fluidshape=""ellipsoid"""));
|
Assert.That(_doc.OuterXml, Does.Contain(@"fluidshape=""ellipsoid"""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void FluidCoefficientsMjcf() {
|
||||||
|
_settings.FluidCoefficients.BluntDrag = 2f;
|
||||||
|
_settings.FluidCoefficients.SlenderDrag = 3f;
|
||||||
|
_settings.FluidCoefficients.AngularDrag = 4f;
|
||||||
|
_settings.FluidCoefficients.KuttaLift = 5f;
|
||||||
|
_settings.FluidCoefficients.MagnusLift = 6f;
|
||||||
|
_settings.ToMjcf(_mjcf);
|
||||||
|
Assert.That(_doc.OuterXml, Does.Contain(@"fluidcoef=""2 3 4 5 6"""));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
@@ -215,5 +226,16 @@ public class MjGeomSettingsParsingTests {
|
|||||||
MjGeomSettings.FluidShapeTypes.Ellipsoid
|
MjGeomSettings.FluidShapeTypes.Ellipsoid
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void FluidCoefficientsMjcf() {
|
||||||
|
_mjcf.SetAttribute("fluidcoef", "2 3 4 5 6");
|
||||||
|
_settings.FromMjcf(_mjcf);
|
||||||
|
Assert.That(_settings.FluidCoefficients.BluntDrag, Is.EqualTo(2));
|
||||||
|
Assert.That(_settings.FluidCoefficients.SlenderDrag, Is.EqualTo(3));
|
||||||
|
Assert.That(_settings.FluidCoefficients.AngularDrag, Is.EqualTo(4));
|
||||||
|
Assert.That(_settings.FluidCoefficients.KuttaLift, Is.EqualTo(5));
|
||||||
|
Assert.That(_settings.FluidCoefficients.MagnusLift, Is.EqualTo(6));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user