Chien Yang,
Here is the code. It mostly comes from the code of bug 4910683 submitted by Peter 
Antoniac(Thanks goes to him:-) Until I carefully read through this piece of code have 
I realized we are having the same problem, forgive me, anyway, I am a newcomer to 
j3d.....), What I have changed is in line 80:
The orginal code is:
pCHandle=new CollisionHandler(pBox);
I change this to:
pCHandle=new CollisionHandler(pTGroup_1); 

When press \'R\' or \'r\', NullPointerException will come out


---------------BEGIN OF CODE----------------------
/*
 * testCollision.java
 *
 * Modified on line 80, May 21, 2004, 0:01 PM, by Samuel Liu
 *
 * Created on October 17, 2002, 11:39 PM By Peter Antoniac
 *
 */
import javax.media.j3d.*;
import java .awt.*;
import javax.vecmath.*;

/**
 *
 * @author  Peter Antoniac
 */
public class testCollision extends javax.swing.JFrame {
  public testCollision() {
    super("Testing Collision removal");
    setSize(300,400);
    getContentPane().setLayout(new java.awt.BorderLayout());
    setBackground(new java.awt.Color(255, 255, 255));
    setName("Testing Window");
    // Create the 3D Objects
    pGTmpl3D = new GraphicsConfigTemplate3D();
    pGConf = getGraphicsConfiguration();
    pGDev = pGConf.getDevice();
    pCanvas3D = new Canvas3D(pGTmpl3D.getBestConfiguration(pGDev.getConfigurations()));
    getContentPane().add(pCanvas3D);
    setVisible(true);
    pUniverse = new VirtualUniverse();
    pLocale = new Locale(pUniverse);
    pView = new View();
    pVPlatform = new ViewPlatform();
    pBGroup_0 = new BranchGroup();
    pTGroup_0 = new TransformGroup();
    /**
     * Construct the ViewBranch
     */
    pView.addCanvas3D(pCanvas3D);
    pView.setPhysicalBody(new PhysicalBody());
    pView.setPhysicalEnvironment(new PhysicalEnvironment());
    pTGroup_0.addChild(pVPlatform);
    pBGroup_0.addChild(pTGroup_0);
    pLocale.addBranchGraph(pBGroup_0);
    pView.attachViewPlatform(pVPlatform);
    
    /**
     * Creating the Content Branch including the Collision...
     */
    pBGroup_1 = new BranchGroup();
    pTGroup_1 = new TransformGroup();
    // Capabilities settings
    pBGroup_1.setCapability(BranchGroup.ALLOW_DETACH);
    // this is for debugging only!
    pBGroup_1.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
    /** this is for moving the node
     * pTGroup_1.setCapability(Node.ALLOW_LOCAL_TO_VWORLD_READ);
     * pTGroup_1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
     * pTGroup_1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
     * pTGroup_1.setCapability(Group.ALLOW_CHILDREN_EXTEND);
     */
    pTGroup_1.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
    pTGroup_1.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
    pTGroup_1.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
    pAppearance = new Appearance();
    pAppearance.setMaterial(new Material(
    new Color3f(1,0,0), //ambient color
    new Color3f(1,0,0), //emisive color
    new Color3f(1,0,0), //difuse color
    new Color3f(1,1,1), //specular color
    100f));
    pBox=new com.sun.j3d.utils.geometry.Box(0.2f,0.2f,0.2f,pAppearance);
    pT3D_0 = new Transform3D();
    pT3D_1 = new Transform3D();
    pT3D_0.setTranslation(new Vector3d(0,0,-4));
    pT3D_1.rotX(Math.PI/4);
    pT3D_0.mul(pT3D_1);
    pTGroup_1.setTransform(pT3D_0);
    pTGroup_1.addChild(pBox);
    pBGroup_1.addChild(pTGroup_1);
    // Setting the collision object
    pCHandle=new CollisionHandler(pTGroup_1); //Here I change it. Samuel Liu
    pCHandle.setSchedulingBounds(new BoundingSphere(new Point3d(0,0,0),0.4d));
    pTGroup_1.addChild(pCHandle);
    // Live
    pLocale.addBranchGraph(pBGroup_1);
    
    //    setResizable(false);
    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    addWindowListener(new java.awt.event.WindowAdapter() {
      public void windowClosing(java.awt.event.WindowEvent evt) {
        exitForm(evt);
      }
    });
    pCanvas3D.addKeyListener(new java.awt.event.KeyAdapter() {
      public void keyPressed(java.awt.event.KeyEvent e) {
        switch (e.getKeyChar()) {
          case \'P\':
          case \'p\':
            if (!pBGroup_1.isLive()){
              System.out.println("Placing the box");
              pLocale.addBranchGraph(pBGroup_1);
            }
            break;
          case \'R\':
          case \'r\':
            if (pBGroup_1.isLive()&&pCHandle.isLive()){
              System.out.println("Removing the box");
              // Using Locale.removeBranchGraph or detach has the same effect! :((
              // pLocale.removeBranchGraph(pBGroup_1);
              pBGroup_1.detach();
            }
            break;
          default:
            System.out.println("Wrong key. Press P or R keys!");
        }
      }
    });
    pCanvas3D.requestFocus();
    pack();
  }
  private void exitForm(java.awt.event.WindowEvent evt) {
    System.exit(0);
  }
  /**
   * @param args the command line arguments
   */
  public static void main(String args[]) {
    new testCollision().show();
  }
  // Variables declaration
  private VirtualUniverse pUniverse;
  private Canvas3D pCanvas3D;
  private Locale pLocale;
  private View pView;
  private ViewPlatform pVPlatform;
  private TransformGroup pTGroup_0,pTGroup_1;
  private BranchGroup pBGroup_0,pBGroup_1;
  private Transform3D pT3D_0,pT3D_1;
  private Appearance pAppearance;
  private com.sun.j3d.utils.geometry.Box pBox;
  private GraphicsConfigTemplate3D pGTmpl3D;
  private GraphicsDevice pGDev;
  private GraphicsConfiguration pGConf;
  private CollisionHandler pCHandle;
  
  class CollisionHandler extends Behavior {
    
    /** Creates a new instance of CollissionHandler */
    public CollisionHandler(Node pNode) {
      armingNode(pNode);
    }
    /** Initialize should be call after armingNode! Best practice is to first set the 
node
     * and later to add the object to the scenegraph */
    public void initialize() {
      wakeupOn(pWOr);
    }
    public void processStimulus(java.util.Enumeration e) {
      System.out.println("Debug collision: BINGO!");
      while(e.hasMoreElements()){
        WakeupCriterion pWCriterion = (WakeupCriterion) e.nextElement();
        if (pWCriterion instanceof WakeupOnCollisionEntry){
          //something
        }
        else if (pWCriterion instanceof WakeupOnCollisionExit){
          //something else
        }
      }
      // set next WakeupCriterion
      wakeupOn(pWOr);
    }
    void armingNode(Node pNode) {
      aWCriteria[0]= pWUEnter = new 
WakeupOnCollisionEntry(pNode,WakeupOnCollisionEntry.USE_GEOMETRY);
      aWCriteria[1]= pWUExit  = new 
WakeupOnCollisionExit(pNode,WakeupOnCollisionExit.USE_GEOMETRY);
      pWOr=new WakeupOr(aWCriteria);
    }
    private WakeupCriterion[] aWCriteria = new WakeupCriterion[2];
    private WakeupOr pWOr;
    private WakeupOnCollisionEntry pWUEnter;
    private WakeupOnCollisionExit pWUExit;
  }
}

------------------END OF CODE---------------------

----- Original Message -----
From: Chien Yang <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Cc: [EMAIL PROTECTED]
Subject: Re: [JAVA3D]

Samuel,
Very strange. Can you send us a reproducible test program ?

- Chien Yang
Java 3D, Sun Microsystems.


Liu Samuel wrote:

>Chien Yang:
>   I tried it out, but unfortunately failed, the exception comes out again.
>   Any more suggestions to have this job done?
>   The weird thing is even I disable these behaviors before I detach the BranchGroup, 
> this problem still will be there. Really troublesome.
>   Thanks for your reply!
>
>Samuel Liu
>  
>----- Original Message -----
>From: Chien Yang <[EMAIL PROTECTED]>
>To: [EMAIL PROTECTED]
>Cc: [EMAIL PROTECTED]
>Subject: Re: [JAVA3D]
>
>Samuel,
>       Have you tried doing the detach in a j3d Behavior ?
>There is a known MT bug with detach() executed in the user thread.
>
>- Chien Yang
>  Java 3D, Sun Microsystems Inc.
>
>
>
>
>Liu Samuel wrote:
>  
>
>>hi all,
>>There is a NullPointerException occured when I attempted to detach a BranchGroup 
>>from the locale, there is a collision detection behavior serves as a child of the 
>>BranchGroup. The call trace is:
>>
>>java.lang.NullPointerException
>>      at 
>> javax.media.j3d.TransformGroupRetained.getCurrentChildLocalToVworld(TransformGroupRetained.java:1029)
>>      at 
>> javax.media.j3d.TransformGroupRetained.getCurrentChildLocalToVworld(TransformGroupRetained.java:1025)
>>      at 
>> javax.media.j3d.TransformGroupRetained.transformBounds(TransformGroupRetained.java:1000)
>>      at 
>> javax.media.j3d.WakeupOnCollisionEntry.updateCollisionBounds(WakeupOnCollisionEntry.java:410)
>>      at 
>> javax.media.j3d.GeometryStructure.processCollisionDetection(GeometryStructure.java:866)
>>      at 
>> javax.media.j3d.GeometryStructure.processMessages(GeometryStructure.java:214)
>>      at javax.media.j3d.StructureUpdateThread.doWork(StructureUpdateThread.java:83)
>>      at javax.media.j3d.J3dThread.run(J3dThread.java:250)
>>
>>Seems to be an internel exception. Why? Bug of j3d collision detection? Any 
>>walkarounds?
>>
>>Many many many thanks for your help:-)
>>
>>Liu 
>>    
>>
>
>
>
> 
>  
>



 
 

Reply via email to