summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2011-01-28 05:56:14 +0000
committerJesse Morgan <jesse@jesterpm.net>2011-01-28 05:56:14 +0000
commit2185445ba5be7669ecbd05d22a22e7b85deb83ab (patch)
treea91f9b48b765fe2885561b4fab96a2ab4649ca2e /src
parentddce3349df1e295b8a3fe6249a8221454761b8ce (diff)
Gettin somee more incomplete code into svn
Diffstat (limited to 'src')
-rw-r--r--src/tesseract/Forceable.java12
-rw-r--r--src/tesseract/Particle.java90
-rw-r--r--src/tesseract/PhysicalObject.java121
3 files changed, 223 insertions, 0 deletions
diff --git a/src/tesseract/Forceable.java b/src/tesseract/Forceable.java
new file mode 100644
index 0000000..aedf42f
--- /dev/null
+++ b/src/tesseract/Forceable.java
@@ -0,0 +1,12 @@
+package tesseract;
+
+import javax.vecmath.Vector3f;
+
+/**
+ * Objects that can have forces applied to them implement this interface.
+ *
+ * @author Jesse Morgan
+ */
+public interface Forceable {
+ public void addForce(final Vector3f force);
+}
diff --git a/src/tesseract/Particle.java b/src/tesseract/Particle.java
new file mode 100644
index 0000000..d0d373b
--- /dev/null
+++ b/src/tesseract/Particle.java
@@ -0,0 +1,90 @@
+package tesseract;
+
+import com.sun.j3d.utils.geometry.*;
+import java.awt.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+public class Particle 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 Particle(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/PhysicalObject.java b/src/tesseract/PhysicalObject.java
new file mode 100644
index 0000000..b334082
--- /dev/null
+++ b/src/tesseract/PhysicalObject.java
@@ -0,0 +1,121 @@
+package tesseract;
+
+import java.awt.Color;
+
+import javax.media.j3d.Appearance;
+import javax.media.j3d.BranchGroup;
+import javax.media.j3d.ColoringAttributes;
+import javax.media.j3d.Group;
+import javax.media.j3d.Node;
+import javax.media.j3d.Transform3D;
+import javax.media.j3d.TransformGroup;
+import javax.vecmath.Color3f;
+import javax.vecmath.Vector3f;
+
+import com.sun.j3d.utils.geometry.Sphere;
+
+/**
+ * This class is the parent of all objects in the world.
+ *
+ * @author Jesse Morgan
+ */
+public abstract class PhysicalObject {
+ /**
+ * The inverse of the object's mass.
+ */
+ protected float inverseMass;
+
+ /**
+ * The object's current position.
+ */
+ private Vector3f myPosition;
+
+ /**
+ * The object's previous position.
+ */
+ private Vector3f myPrevPosition;
+
+ private Vector3f myVelocity;
+
+ private BranchGroup BG;
+ private TransformGroup TG;
+
+ public PhysicalObject(final Vector3f position, final float mass) {
+ inverseMass = 1 / mass;
+ myPosition = new Vector3f(position);
+ myPrevPosition = new Vector3f(position);
+ }
+
+ public Particle(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 myPosition;
+ }
+
+ public Vector3f getPreviousPosition() {
+ return myPrevPosition;
+ }
+
+ 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);
+ }
+}