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".

Reply via email to