Hi Gary,
It looks like you found a bug in our code. The only workaround I can
suggest is to try using WakeupOnActivation/Deactivation and use the
scheduling bounds of the behavior as your collision bounds. I attached
a modified HelloUniverse that does this.
Doug Twilleager
Java 3D Team
> Mime-Version: 1.0
> Content-Transfer-Encoding: 7bit
> Content-Description: Memo
> Subject: [JAVA3D] WakeUpOnViewPlatformEntry only fires one time!
> To: [EMAIL PROTECTED]
>
> Hello,
>
> I've seen no response to my question. Has anyone here gotten
> WakeupOnViewPlatformEntry to work?
>
> Thanks,
> -Gary
> ---------------------- Forwarded by Gary Moss/arl on 07/28/99 12:15 PM
> ---------------------------
>
>
> "Gary S. Moss" <[EMAIL PROTECTED]> on 07/22/99 04:58:15 PM
> To: [EMAIL PROTECTED]
> cc: (bcc: Gary Moss/arl)
> Subject: [JAVA3D] WakeUpOnViewPlatformEntry only fires one time!
>
>
> Hello,
>
> I finally got around to messing with collision detection between my view
> platform and scene. Everything works the first time the view platform
> collides, I get a WakeupOnViewPlatformEntry and corresponding Exit when
> appropriate. However subsequently I can never seem to get another Entry,
> though Exit fires consistently. I vaguely remember reading about a similar
> problem on this list, but don't recall whether it was a bug in J3d or operator
> error. I am using JDK 1.2.2 and Java3d 1.1.2 OpenGl under WinNT 4.0 SP5. My
> code follows (my apologies if tabs get farbled in translation):
>
> TIA,
> -Gary
>
> --
> import java.util.*;
> import javax.media.j3d.*;
>
> public class CollisionBehavior extends Behavior
> {
> private WakeupCondition criterion;
> private Bounds bounds;
> private boolean collided;
>
> public CollisionBehavior( Bounds bnds )
> {
> super();
> this.bounds = bnds;
> collided = false;
> //System.err.println( "CollisonBehavior( " + bnds + " )" );
> }
>
> public void initialize()
> {
> WakeupCriterion[] allEvents = new WakeupCriterion[2];
> allEvents[0] = new WakeupOnViewPlatformEntry( bounds );
> allEvents[1] = new WakeupOnViewPlatformExit( bounds );
> criterion = new WakeupOr( allEvents );
> wakeupOn( criterion );
> }
>
> public void processStimulus( Enumeration criteria )
> {
> WakeupCriterion wakeup;
>
> while( criteria.hasMoreElements() )
> {
> wakeup = (WakeupCriterion) criteria.nextElement();
>
> if( wakeup instanceof WakeupOnViewPlatformEntry )
> {
> System.err.println( "Entered View Platform" );
> collided = true;
> }
> else
> if( wakeup instanceof WakeupOnViewPlatformExit )
> {
> System.err.println( "Exited View Platform" );
> collided = false;
> }
> }
> wakeupOn( criterion );
> }
>
> public boolean IsCollided()
> {
> return collided;
> }
> }
>
> ===========================================================================
> 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".
>
> ===========================================================================
> 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".
/*
* %Z%%M% %I% %E% %U%
*
* Copyright (c) 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
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 javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.keyboard.*;
import java.util.Enumeration;
public class HelloUniverse extends Applet {
public class CollisionBehavior extends Behavior
{
private WakeupCondition criterion;
private Bounds bounds;
private boolean collided;
public CollisionBehavior( Bounds bnds )
{
super();
this.bounds = bnds;
collided = false;
//System.err.println( "CollisonBehavior( " + bnds + " )" );
}
public void initialize()
{
WakeupCriterion[] allEvents = new WakeupCriterion[2];
allEvents[0] = new WakeupOnActivation();
allEvents[1] = new WakeupOnDeactivation();
criterion = new WakeupOr( allEvents );
wakeupOn( criterion );
}
public void processStimulus( Enumeration criteria )
{
WakeupCriterion wakeup;
while( criteria.hasMoreElements() )
{
wakeup = (WakeupCriterion) criteria.nextElement();
if( wakeup instanceof WakeupOnActivation)
{
System.err.println( "Entered View Platform" );
collided = true;
}
else
if( wakeup instanceof WakeupOnDeactivation )
{
System.err.println( "Exited View Platform" );
collided = false;
}
}
wakeupOn( criterion );
}
public boolean IsCollided()
{
return collided;
}
}
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
// Create the transform group node and initialize it to the
// identity. Enable the TRANSFORM_WRITE capability so that
// our behavior code can modify it at runtime. Add it to the
// root of the subgraph.
TransformGroup objTrans = new TransformGroup();
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objRoot.addChild(objTrans);
// Create a simple shape leaf node, add it to the scene graph.
objTrans.addChild(new ColorCube(0.4));
// Create a new Behavior object that will perform the desired
// operation on the specified transform object and add it into
// the scene graph.
Transform3D yAxis = new Transform3D();
Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
0, 0,
4000, 0, 0,
0, 0, 0);
RotationInterpolator rotator =
new RotationInterpolator(rotationAlpha, objTrans, yAxis,
0.0f, (float) Math.PI*2.0f);
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
rotator.setSchedulingBounds(bounds);
objTrans.addChild(rotator);
// Have Java 3D perform optimizations on this scene graph.
objRoot.compile();
return objRoot;
}
public HelloUniverse() {
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
// Create a simple scene and attach it to the virtual universe
BranchGroup scene = createSceneGraph();
SimpleUniverse u = new SimpleUniverse(c);
u.getViewingPlatform().getViewPlatform().setActivationRadius(0.3f);
// This will move the ViewPlatform back a bit so the
// objects in the scene can be viewed.
u.getViewingPlatform().setNominalViewingTransform();
BranchGroup b = new BranchGroup();
KeyNavigatorBehavior key = new
KeyNavigatorBehavior(u.getViewingPlatform().getViewPlatformTransform());
key.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
100000.0));
b.addChild(key);
BoundingSphere bnd = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 0.5);
CollisionBehavior coll = new CollisionBehavior(bnd);
coll.setSchedulingBounds(bnd);
b.addChild(coll);
u.addBranchGraph(scene);
u.addBranchGraph(b);
}
//
// The following allows HelloUniverse to be run as an application
// as well as an applet
//
public static void main(String[] args) {
new MainFrame(new HelloUniverse(), 256, 256);
}
}