Hi Peter, Here is a snippet of the code which I've done on VRML models. If u are using on any shapes that has setUserData() then getUserData() on the spahe assuming this is URL and use the applet context to load the link in new browser or in the instance of the browser. Add the instance of this PickURL class to the root and you are set... Best of Luck Sivaram. --- peter <[EMAIL PROTECTED]> wrote: > Hi, > could anybody help with this...I am trying to > associate > URL links with objects - say clicking on famous > ColorCube :) > to open new link. And one step further I'd like to > associate > one link for each face of the cube - if somebody's > done it > already I would appreciate a hint - small chunk of > code would > also be helpful.... > thank you > Peter. > > =========================================================================== > 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". > __________________________________________________ Do You Yahoo!? Talk to your friends online with Yahoo! Messenger. http://im.yahoo.com
package cyberworld.helper; // Import needed Java classes. import java.applet.*; import java.net.URL; import java.util.*; import java.lang.reflect.*; // Import the Java 3D API. import javax.media.j3d.*; // Import the needed Java 3D utility classes. import com.sun.j3d.utils.behaviors.picking.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.loaders.vrml97.impl.*; /** * PickURL is used to associate an object that has been picked on * a scene with a URL link. * */ public class PickURL extends PickMouseBehavior { protected AppletContext appletContext; protected PickObject pickObject = null; protected String urlString = null; protected URL gotoURL = null; /** * Creates the PickURL object. * * @param canvas The drawing surface for this applet. * @param root The root of the scenegraph in which picking is * to occur. * @param bounds The schedule bounding region for this behavior. * */ public PickURL( Canvas3D canvas, BranchGroup root, Bounds bounds, AppletContext context ) { // Pass needed info to parent. super(canvas, root, bounds); pickObject = new PickObject( canvas, root ); setCapability( ALLOW_PICKABLE_READ | ALLOW_PICKABLE_WRITE | ALLOW_BOUNDS_READ | ALLOW_BOUNDS_WRITE ); // Pass URL information appletContext = context; } /** * Callback called when a pick event has been detected. * The specific Switch node child is determined and its URL. * * @param xPos Current mouse X position. * @param yPos Current mouse Y position. */ public void updateScene(int xPos, int yPos) { Logger.log("PickURL coordinates: x = "+xPos+", y = "+yPos); // will set any urlString at this position mouseClicked( xPos, yPos ); if ( urlString != null ) { try{ gotoURL = new URL( urlString ); } catch( Exception e ){ Logger.log( e ); gotoURL = null; } } if ( gotoURL != null ) { // Cause the browser to load the referenced URL // This applet only has a single URL passed, but could // support an entire list that is associated with // the Java 3D object picked. if (gotoURL != null) appletContext.showDocument(gotoURL,"_blank"); } } private void mouseClicked(int xPos, int yPos) { javax.media.j3d.Node node = null; Object vs = null; Vector sv = (Vector)null; urlString = null; gotoURL = null; vs = null; sv = null; node = null; SceneGraphPath path = pickObject.pickClosest(xPos,yPos,PickObject.USE_BOUNDS); if ( path != null ) { for ( int i = 0; i < path.nodeCount(); i++ ) { // Logger.log("Object index = "+i); node = path.getNode(i); Object o = node.getUserData(); // Logger.log("User Data = "+o); if( o instanceof Vector && !((Vector)o).isEmpty() ) { // save the bottom most to preserve nesting // note, the userData should be a vector // of sensors for this group. sv = (Vector)o; // rare case } else if ( o instanceof SphereSensor ) { sv = new Vector(); sv.addElement(o); node.setUserData(sv); } } if ( sv != null ) { Enumeration e = sv.elements(); while( e.hasMoreElements() ) { vs = (Object)e.nextElement(); if (vs instanceof Anchor) { MFString mfURL = (MFString)(((Anchor)vs).getField("url")); if ( mfURL != null ) { urlString = mfURL.get1Value(0); Logger.log("URL = "+urlString); } } } } } /***** path = pickObject.pickAllSorted( xPos, yPos ); if ( path != null ) { // Logger.log("SceneGraphPath.length = "+path.length); for ( int i = 0; i < path.length; i++ ) { vs = null; sv = null; node = null; // Logger.log("Picked Object = "+path[i]); for ( int j = 0; j < path[i].nodeCount(); j++ ) { // Logger.log("Object index = "+i); node = path[i].getNode(j); Object o = node.getUserData(); // Logger.log("User Data = "+o); if( o instanceof Vector && !((Vector)o).isEmpty() ) { // save the bottom most to preserve nesting // note, the userData should be a vector // of sensors for this group. sv = (Vector)o; // rare case } else if ( o instanceof SphereSensor ) { sv = new Vector(); sv.addElement(o); node.setUserData(sv); } } } if ( sv != null ) { Enumeration e = sv.elements(); while( e.hasMoreElements() ) { vs = (Object)e.nextElement(); if (vs instanceof Anchor) { MFString mfURL = (MFString)(((Anchor)vs).getField("url")); if ( mfURL != null ) { urlString = mfURL.get1Value(0); Logger.log("URL = "+urlString); } } } } } *****/ } }