Hi,
I'm trying to create an application that displays a Shape3D object using a
triangle strip array. The program works but I have encountered some
problems along the way.
When I try to rotate my Shape3D object (using the PickRotateBehavior), the
object seems to rotate around the wrong axis. What am I doing wrong?
It also seems like my code for centering the object (the setViewpoint
method)
does not work 100%. I have too manually zoom out, to see the whole object.
I read somewhere that you should set the setBackClipDistance method to
solve this problem, but that does not seem to work.
Best Regards,
Roger Berggren
---
Here's the source:
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.picking.behaviors.*;
import com.sun.j3d.utils.picking.*;
import java.util.Enumeration;
public class DatReader extends Applet
{
public BranchGroup createSceneGraph(Canvas3D canvas3D)
{
BranchGroup objRoot = new BranchGroup();
objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
objRoot.setCapability(BranchGroup.ALLOW_BOUNDS_READ);
objRoot.setCapability(BranchGroup.ALLOW_AUTO_COMPUTE_BOUNDS_WRITE);
TransformGroup objTransform = new TransformGroup();
objTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTransform.setCapability(BranchGroup.ALLOW_PICKABLE_READ);
objTransform.setCapability(BranchGroup.ALLOW_PICKABLE_WRITE);
objTransform.setCapability(BranchGroup.ENABLE_PICK_REPORTING);
objRoot.addChild(objTransform);
objTransform.addChild(loadShape());
objTransform.setBoundsAutoCompute(true);
Bounds b = objTransform.getBounds();
System.out.println("The bounds is " + b);
/*MouseRotate myMouseRotate = new MouseRotate();
myMouseRotate.setTransformGroup(objTransform);
myMouseRotate.setSchedulingBounds(new BoundingSphere());
objTransform.addChild(myMouseRotate);*/
PickRotateBehavior behavior = new PickRotateBehavior(objRoot,
canvas3D, b);
behavior.setMode(PickCanvas.GEOMETRY);
objRoot.addChild(behavior);
MouseTranslate myMouseTranslate = new MouseTranslate();
myMouseTranslate.setTransformGroup(objTransform);
myMouseTranslate.setSchedulingBounds(new BoundingSphere());
objRoot.addChild(myMouseTranslate);
MouseZoom myMouseZoom = new MouseZoom();
myMouseZoom.setTransformGroup(objTransform);
myMouseZoom.setSchedulingBounds(new BoundingSphere());
objRoot.addChild(myMouseZoom);
// Let Java 3D perform optimizations on this scene graph.
objRoot.compile();
return objRoot;
}
private Shape3D loadShape()
{
Appearance app = new Appearance();
Material m = new Material() ;
m.setLightingEnable(false) ;
app.setMaterial(m) ;
PolygonAttributes pa = new PolygonAttributes();
pa.setCullFace(PolygonAttributes.CULL_NONE);
app.setPolygonAttributes(pa);
Shape3D shape = new Shape3D(new TriangleShape(), app);
shape.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
shape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
shape.setCapability(Shape3D.ENABLE_PICK_REPORTING);
PickTool.setCapabilities(shape, PickTool.INTERSECT_FULL);
// Shape3D shape = new ColorCube();
return shape;
}
public DatReader()
{
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);
BranchGroup scene = createSceneGraph(canvas3D);
SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
BoundingSphere bounds = (BoundingSphere)scene.getBounds();
View view = simpleU.getViewer().getView();
view.setBackClipDistance(150.0);
ViewingPlatform viewingPlatform = simpleU.getViewingPlatform();
TransformGroup vpTransGroup =
viewingPlatform.getViewPlatformTransform();
setViewpoint(bounds, view, vpTransGroup);
}
void setViewpoint(BoundingSphere sceneBounds, View view,
TransformGroup vpTransGroup)
{
Transform3D viewTrans = new Transform3D();
Transform3D eyeTrans = new Transform3D();
// point the view at the center of the object
Point3d center = new Point3d();
sceneBounds.getCenter(center);
double radius = sceneBounds.getRadius();
Vector3d temp = new Vector3d(center);
viewTrans.set(temp);
// pull the eye back far enough to see the whole object
double eyeDist = 1.4*radius / Math.tan(view.getFieldOfView() / 2.0);
temp.x = 0.0;
temp.y = 0.0;
temp.z = eyeDist;
eyeTrans.set(temp);
viewTrans.mul(eyeTrans);
// set the view transform
vpTransGroup.setTransform(viewTrans);
}
public static void main(String[] args)
{
Frame frame = new MainFrame(new DatReader(), 256, 256);
}
}
class TriangleShape extends TriangleStripArray
{
private static final int[] sVertCnt = { 4, 6, 6, 6, 6, 4, 4, 4, 3 };
TriangleShape()
{
super(43, GeometryArray.COORDINATES |
GeometryArray.NORMALS |
GeometryArray.COLOR_3, sVertCnt);
Point3f[] vertex = new Point3f[43];
Vector3f[] normal = new Vector3f[43];
// Adding values for strip 0 containing 4 vertices
vertex[0] = new Point3f(-7.135342f, -6.3192787f, -17.412f);
normal[0] = new Vector3f(0.0014399706f, -0.0016000351f, 0.0063999877f);
vertex[1] = new Point3f(-7.135342f, -6.3592787f, -17.424f);
normal[1] = new Vector3f(2.4002053E-4f, -4.7996474E-4f, 0.0015999969f);
vertex[2] = new Point3f(-7.095342f, -6.3192787f, -17.418f);
normal[2] = new Vector3f(4.7988846E-4f, -7.199853E-4f, 0.0031999939f);
vertex[3] = new Point3f(-7.095342f, -6.3592787f, -17.43f);
normal[3] = new Vector3f(2.4002053E-4f, -4.8004105E-4f, 0.0015999969f);
// Adding values for strip 1 containing 6 vertices
vertex[4] = new Point3f(-7.175342f, -6.3192787f, -17.4f);
normal[4] = new Vector3f(4.8004105E-4f, -1.5998825E-4f, 0.0015999969f);
vertex[5] = new Point3f(-7.175342f, -6.2792788f, -17.396f);
normal[5] = new Vector3f(6.39953E-4f, -4.0000878E-4f, 0.0031999939f);
vertex[6] = new Point3f(-7.135342f, -6.3192787f, -17.412f);
normal[6] = new Vector3f(0.0014399706f, -0.0016000351f, 0.0063999877f);
vertex[7] = new Point3f(-7.135342f, -6.2792788f, -17.404f);
normal[7] = new Vector3f(0.0012800586f, -0.0014401232f, 0.0063999877f);
vertex[8] = new Point3f(-7.095342f, -6.3192787f, -17.418f);
normal[8] = new Vector3f(4.7988846E-4f, -7.199853E-4f, 0.0031999939f);
vertex[9] = new Point3f(-7.095342f, -6.2792788f, -17.412f);
normal[9] = new Vector3f(6.401056E-4f, -7.199853E-4f, 0.0031999939f);
// Adding values for strip 2 containing 6 vertices
vertex[10] = new Point3f(-7.175342f, -6.239279f, -17.39f);
normal[10] = new Vector3f(3.199765E-4f, -3.199765E-4f, 0.0031999939f);
vertex[11] = new Point3f(-7.175342f, -6.2792788f, -17.396f);
normal[11] = new Vector3f(6.39953E-4f, -4.0000878E-4f, 0.0031999939f);
vertex[12] = new Point3f(-7.135342f, -6.239279f, -17.394f);
normal[12] = new Vector3f(8.0001756E-4f, -0.001279906f, 0.0063999877f);
vertex[13] = new Point3f(-7.135342f, -6.2792788f, -17.404f);
normal[13] = new Vector3f(0.0012800586f, -0.0014401232f, 0.0063999877f);
vertex[14] = new Point3f(-7.095342f, -6.239279f, -17.4f);
normal[14] = new Vector3f(4.8004105E-4f, -8.8004983E-4f, 0.0031999939f);
vertex[15] = new Point3f(-7.095342f, -6.2792788f, -17.412f);
normal[15] = new Vector3f(6.401056E-4f, -7.199853E-4f, 0.0031999939f);
// Adding values for strip 3 containing 6 vertices
vertex[16] = new Point3f(-7.175342f, -6.239279f, -17.39f);
normal[16] = new Vector3f(3.199765E-4f, -3.199765E-4f, 0.0031999939f);
vertex[17] = new Point3f(-7.175342f, -6.199279f, -17.388f);
normal[17] = new Vector3f(-0.0f, -7.995598E-5f, 0.0031999939f);
vertex[18] = new Point3f(-7.135342f, -6.239279f, -17.394f);
normal[18] = new Vector3f(8.0001756E-4f, -0.001279906f, 0.0063999877f);
vertex[19] = new Point3f(-7.135342f, -6.199279f, -17.388f);
normal[19] = new Vector3f(1.5991196E-4f, -9.599295E-4f, 0.0063999877f);
vertex[20] = new Point3f(-7.095342f, -6.239279f, -17.4f);
normal[20] = new Vector3f(4.8004105E-4f, -8.8004983E-4f, 0.0031999939f);
vertex[21] = new Point3f(-7.095342f, -6.199279f, -17.39f);
normal[21] = new Vector3f(1.5991196E-4f, -6.39953E-4f, 0.0031999939f);
// Adding values for strip 4 containing 6 vertices
vertex[22] = new Point3f(-7.175342f, -6.159279f, -17.388f);
normal[22] = new Vector3f(-2.4002053E-4f, -0.0f, 0.0015999969f);
vertex[23] = new Point3f(-7.175342f, -6.199279f, -17.388f);
normal[23] = new Vector3f(-0.0f, -7.995598E-5f, 0.0031999939f);
vertex[24] = new Point3f(-7.135342f, -6.159279f, -17.382f);
normal[24] = new Vector3f(-3.199765E-4f, -0.0016000351f, 0.0063999877f);
vertex[25] = new Point3f(-7.135342f, -6.199279f, -17.388f);
normal[25] = new Vector3f(1.5991196E-4f, -9.599295E-4f, 0.0063999877f);
vertex[26] = new Point3f(-7.095342f, -6.159279f, -17.384f);
normal[26] = new Vector3f(1.6006455E-4f, -8.799735E-4f, 0.0031999939f);
vertex[27] = new Point3f(-7.095342f, -6.199279f, -17.39f);
normal[27] = new Vector3f(1.5991196E-4f, -6.39953E-4f, 0.0031999939f);
// Adding values for strip 5 containing 4 vertices
vertex[28] = new Point3f(-7.135342f, -6.159279f, -17.382f);
normal[28] = new Vector3f(-3.199765E-4f, -0.0016000351f, 0.0063999877f);
vertex[29] = new Point3f(-7.135342f, -6.119279f, -17.368f);
normal[29] = new Vector3f(-0.0f, -0.0010399618f, 0.0031999939f);
vertex[30] = new Point3f(-7.095342f, -6.159279f, -17.384f);
normal[30] = new Vector3f(1.6006455E-4f, -8.799735E-4f, 0.0031999939f);
vertex[31] = new Point3f(-7.095342f, -6.119279f, -17.368f);
normal[31] = new Vector3f(-0.0f, -0.0011199941f, 0.0031999939f);
// Adding values for strip 6 containing 4 vertices
vertex[32] = new Point3f(-7.135342f, -6.079279f, -17.356f);
normal[32] = new Vector3f(-0.0f, -9.600058E-4f, 0.0031999939f);
vertex[33] = new Point3f(-7.135342f, -6.119279f, -17.368f);
normal[33] = new Vector3f(-0.0f, -0.0010399618f, 0.0031999939f);
vertex[34] = new Point3f(-7.095342f, -6.079279f, -17.356f);
normal[34] = new Vector3f(-0.0f, -0.0013600145f, 0.0031999939f);
vertex[35] = new Point3f(-7.095342f, -6.119279f, -17.368f);
normal[35] = new Vector3f(-0.0f, -0.0011199941f, 0.0031999939f);
// Adding values for strip 7 containing 4 vertices
vertex[36] = new Point3f(-7.135342f, -6.079279f, -17.356f);
normal[36] = new Vector3f(-0.0f, -9.600058E-4f, 0.0031999939f);
vertex[37] = new Point3f(-7.135342f, -6.039279f, -17.344f);
normal[37] = new Vector3f(-4.0000878E-4f, -4.8004105E-4f,
0.0015999969f);
vertex[38] = new Point3f(-7.095342f, -6.079279f, -17.356f);
normal[38] = new Vector3f(-0.0f, -0.0013600145f, 0.0031999939f);
vertex[39] = new Point3f(-7.095342f, -6.039279f, -17.334f);
normal[39] = new Vector3f(-8.0002233E-4f, -0.0015200028f, 0.003200013f);
// Adding values for strip 8 containing 3 vertices
vertex[40] = new Point3f(-7.135342f, -6.039279f, -17.344f);
normal[40] = new Vector3f(-4.0000878E-4f, -4.8004105E-4f,
0.0015999969f);
vertex[41] = new Point3f(-7.095342f, -5.9992785f, -17.318f);
normal[41] = new Vector3f(0.0f, 0.0f, 1.0f);
vertex[42] = new Point3f(-7.095342f, -6.039279f, -17.334f);
normal[42] = new Vector3f(-8.0002233E-4f, -0.0015200028f, 0.003200013f);
// Setting Colors
Color3f colors[] = new Color3f[3];
colors[0] = new Color3f(0.0f, 0.0f, 1.0f);
colors[1] = new Color3f(1.0f, 1.0f, 0.0f);
colors[2] = new Color3f(0.5f, 0.5f, 0.5f);
Color3f clrs[] = new Color3f[43];
for (int i = 0; i < 43; i++)
{
clrs[i] = colors[i%3];
}
setCoordinates(0, vertex);
setNormals(0, normal);
setColors(0, clrs);
}
}
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".