From 6bd3e52c071e6254657cc82f07d1597546bb4cec Mon Sep 17 00:00:00 2001 From: Phillip Date: Wed, 9 Feb 2011 00:09:05 +0000 Subject: --- src/tesseract/objects/ChainLink.java | 140 +++++++++++++++++++++++++++++++++ src/tesseract/objects/Icosahedron.java | 43 +++++++--- src/tesseract/objects/Toroid.java | 137 ++++++++++++++++++++++++++++++++ 3 files changed, 311 insertions(+), 9 deletions(-) create mode 100644 src/tesseract/objects/ChainLink.java create mode 100644 src/tesseract/objects/Toroid.java (limited to 'src/tesseract/objects') 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(); + //} +} -- cgit v1.2.3