diff options
-rw-r--r-- | src/alden/CollisionDetector.java | 28 | ||||
-rw-r--r-- | src/alden/HalfSpace.java | 28 | ||||
-rw-r--r-- | src/tesseract/TesseractUI.java | 28 | ||||
-rw-r--r-- | src/tesseract/World.java | 50 | ||||
-rw-r--r-- | src/tesseract/menuitems/PlanarPolygonMenuItem.java | 2 | ||||
-rw-r--r-- | src/tesseract/objects/HalfSpace.java | 17 | ||||
-rw-r--r-- | src/tesseract/objects/PhysicalObject.java | 5 | ||||
-rw-r--r-- | src/tesseract/objects/emitters/ParticleEmitter.java | 1 |
8 files changed, 113 insertions, 46 deletions
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<Vector3f> 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 @@ -96,18 +96,11 @@ 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<PhysicalObject> 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; |