summaryrefslogtreecommitdiff
path: root/src/tesseract/objects
diff options
context:
space:
mode:
authorPhillip <pacardon@u.washington.edu>2011-02-09 00:09:05 +0000
committerPhillip <pacardon@u.washington.edu>2011-02-09 00:09:05 +0000
commit6bd3e52c071e6254657cc82f07d1597546bb4cec (patch)
treed199323d8ab8b931cd69d86220fb8eccb7c44f4d /src/tesseract/objects
parent2dc5ee863b8603fbff3447c9ffca563adb6d1282 (diff)
Diffstat (limited to 'src/tesseract/objects')
-rw-r--r--src/tesseract/objects/ChainLink.java140
-rw-r--r--src/tesseract/objects/Icosahedron.java43
-rw-r--r--src/tesseract/objects/Toroid.java137
3 files changed, 311 insertions, 9 deletions
diff --git a/src/tesseract/objects/ChainLink.java b/src/tesseract/objects/ChainLink.java
new file mode 100644
index 0000000..3655327
--- /dev/null
+++ b/src/tesseract/objects/ChainLink.java
@@ -0,0 +1,140 @@
+/*
+ * Icosahedron.java
+ * TCSS 491 Computational Worlds
+ * Phillip Cardon
+ */
+package tesseract.objects;
+
+import javax.media.j3d.Appearance;
+import javax.media.j3d.IndexedQuadArray;
+import javax.media.j3d.Material;
+import javax.media.j3d.PointArray;
+import javax.media.j3d.Shape3D;
+import javax.media.j3d.Transform3D;
+import javax.vecmath.Point3f;
+import javax.vecmath.Vector3f;
+
+import com.sun.j3d.utils.geometry.GeometryInfo;
+import com.sun.j3d.utils.geometry.NormalGenerator;
+
+/**
+ * Represents a chainlink, a streached toroid.
+ * CHAINLINK LENGHT NOT YET IMPLEMENTED
+ * @author Phillip Cardon
+ * @version 0.1a
+ */
+public class ChainLink extends ForceableObject {
+ //CONSTANTS
+ private static final int MAX_ANGLE = 120;
+
+ //FIELDS
+ private Shape3D myShape;
+
+ private float myScale;
+
+ //CONSTRUCTORS
+
+
+ /**
+ * @param position starting position.
+ * @param mass of object.
+ * @param scale mesh scale.
+ * @param sliceRadius radius of slice "flesh."
+ * @param sliceDivisions resolution of slice "flesh" circles.
+ * @param arcRadius Radius of donut circle
+ * @param arcDivisions resolution of slices on donut.
+ */
+ public ChainLink(final Vector3f position, final float mass,
+ final float scale, final float sliceRadius,
+ final int sliceDivisions, final float arcRadius,
+ final int arcDivisions) {
+ super(position, mass);
+ myScale = scale;
+ }
+
+
+ /**
+ * Creates Chain link.
+ * @param sliceRadius radius of slice "flesh."
+ * @param sliceDivisions resolution of slice "flesh" circles.
+ * @param arcRadius Radius of donut circle
+ * @param arcDivisions resolution of slices on donut.
+ */
+ public void buildToroid(final float sliceRadius, final int sliceDivisions,
+ final float arcRadius, final int arcDivisions) {
+ Point3f[][] coordinates = new Point3f[arcDivisions][sliceDivisions];
+ final float arcAngle = (float) (Math.PI * 2.0);
+ final float sliceDivisionAngle = 2 * (float) Math.PI / sliceDivisions;
+
+ for (int i = 0; i < sliceDivisions; i++) {
+ coordinates[0][i] = new Point3f(sliceRadius
+ * (float) Math.cos(i * sliceDivisionAngle), 0f, sliceRadius
+ * (float) Math.sin(i * sliceDivisionAngle));
+ }
+
+ Transform3D trans3D = new Transform3D();
+ trans3D.setTranslation(new Vector3f(arcRadius, 0, 0));
+ Transform3D tmp = new Transform3D();
+ tmp.rotZ(-arcAngle / (arcDivisions - 1));
+ trans3D.mul(tmp);
+ tmp.setIdentity();
+ tmp.setTranslation(new Vector3f(-arcRadius, 0, 0));
+ trans3D.mul(tmp);
+
+ for (int j = 1; j < arcDivisions; j++) {
+ for (int i = 0; i < sliceDivisions; i++) {
+ coordinates[j][i] = new Point3f(coordinates[j - 1][i]);
+ trans3D.transform(coordinates[j][i]);
+ coordinates[j][i].scale((float) myScale);
+ }
+ }
+
+ IndexedQuadArray geometry = new IndexedQuadArray(arcDivisions
+ * sliceDivisions, PointArray.COORDINATES, 4 * sliceDivisions
+ * (arcDivisions - 1));
+ for (int j = 0; j < arcDivisions; j++) {
+ geometry.setCoordinates(j * sliceDivisions, coordinates[j]);
+ }
+
+ int index = 0;
+ int last = 0;
+ for (int j = 0; j < arcDivisions - 2; j++) {
+ for (int i = 0; i < sliceDivisions; i++) {
+ geometry.setCoordinateIndex(index++, j * sliceDivisions + i);
+ geometry.setCoordinateIndex(index++, (j + 1) * sliceDivisions
+ + i);
+ geometry.setCoordinateIndex(index++, (j + 1) * sliceDivisions
+ + (i + 1) % sliceDivisions);
+ geometry.setCoordinateIndex(index++, j * sliceDivisions
+ + (i + 1) % sliceDivisions);
+ }
+ last = j;
+ }
+ last++;
+ for (int i = 0; i < sliceDivisions; i++) {
+ geometry.setCoordinateIndex(index++, last * sliceDivisions + i);
+ geometry.setCoordinateIndex(index++, (0) * sliceDivisions + i);
+ geometry.setCoordinateIndex(index++, (0) * sliceDivisions + (i + 1)
+ % sliceDivisions);
+ geometry.setCoordinateIndex(index++, last * sliceDivisions
+ + (i + 1) % sliceDivisions);
+ }
+
+
+ GeometryInfo gInfo = new GeometryInfo(geometry);
+ new NormalGenerator().generateNormals(gInfo);
+ gInfo.convertToIndexedTriangles();
+ Shape3D shape = new Shape3D(gInfo.getGeometryArray());
+
+ Appearance app = new Appearance();
+ Material mat = new Material();
+ mat.setDiffuseColor(1, 0, 0);
+ app.setMaterial(mat);
+ shape.setAppearance(app);
+ getTransformGroup().addChild(myShape);
+ }
+
+ //public Group getGroup(){
+ // return (Group) myTG.cloneTree();
+ //}
+}
diff --git a/src/tesseract/objects/Icosahedron.java b/src/tesseract/objects/Icosahedron.java
index 62dd045..ffeaebf 100644
--- a/src/tesseract/objects/Icosahedron.java
+++ b/src/tesseract/objects/Icosahedron.java
@@ -8,10 +8,8 @@ package tesseract.objects;
import javax.media.j3d.Appearance;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.GeometryArray;
-import javax.media.j3d.Group;
import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
-import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.TriangleArray;
import javax.vecmath.Point3f;
@@ -24,26 +22,51 @@ import com.sun.j3d.utils.geometry.NormalGenerator;
* Represents an Icosahedron, a 20 sided object who's
* faces are all equal equilateral triangles.
* @author Phillip Cardon
- * @verson 0.9a
+ * @version 0.9a
*/
public class Icosahedron extends ForceableObject {
//CONSTANTS
+ /**
+ * Angle to stop checking normals.
+ */
private static final int MAX_ANGLE = 120;
+
+ /**
+ * Default Icosohedran Scale.
+ */
private static final float DEFAULT_SCALE = 1;
+
+ /**
+ * Vertex count in Icosohedran.
+ */
private static final int NUM_VERTEX = 12;
- private static final float GOLDEN_RATIO = (float) ((1.0 + Math.sqrt(5.0)) / 2.0);
+
+ /**
+ * Golden ratio for calculating points.
+ */
+ private static final float GOLDEN_RATIO = (float) ((1.0 + Math.sqrt(5.0))
+ / 2.0);
//FIELDS
+ /**
+ * Shape object.
+ */
private Shape3D myShape;
+ /**
+ * Object scale.
+ */
private float myScale;
- private TransformGroup myTG;
//CONSTRUCTORS
/**
* Create new Icosahedron.
+ * @param position start position.
+ * @param mass start mass.
+ * @param scale of object.
*/
- public Icosahedron(final Vector3f position, final float mass, float scale) {
+ public Icosahedron(final Vector3f position, final float mass,
+ final float scale) {
this(position, mass);
myScale = scale;
}
@@ -55,9 +78,11 @@ public class Icosahedron extends ForceableObject {
public Icosahedron(final Vector3f position, final float mass) {
super(position, mass);
myScale = DEFAULT_SCALE;
- myTG = new TransformGroup();
}
+ /**
+ * Builds Icosahedron.
+ */
public void buildIcosahedron() {
// TODO Auto-generated method stub
Point3f[] coordinates = new Point3f[NUM_VERTEX];
@@ -80,7 +105,7 @@ public class Icosahedron extends ForceableObject {
coordinates[i++] = new Point3f(-1 * phi, 0, 1f);
coordinates[i++] = new Point3f(-1 * phi, 0, -1f);
- // TODO: Scaling
+ // Scaling
for (int it = 0; it < coordinates.length; it++) {
coordinates[it].scale((float) myScale);
@@ -177,7 +202,7 @@ public class Icosahedron extends ForceableObject {
GeometryInfo geo = new GeometryInfo(die);
norms.generateNormals(geo);
- Shape3D myShape = new Shape3D(geo.getGeometryArray());
+ myShape = new Shape3D(geo.getGeometryArray());
Appearance meshApp = new Appearance();
Material surface = new Material();
surface.setDiffuseColor(.9f, .05f, .05f);
diff --git a/src/tesseract/objects/Toroid.java b/src/tesseract/objects/Toroid.java
new file mode 100644
index 0000000..1961818
--- /dev/null
+++ b/src/tesseract/objects/Toroid.java
@@ -0,0 +1,137 @@
+/*
+ * Icosahedron.java
+ * TCSS 491 Computational Worlds
+ * Phillip Cardon
+ */
+package tesseract.objects;
+
+import javax.media.j3d.Appearance;
+import javax.media.j3d.IndexedQuadArray;
+import javax.media.j3d.Material;
+import javax.media.j3d.PointArray;
+import javax.media.j3d.Shape3D;
+import javax.media.j3d.Transform3D;
+import javax.vecmath.Point3f;
+import javax.vecmath.Vector3f;
+
+import com.sun.j3d.utils.geometry.GeometryInfo;
+import com.sun.j3d.utils.geometry.NormalGenerator;
+
+/**
+ * Represents a Toroid, or donut like shape.
+ * @author Phillip Cardon
+ * @version 0.9a
+ */
+public class Toroid extends ForceableObject {
+ //CONSTANTS
+ private static final int MAX_ANGLE = 120;
+ //FIELDS
+ private Shape3D myShape;
+
+ private float myScale;
+
+ //CONSTRUCTORS
+
+
+ /**
+ * @param position starting position.
+ * @param mass of object.
+ * @param scale mesh scale.
+ * @param sliceRadius radius of slice "flesh."
+ * @param sliceDivisions resolution of slice "flesh" circles.
+ * @param arcRadius Radius of donut circle
+ * @param arcDivisions resolution of slices on donut.
+ */
+ public Toroid(final Vector3f position, final float mass, final float scale,
+ final float sliceRadius, final int sliceDivisions,
+ final float arcRadius, final int arcDivisions) {
+ super(position, mass);
+ myScale = scale;
+ }
+
+
+ /**
+ * Creates donut.
+ * @param sliceRadius radius of slice "flesh."
+ * @param sliceDivisions resolution of slice "flesh" circles.
+ * @param arcRadius Radius of donut circle
+ * @param arcDivisions resolution of slices on donut.
+ */
+ public void buildToroid(final float sliceRadius, final int sliceDivisions,
+ final float arcRadius, final int arcDivisions) {
+ Point3f[][] coordinates = new Point3f[arcDivisions][sliceDivisions];
+ final float arcAngle = (float) (Math.PI * 2.0);
+ final float sliceDivisionAngle = 2 * (float) Math.PI / sliceDivisions;
+
+ for (int i = 0; i < sliceDivisions; i++) {
+ coordinates[0][i] = new Point3f(sliceRadius
+ * (float) Math.cos(i * sliceDivisionAngle), 0f, sliceRadius
+ * (float) Math.sin(i * sliceDivisionAngle));
+ }
+
+ Transform3D trans3D = new Transform3D();
+ trans3D.setTranslation(new Vector3f(arcRadius, 0, 0));
+ Transform3D tmp = new Transform3D();
+ tmp.rotZ(-arcAngle / (arcDivisions - 1));
+ trans3D.mul(tmp);
+ tmp.setIdentity();
+ tmp.setTranslation(new Vector3f(-arcRadius, 0, 0));
+ trans3D.mul(tmp);
+
+ for (int j = 1; j < arcDivisions; j++) {
+ for (int i = 0; i < sliceDivisions; i++) {
+ coordinates[j][i] = new Point3f(coordinates[j - 1][i]);
+ trans3D.transform(coordinates[j][i]);
+ coordinates[j][i].scale((float) myScale);
+ }
+ }
+
+ IndexedQuadArray geometry = new IndexedQuadArray(arcDivisions
+ * sliceDivisions, PointArray.COORDINATES, 4 * sliceDivisions
+ * (arcDivisions - 1));
+ for (int j = 0; j < arcDivisions; j++) {
+ geometry.setCoordinates(j * sliceDivisions, coordinates[j]);
+ }
+
+ int index = 0;
+ int last = 0;
+ for (int j = 0; j < arcDivisions - 2; j++) {
+ for (int i = 0; i < sliceDivisions; i++) {
+ geometry.setCoordinateIndex(index++, j * sliceDivisions + i);
+ geometry.setCoordinateIndex(index++, (j + 1) * sliceDivisions
+ + i);
+ geometry.setCoordinateIndex(index++, (j + 1) * sliceDivisions
+ + (i + 1) % sliceDivisions);
+ geometry.setCoordinateIndex(index++, j * sliceDivisions
+ + (i + 1) % sliceDivisions);
+ }
+ last = j;
+ }
+ last++;
+ for (int i = 0; i < sliceDivisions; i++) {
+ geometry.setCoordinateIndex(index++, last * sliceDivisions + i);
+ geometry.setCoordinateIndex(index++, (0) * sliceDivisions + i);
+ geometry.setCoordinateIndex(index++, (0) * sliceDivisions + (i + 1)
+ % sliceDivisions);
+ geometry.setCoordinateIndex(index++, last * sliceDivisions
+ + (i + 1) % sliceDivisions);
+ }
+
+
+ GeometryInfo gInfo = new GeometryInfo(geometry);
+ new NormalGenerator().generateNormals(gInfo);
+ gInfo.convertToIndexedTriangles();
+ Shape3D shape = new Shape3D(gInfo.getGeometryArray());
+
+ Appearance app = new Appearance();
+ Material mat = new Material();
+ mat.setDiffuseColor(1, 0, 0);
+ app.setMaterial(mat);
+ shape.setAppearance(app);
+ getTransformGroup().addChild(myShape);
+ }
+
+ //public Group getGroup(){
+ // return (Group) myTG.cloneTree();
+ //}
+}