summaryrefslogtreecommitdiff
path: root/src/tesseract/Particle.java
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/tesseract/Particle.java
parentddce3349df1e295b8a3fe6249a8221454761b8ce (diff)
Gettin somee more incomplete code into svn
Diffstat (limited to 'src/tesseract/Particle.java')
-rw-r--r--src/tesseract/Particle.java90
1 files changed, 90 insertions, 0 deletions
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);
+ }
+}