From fc40e7f6e3165a002326c92401c17951b7048a32 Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Fri, 28 Jan 2011 18:52:51 +0000 Subject: And we now have a basic 3d world :D --- src/tesseract/objects/Forceable.java | 26 +++++++ src/tesseract/objects/ForceableObject.java | 89 ++++++++++++++++++++++ src/tesseract/objects/Particle.java | 80 ++++++++++++++++++++ src/tesseract/objects/Physical.java | 16 ++++ src/tesseract/objects/PhysicalObject.java | 117 +++++++++++++++++++++++++++++ 5 files changed, 328 insertions(+) create mode 100644 src/tesseract/objects/Forceable.java create mode 100644 src/tesseract/objects/ForceableObject.java create mode 100644 src/tesseract/objects/Particle.java create mode 100644 src/tesseract/objects/Physical.java create mode 100644 src/tesseract/objects/PhysicalObject.java (limited to 'src/tesseract/objects') diff --git a/src/tesseract/objects/Forceable.java b/src/tesseract/objects/Forceable.java new file mode 100644 index 0000000..bbbbc9f --- /dev/null +++ b/src/tesseract/objects/Forceable.java @@ -0,0 +1,26 @@ +package tesseract.objects; + +import javax.vecmath.Vector3f; + +/** + * Objects that can have forces applied to them implement this interface. + * + * @author Jesse Morgan + */ +public interface Forceable extends Physical { + /** + * Apply a new force to this object. + * @param force The force to apply. + */ + void addForce(final Vector3f force); + + /** + * @return The inverse mass of the object. + */ + float getInverseMass(); + + /** + * @return Get the velocity of the object. + */ + Vector3f getVelocity(); +} diff --git a/src/tesseract/objects/ForceableObject.java b/src/tesseract/objects/ForceableObject.java new file mode 100644 index 0000000..3100a5a --- /dev/null +++ b/src/tesseract/objects/ForceableObject.java @@ -0,0 +1,89 @@ +package tesseract.objects; + +import java.util.List; + +import javax.vecmath.Vector3f; + +/** + * This class is the an abstract parent class for forceable objects. + * + * @author Jesse Morgan + */ +public class ForceableObject extends PhysicalObject implements Forceable { + /** + * The inverse of the object's mass. + */ + protected float myInverseMass; + + /** + * Object's velocity. + */ + private Vector3f myVelocity; + + /** + * Sum of all the forces affecting this object. + */ + private Vector3f myForces; + + /** + * Construct a new ForceableObject. + * + * @param position Initial Position. + * @param mass Initial Mass. + */ + public ForceableObject(final Vector3f position, final float mass) { + super(position); + + myInverseMass = 1 / mass; + myVelocity = new Vector3f(0, 0, 0); + myForces = new Vector3f(0, 0, 0); + } + + /** + * @return The inverse mass of the object. + */ + public float getInverseMass() { + return myInverseMass; + } + + /** + * @return Get the velocity of the object. + */ + public Vector3f getVelocity() { + return myVelocity; + } + + /** + * Apply a new force to this object. + * @param force The force to apply. + */ + public void addForce(final Vector3f force) { + myForces.add(force); + } + + /** + * Update the state of the forceable object. + * + * @param duration The length of time that has passed. + * @return A list of new objects to add to the world. + */ + public List updateState(final float duration) { + List children = super.updateState(duration); + + // The force vector now becomes the acceleration vector. + myForces.scale(myInverseMass); + myPosition.scaleAdd(duration, myVelocity, myPosition); + myPosition.scaleAdd(duration * duration / 2, myForces, myPosition); + myVelocity.scaleAdd(duration, myForces, myVelocity); + + // The force vector is cleared. + myForces.x = 0; + myForces.y = 0; + myForces.z = 0; + + updateTransformGroup(); + + return children; + } + +} diff --git a/src/tesseract/objects/Particle.java b/src/tesseract/objects/Particle.java new file mode 100644 index 0000000..8307c55 --- /dev/null +++ b/src/tesseract/objects/Particle.java @@ -0,0 +1,80 @@ +package tesseract.objects; + +import java.awt.Color; + +import javax.media.j3d.Appearance; +import javax.media.j3d.ColoringAttributes; +import javax.media.j3d.Node; +import javax.vecmath.Color3f; +import javax.vecmath.Vector3f; + +import com.sun.j3d.utils.geometry.Sphere; + +/** + * A particle object. + * + * @author Jesse Morgan + */ +public class Particle extends ForceableObject { + /** + * Rendered radius of particle. + */ + private static final float RADIUS = .004f; + + /** + * Default mass. + */ + private static final float DEFAULT_MASS = 1; + + /** + * Number of divisions in the sphere. + */ + private static final int DIVISIONS = 8; + + /** + * Create a new Particle. + * + * @param position Initial position. + * @param mass Initial mass. + * @param color Initial color. Null for random. + */ + public Particle(final Vector3f position, final float mass, + final Color3f color) { + super(position, mass); + + getTransformGroup().addChild(createShape(color)); + } + + /** + * Create a new Particle. + * + * @param position Initial position. + * @param color Initial color. Null for random. + */ + public Particle(final Vector3f position, final Color3f color) { + this(position, DEFAULT_MASS, color); + } + + /** + * Create a new particle of the give color. + * + * @param theColor The particle color or null for random. + * @return A sphere to visually represent the particle. + */ + private Node createShape(final Color3f theColor) { + Color3f color = theColor; + + 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, DIVISIONS, appearance); + } + +} diff --git a/src/tesseract/objects/Physical.java b/src/tesseract/objects/Physical.java new file mode 100644 index 0000000..abf8c0f --- /dev/null +++ b/src/tesseract/objects/Physical.java @@ -0,0 +1,16 @@ +package tesseract.objects; + +import javax.vecmath.Vector3f; + +/** + * This interface is applied to any object that has a position in the world. + * + * @author Jesse Morgan + */ +public interface Physical { + + /** + * @return The position of the object in the world. + */ + Vector3f getPosition(); +} diff --git a/src/tesseract/objects/PhysicalObject.java b/src/tesseract/objects/PhysicalObject.java new file mode 100644 index 0000000..11ae9d2 --- /dev/null +++ b/src/tesseract/objects/PhysicalObject.java @@ -0,0 +1,117 @@ +package tesseract.objects; + +import java.util.List; + +import javax.media.j3d.BranchGroup; +import javax.media.j3d.Group; +import javax.media.j3d.Transform3D; +import javax.media.j3d.TransformGroup; +import javax.vecmath.Vector3f; + +/** + * This class is the parent of all objects in the world. + * + * Note: The constructor of a child class must add its shape + * to the transform group for it to be visible. + * + * @author Jesse Morgan + */ +public abstract class PhysicalObject implements Physical { + /** + * The object's current position. + */ + protected Vector3f myPosition; + + /** + * BranchGroup of the object. + */ + private BranchGroup myBranchGroup; + + /** + * TransformGroup for the object. + */ + private TransformGroup myTransformGroup; + + /** + * Does the object still exist in the world. + */ + protected boolean myExistance; + + /** + * Constructor for a PhysicalObject. + * + * @param position Initial position. + */ + + public PhysicalObject(final Vector3f position) { + myPosition = new Vector3f(position); + + myExistance = true; + + myTransformGroup = new TransformGroup(); + myTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); + + myBranchGroup = new BranchGroup(); + myBranchGroup.setCapability(BranchGroup.ALLOW_DETACH); + myBranchGroup.addChild(myTransformGroup); + + updateTransformGroup(); + } + + /** + * @return The object's position. + */ + public Vector3f getPosition() { + return myPosition; + } + + /** + * @return The transform group of the object. + */ + protected TransformGroup getTransformGroup() { + return myTransformGroup; + } + + + /** + * @return Get the BranchGroup. + */ + public Group getGroup() { + return myBranchGroup; + } + + /** + * Remove the object from the world. + */ + public void detach() { + myBranchGroup.detach(); + myExistance = false; + } + + /** + * Does this object still exist. + * @return true if it exists. + */ + public boolean isExisting() { + return myExistance; + } + + /** + * Update the TransformGroup to the new position. + */ + protected void updateTransformGroup() { + Transform3D tmp = new Transform3D(); + tmp.setTranslation(myPosition); + myTransformGroup.setTransform(tmp); + } + + /** + * Update the state of the object. + * @param duration How much time has passed. + * @return New objects to add to the world. + */ + public List updateState(final float duration) { + return null; + } + +} -- cgit v1.2.3