diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2011-01-28 19:51:49 +0000 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2011-01-28 19:51:49 +0000 |
commit | 93bce11072ffec1166606ce981ac508bc7fadce6 (patch) | |
tree | a54c771e93623f262c72478db692e5ba42277829 | |
parent | fc40e7f6e3165a002326c92401c17951b7048a32 (diff) |
Roughly started some collision code following Dr. Alden's demo code.
-rw-r--r-- | src/tesseract/OldParticle.java | 92 | ||||
-rw-r--r-- | src/tesseract/World.java | 21 | ||||
-rw-r--r-- | src/tesseract/objects/Collidable.java | 10 | ||||
-rw-r--r-- | src/tesseract/objects/CollidableObject.java | 29 | ||||
-rw-r--r-- | src/tesseract/objects/CollisionInfo.java | 5 |
5 files changed, 64 insertions, 93 deletions
diff --git a/src/tesseract/OldParticle.java b/src/tesseract/OldParticle.java deleted file mode 100644 index ca77acb..0000000 --- a/src/tesseract/OldParticle.java +++ /dev/null @@ -1,92 +0,0 @@ -package tesseract; - -import com.sun.j3d.utils.geometry.*; -import java.awt.*; -import javax.media.j3d.*; -import javax.vecmath.*; - -import tesseract.objects.Forceable; - -public class OldParticle implements Forceable { - private float inverseMass; - private Vector3f position, prevPosition; - private Vector3f velocity; - private Vector3f force; - private BranchGroup BG; - private TransformGroup TG; - - private static final float RADIUS = 0.004f; - - public OldParticle(Color3f color, Vector3f position, Vector3f velocity) { - inverseMass = 1; - this.position = new Vector3f(position); - prevPosition = new Vector3f(position); - this.velocity = new Vector3f(velocity); - force = new Vector3f(); - TG = new TransformGroup(); - TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - TG.addChild(createShape(color)); - BG = new BranchGroup(); - BG.setCapability(BranchGroup.ALLOW_DETACH); - BG.addChild(TG); - updateTransformGroup(); - } - - public float getInverseMass() { - return inverseMass; - } - - public Vector3f getPosition() { - return position; - } - - public Vector3f getPreviousPosition() { - return prevPosition; - } - - public Vector3f getVelocity() { - return velocity; - } - - public Group getGroup() { - return BG; - } - - public void detach() { - BG.detach(); - } - - public void addForce(Vector3f force) { - this.force.add(force); - } - - public void updateState(float duration) { - // The force vector now becomes the acceleration vector. - force.scale(inverseMass); - prevPosition.set(position); - position.scaleAdd(duration, velocity, position); - position.scaleAdd(duration * duration / 2, force, position); - velocity.scaleAdd(duration, force, velocity); - // The force vector is cleared. - force.x = force.y = force.z = 0; - updateTransformGroup(); - } - - public void updateTransformGroup() { - Transform3D tmp = new Transform3D(); - tmp.setTranslation(position); - TG.setTransform(tmp); - } - - private Node createShape(Color3f color) { - ColoringAttributes cAttr; - if (color == null) { - Color randomColor = Color.getHSBColor((float)Math.random(), 1, 1); - color = new Color3f(randomColor); - } - cAttr = new ColoringAttributes(color, ColoringAttributes.FASTEST); - Appearance appearance = new Appearance(); - appearance.setColoringAttributes(cAttr); - return new Sphere(RADIUS, 0, 8, appearance); - } -} diff --git a/src/tesseract/World.java b/src/tesseract/World.java index 470990b..7da6058 100644 --- a/src/tesseract/World.java +++ b/src/tesseract/World.java @@ -17,6 +17,8 @@ import javax.vecmath.Point3d; import javax.vecmath.Vector3f; import tesseract.forces.Force; +import tesseract.objects.Collidable; +import tesseract.objects.CollisionInfo; import tesseract.objects.Forceable; import tesseract.objects.PhysicalObject; @@ -46,6 +48,11 @@ public class World { */ private List<Force> myForces; + /** + * Objects that can be collided into, a subset of myObjects. + */ + private List<Collidable> myCollidables; + //private List<ParticleEmitter> emitters; //private boolean enableEmitters; @@ -74,6 +81,7 @@ public class World { myForces = new LinkedList<Force>(); myObjects = new LinkedList<PhysicalObject>(); + myCollidables = new LinkedList<Collidable>(); // TODO: Should this go here? myScene = new BranchGroup(); @@ -162,7 +170,14 @@ public class World { children.addAll(newChildren); } - // TODO: Eventually check for collisions here. + // Check for collisions + for (Collidable collidable : myCollidables) { + if (collidable.hasCollision(obj)) { + // Resolve the collision + CollisionInfo ci = collidable.calculateCollision(obj); + collidable.resolveCollision(obj, ci); + } + } // If it leaves the bounds of the world, DESTROY IT if (!obj.isExisting() @@ -197,6 +212,10 @@ public class World { public void addObject(final PhysicalObject obj) { myScene.addChild(obj.getGroup()); myObjects.add(obj); + + if (obj instanceof Collidable) { + myCollidables.add((Collidable) obj); + } } /** diff --git a/src/tesseract/objects/Collidable.java b/src/tesseract/objects/Collidable.java new file mode 100644 index 0000000..48bf40b --- /dev/null +++ b/src/tesseract/objects/Collidable.java @@ -0,0 +1,10 @@ +package tesseract.objects; + +public interface Collidable extends Physical { + + boolean hasCollision(final Physical obj); + + CollisionInfo calculateCollision(final Physical obj); + + void resolveCollision(final Physical obj, final CollisionInfo collision); +} diff --git a/src/tesseract/objects/CollidableObject.java b/src/tesseract/objects/CollidableObject.java new file mode 100644 index 0000000..3ab00af --- /dev/null +++ b/src/tesseract/objects/CollidableObject.java @@ -0,0 +1,29 @@ +package tesseract.objects; + +import javax.vecmath.Vector3f; + +public class CollidableObject extends PhysicalObject implements Collidable { + + public CollidableObject(Vector3f position) { + super(position); + } + + @Override + public CollisionInfo calculateCollision(Physical obj) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean hasCollision(Physical obj) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void resolveCollision(Physical obj, CollisionInfo collision) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/tesseract/objects/CollisionInfo.java b/src/tesseract/objects/CollisionInfo.java new file mode 100644 index 0000000..3a151e0 --- /dev/null +++ b/src/tesseract/objects/CollisionInfo.java @@ -0,0 +1,5 @@ +package tesseract.objects; + +public class CollisionInfo { + +} |