From c663dffc86a7fcec9f05aaf8a107e6200a35c2fa Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Sat, 12 Feb 2011 18:57:14 +0000 Subject: Added HalfSpaces to the bounds. Fixed collisions and particle emitters. Corrected typo in PlanarPolygonMenuItem. Added removeForce() to world and cleaned up the force adding/removing. --- src/alden/CollisionDetector.java | 28 +++++++++--- src/alden/HalfSpace.java | 28 ------------ src/tesseract/TesseractUI.java | 28 +++++++----- src/tesseract/World.java | 50 +++++++++++++++++++++- src/tesseract/menuitems/PlanarPolygonMenuItem.java | 2 +- src/tesseract/objects/HalfSpace.java | 17 ++++++++ src/tesseract/objects/PhysicalObject.java | 5 ++- .../objects/emitters/ParticleEmitter.java | 1 + 8 files changed, 113 insertions(+), 46 deletions(-) delete mode 100644 src/alden/HalfSpace.java create mode 100644 src/tesseract/objects/HalfSpace.java diff --git a/src/alden/CollisionDetector.java b/src/alden/CollisionDetector.java index f05e9b8..bb7817c 100644 --- a/src/alden/CollisionDetector.java +++ b/src/alden/CollisionDetector.java @@ -1,9 +1,27 @@ package alden; -import com.sun.j3d.utils.geometry.*; -import java.util.*; +import java.util.ArrayList; -import javax.media.j3d.*; -import javax.vecmath.*; +import javax.media.j3d.Appearance; +import javax.media.j3d.Geometry; +import javax.media.j3d.GeometryArray; +import javax.media.j3d.Group; +import javax.media.j3d.IndexedTriangleArray; +import javax.media.j3d.IndexedTriangleFanArray; +import javax.media.j3d.IndexedTriangleStripArray; +import javax.media.j3d.Node; +import javax.media.j3d.PolygonAttributes; +import javax.media.j3d.Shape3D; +import javax.media.j3d.Transform3D; +import javax.media.j3d.TriangleArray; +import javax.media.j3d.TriangleFanArray; +import javax.media.j3d.TriangleStripArray; +import javax.vecmath.Point3f; +import javax.vecmath.Tuple3f; +import javax.vecmath.Vector3f; + +import tesseract.objects.HalfSpace; + +import com.sun.j3d.utils.geometry.Primitive; @SuppressWarnings("restriction") public class CollisionDetector { @@ -325,7 +343,7 @@ public class CollisionDetector { for (int i = 0; i < group.numChildren(); i++) extractVertices(group.getChild(i), vertices); } else - throw new IllegalArgumentException("Illegal node type for vertex extraction"); + throw new IllegalArgumentException("Illegal node type for vertex extraction "); } private static void extractVertices(Geometry geometry, Transform3D transform, ArrayList vertices) { diff --git a/src/alden/HalfSpace.java b/src/alden/HalfSpace.java deleted file mode 100644 index 6e414fb..0000000 --- a/src/alden/HalfSpace.java +++ /dev/null @@ -1,28 +0,0 @@ -package alden; - -import javax.vecmath.Vector3f; - -@SuppressWarnings("restriction") -public class HalfSpace extends CollidableObject { - protected Vector3f normal; - // Right-hand side of the plane equation: Ax + By + Cz = D - protected float intercept; - - public HalfSpace(Vector3f position, Vector3f normal) { - super(Float.POSITIVE_INFINITY); - this.position.set(position); - this.normal = new Vector3f(normal); - this.normal.normalize(); - intercept = this.normal.dot(position); - } - -/* public CollisionInfo calculateCollision(Particle particle) { - if (Math.signum(normal.dot(particle.getPosition()) - intercept) == Math.signum(normal.dot(particle.getPreviousPosition()) - intercept)) - return null; - - Vector3f projection = new Vector3f(); - projection.scaleAdd(-1, position, particle.getPosition()); - float penetration = -projection.dot(normal); - return new CollisionInfo(normal, penetration); - }*/ -} diff --git a/src/tesseract/TesseractUI.java b/src/tesseract/TesseractUI.java index 99b2fa4..e7749b5 100644 --- a/src/tesseract/TesseractUI.java +++ b/src/tesseract/TesseractUI.java @@ -95,19 +95,12 @@ public class TesseractUI extends JFrame { */ private Timer myTimer; - /** - * The gravity of the world - */ - private Gravity my_gravity; - /** * UI Constructor. */ public TesseractUI() { super("Tesseract Project"); - - my_gravity = new Gravity(); - + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); myWorld = new World( @@ -166,6 +159,14 @@ public class TesseractUI extends JFrame { }); simulationMenu.add(runSim); + JMenuItem resetSim = new JCheckBoxMenuItem("Reset Simulator", true); + runSim.addActionListener(new ActionListener() { + public void actionPerformed(final ActionEvent e) { + myWorld.resetWorld(); + } + }); + simulationMenu.add(resetSim); + //Objects JMenu objectsMenu = new JMenu("Add Object"); for (JMenuItem item : myObjectMenuItems) { @@ -177,11 +178,18 @@ public class TesseractUI extends JFrame { JMenu forcesMenu = new JMenu("Add Forces"); JMenuItem gravity = new JCheckBoxMenuItem("Gravity", false); gravity.addActionListener(new ActionListener() { + private Force me; + + // Constructor + { + me = new Gravity(); + } + public void actionPerformed(ActionEvent e) { if (((JCheckBoxMenuItem) e.getSource()).isSelected()) { - myWorld.addForce(my_gravity); + myWorld.addForce(me); } else { - myWorld.addForce(my_gravity = new Gravity(-.5f)); + myWorld.removeForce(me); } } }); diff --git a/src/tesseract/World.java b/src/tesseract/World.java index 7bfe0a6..9b43b87 100644 --- a/src/tesseract/World.java +++ b/src/tesseract/World.java @@ -21,6 +21,8 @@ import javax.vecmath.Vector3f; import tesseract.forces.Force; import tesseract.objects.PhysicalObject; +import tesseract.objects.HalfSpace; + import com.sun.j3d.utils.picking.PickTool; import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior; import com.sun.j3d.utils.picking.behaviors.PickZoomBehavior; @@ -101,6 +103,7 @@ public class World { //myScene.addChild(myPickableObjects); addLights(); + addHalfspaces(); myScene.compile(); } @@ -133,6 +136,27 @@ public class World { return new Shape3D(geometry); } + + private void addHalfspaces() { + Point3d lower = new Point3d(); + Point3d upper = new Point3d(); + myVirtualWorldBounds.getLower(lower); + myVirtualWorldBounds.getUpper(upper); + + // Bottom + myObjects.add(new HalfSpace(new Vector3f(lower), new Vector3f(0, 1, 0))); + + // Top + myObjects.add(new HalfSpace(new Vector3f(upper), new Vector3f(0, -1, 0))); + + // Sides + myObjects.add(new HalfSpace(new Vector3f(upper), new Vector3f(0, 0, -1))); + myObjects.add(new HalfSpace(new Vector3f(upper), new Vector3f(-1, 0, 0))); + + myObjects.add(new HalfSpace(new Vector3f(lower), new Vector3f(0, 0, 1))); + myObjects.add(new HalfSpace(new Vector3f(lower), new Vector3f(1, 0, 0))); + + } /** * Add some standard lights to the world. @@ -193,8 +217,9 @@ public class World { // Collision Detection for (int i = 0; i < myObjects.size() - 1; i++) { - for (int j = i + 1; j < myObjects.size(); j++) + for (int j = i + 1; j < myObjects.size(); j++) { myObjects.get(i).resolveCollisions(myObjects.get(j)); + } } // Add new children to thr world. @@ -251,4 +276,27 @@ public class World { public void addForce(final Force force) { myForces.add(force); } + + /** + * Remove a force from the world. + * + * @param force The force to remove. + */ + public void removeForce(final Force force) { + myForces.remove(force); + } + + /** + * Remove all forces and objects from the world. + */ + public void resetWorld() { + myForces.clear(); + + for (PhysicalObject obj : myObjects) { + obj.detach(); + } + myObjects.clear(); + + addHalfspaces(); + } } diff --git a/src/tesseract/menuitems/PlanarPolygonMenuItem.java b/src/tesseract/menuitems/PlanarPolygonMenuItem.java index 6759f19..e85cfbc 100644 --- a/src/tesseract/menuitems/PlanarPolygonMenuItem.java +++ b/src/tesseract/menuitems/PlanarPolygonMenuItem.java @@ -76,7 +76,7 @@ public class PlanarPolygonMenuItem extends TesseractMenuItem { setMass(mass); if (event.getSource() == enterButton) { - myWorld.addObject(new Ellipsoid(getPosition(), getRadius())); + myWorld.addObject(new PlanarPolygon(getPosition(), getRadius())); params.dispose(); } } diff --git a/src/tesseract/objects/HalfSpace.java b/src/tesseract/objects/HalfSpace.java new file mode 100644 index 0000000..df3f715 --- /dev/null +++ b/src/tesseract/objects/HalfSpace.java @@ -0,0 +1,17 @@ +package tesseract.objects; + +import javax.vecmath.Vector3f; + +public class HalfSpace extends PhysicalObject { + public Vector3f normal; + // Right-hand side of the plane equation: Ax + By + Cz = D + public float intercept; + + public HalfSpace(Vector3f position, Vector3f normal) { + super(position, Float.POSITIVE_INFINITY); + + this.normal = new Vector3f(normal); + this.normal.normalize(); + this.intercept = this.normal.dot(position); + } +} diff --git a/src/tesseract/objects/PhysicalObject.java b/src/tesseract/objects/PhysicalObject.java index 2634ca2..73e0c91 100644 --- a/src/tesseract/objects/PhysicalObject.java +++ b/src/tesseract/objects/PhysicalObject.java @@ -22,9 +22,12 @@ import com.sun.j3d.utils.geometry.Primitive; * @author Jesse Morgan */ public class PhysicalObject extends CollidableObject { + protected boolean collidable; + public PhysicalObject(final Vector3f thePosition, final float mass) { super(mass); this.position.set(thePosition); + collidable = true; } public List spawnChildren(final float duration) { @@ -67,7 +70,7 @@ public class PhysicalObject extends CollidableObject { } public void resolveCollisions(final PhysicalObject other) { - if (this.node != null && other.node != null) { + if (collidable && other.collidable) { super.resolveCollisions(other); } } diff --git a/src/tesseract/objects/emitters/ParticleEmitter.java b/src/tesseract/objects/emitters/ParticleEmitter.java index 5aa391a..15c94a9 100644 --- a/src/tesseract/objects/emitters/ParticleEmitter.java +++ b/src/tesseract/objects/emitters/ParticleEmitter.java @@ -43,6 +43,7 @@ public class ParticleEmitter extends PhysicalObject { final Color3f color) { super(position, Float.POSITIVE_INFINITY); + this.collidable = false; myCount = 0; myFrequency = frequency; -- cgit v1.2.3