From 180bf56774e9dabca31d69a6e0c29dcd76dab372 Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 17 Feb 2011 08:39:44 +0000 Subject: moment of inertia tensor for egg implemented --- .../menuitems/ParticleEmitterMenuItem.java | 2 ++ src/tesseract/objects/Ellipsoid.java | 41 ++++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/tesseract/menuitems/ParticleEmitterMenuItem.java b/src/tesseract/menuitems/ParticleEmitterMenuItem.java index 9373e57..404f806 100644 --- a/src/tesseract/menuitems/ParticleEmitterMenuItem.java +++ b/src/tesseract/menuitems/ParticleEmitterMenuItem.java @@ -45,6 +45,8 @@ public class ParticleEmitterMenuItem extends TesseractMenuItem { public void actionPerformed(final ActionEvent arg0) { createParameterMenu(); + + //If the default button is checked, the frame will close. final JCheckBox defaultButton = getDefaultButton(); final JFrame params = getParamFrame(); diff --git a/src/tesseract/objects/Ellipsoid.java b/src/tesseract/objects/Ellipsoid.java index 617bdb8..ac8a552 100644 --- a/src/tesseract/objects/Ellipsoid.java +++ b/src/tesseract/objects/Ellipsoid.java @@ -37,6 +37,11 @@ public class Ellipsoid extends PhysicalObject { */ private static final int DEFAULT_DIVISIONS = 50; + /** + * The radius of the base sphere + */ + private float my_radius; + /** * Create a new Ellipsoid. * @@ -54,7 +59,20 @@ public class Ellipsoid extends PhysicalObject { final Appearance appearance, final float b, final float c) { super(position, mass); + my_radius = radius; + setShape(createShape(radius, primflags, appearance, divisions, b, c)); + + final float rSq = radius * radius; + final float a = 1.0f; + + if (inverseMass != 0) { + inverseInertiaTensor.m00 = 1f / 5 / inverseMass * (b * rSq + c * rSq); + inverseInertiaTensor.m11 = 1f / 5 / inverseMass * (a * rSq + c * rSq); + inverseInertiaTensor.m22 = 1f / 5 / inverseMass * (a * rSq + b * rSq); + inverseInertiaTensor.invert(); + } + updateTransformGroup(); } /** @@ -66,21 +84,38 @@ public class Ellipsoid extends PhysicalObject { public Ellipsoid(final Vector3f position, final float radius) { super(position, DEFAULT_MASS); - setShape(createDefaultEllipsoid(radius)); + my_radius = radius; + + final float rSq = radius * radius; + final float a = 1.0f; + final float b = 1.0f; + final float c = 1.5f; + + + setShape(createDefaultEllipsoid(radius, a, b, c)); + + if (inverseMass != 0) { + inverseInertiaTensor.m00 = 1f / 5 / inverseMass * (b * rSq + c * rSq); + inverseInertiaTensor.m11 = 1f / 5 / inverseMass * (a * rSq + c * rSq); + inverseInertiaTensor.m22 = 1f / 5 / inverseMass * (a * rSq + b * rSq); + inverseInertiaTensor.invert(); + } + updateTransformGroup(); } /** * This creates a default Ellipsoid for the 2 argument constructor. * @param radius the siz of the ellipsoid */ - private TransformGroup createDefaultEllipsoid(final float radius) { + private TransformGroup createDefaultEllipsoid(final float radius, final float a, + final float b, final float c) { Sphere sphere = new Sphere(radius, new Sphere().getPrimitiveFlags() | Sphere.ENABLE_GEOMETRY_PICKING, DEFAULT_DIVISIONS); Transform3D tmp = new Transform3D(); - tmp.set(new Matrix3f(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.5f)); + tmp.set(new Matrix3f(a, 0.0f, 0.0f, 0.0f, b, 0.0f, 0.0f, 0.0f, c)); TransformGroup tg = new TransformGroup(tmp); tg.addChild(sphere); return tg; -- cgit v1.2.3