Hi Allistair,

I'm not a Java3D engineer, but this is how I would do this,

*  The behaviour should wake up on the following AWT events:
MouseEvent.MOUSE_PRESSED, KeyEvent.KEY_PRESSED, KeyEvent.KEY_RELEASED
*  In the processStimulus method:
         ~  On receiving a KEY_PRESSED         record the key code of the
KeyEvent in some variable (say keyCode).
         ~  On receiving a KEY_RELEASED      make the keyCode = -1, to signify
that nothing is pressed.
         ~  On receiving a MOUSE_PRESSED    do something depending on keyCode.

I've attached some source code.

Regards,
Renoir


"Crossley, Allistair" wrote:

> Will you all join me in asking a Java3D engineer(s) to demonstrate with code
> how to write a picking behaviour that only wakes up on left click whist a
> character key "A-Z" is depressed.
>
> All the examples with Java3D are with Alt or Control but these are useless
> for big applications except for zoom and translate. Besides, there are
> special functions in the events classes that can detect these being down at
> the time of the click too which makes these easier.
>
> Anyone in favour of a concrete example from the makers of J3D say "Aye".
>
> Cheers,
>
> Allistair Crossley
> Web/New Media Consultant
> Logica UK Ltd
> Tel: 02074 463267
> Mob: 07884 056274
>
> -----Original Message-----
> From: Karsten Fries [mailto:[EMAIL PROTECTED]]
> Sent: 22 May 2001 09:24
> To: [EMAIL PROTECTED]
> Subject: [JAVA3D] Mouse events
>
> Hi there,
>
> another mouse question.
> I have the problem that I use left mouse click for selecting objects and
> left mouse double-click for zooming
> in. In big complex scenes the picking stuff is very computation
> intensive and therefore takes a while (in the range of a second is
> the max we can tolerate), but anyway the double click is not produced if
> it takes too long.
>
> Rephrased: if i double-click on a complex object (say build of 30000
> triangles) I get two mouse click events with
> clickCount() == 1 instead of one with cC==1 and a secong with cC == 2.
>
> Pitty!!
>
> Is there any way of getting around this. I already rearranged the mouse
> controls, but I'm always running in some
> problems concering this issue.
>
> Any help is appreciated!!
>
> Thanks and cheers,
> Karsten
>
> ===========================================================================
> 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".

--
Renoir Sewjee
Software Engineer
ISS International (Welkom)
Tel: +27 (0)57 912 2702
Fax: +27 (0)57 912 2652
--

/**
 * Picks a point in the virtual world.
 *
 */

import java.awt.AWTEvent;

import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.KeyEvent;

import java.util.Enumeration;
import java.util.ArrayList;

import com.sun.j3d.utils.picking.PickCanvas;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.picking.PickIntersection;

import javax.media.j3d.Behavior;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.WakeupOnAWTEvent;
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupCondition;
import javax.media.j3d.WakeupOr;
import javax.media.j3d.Canvas3D;

import javax.vecmath.Point3d;
import javax.vecmath.Point3f;

import java.util.ArrayList;
import java.util.Iterator;

import com.sun.j3d.utils.picking.PickTool;

public class Picker extends Behavior
{
    private PickCanvas pickCanvas;
    private WakeupCondition wakeupCondition;

    private int currentKeyPressed = -1;

    public Picker(Canvas3D canvas, BranchGroup scene)
    {
        pickCanvas = new PickCanvas(canvas, scene);
        pickCanvas.setTolerance(3.0f);
        pickCanvas.setMode(PickCanvas.GEOMETRY_INTERSECT_INFO);
    }

    public void initialize()
    {
        WakeupCriterion[] wakeups = new WakeupCriterion[3];
        wakeups[0] = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
        wakeups[1] = new WakeupOnAWTEvent(KeyEvent.KEY_RELEASED);
        wakeups[2] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);

        wakeupCondition = new WakeupOr(wakeups);
        wakeupOn(wakeupCondition);
    }

    public void processStimulus(Enumeration criteria)
    {
        while (criteria.hasMoreElements())
            {
                WakeupCriterion wakeup = (WakeupCriterion)criteria.nextElement();
                if (wakeup instanceof WakeupOnAWTEvent)
                    {
                        AWTEvent[] events = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
                        if (events.length > 0)
                            {
                                if (events[events.length-1] instanceof KeyEvent)
                                    {
                                        KeyEvent event = 
(KeyEvent)events[events.length-1];

                                        int id = event.getID();
                                        if (id == KeyEvent.KEY_PRESSED)
                                            {
                                                currentKeyPressed = event.getKeyCode();
                                            }
                                        else
                                            {
                                                currentKeyPressed = -1;
                                            }
                                    }

                                else if (events[events.length-1] instanceof MouseEvent 
&& currentKeyPressed != -1)
                                    {
                                        MouseEvent event = 
(MouseEvent)events[events.length-1];

                                        int id  = event.getID();
                                        int mod = event.getModifiers();

                                        if (mod == MouseEvent.BUTTON1_MASK)
                                            {
                                                if (id == MouseEvent.MOUSE_PRESSED)
                                                    {
                                                        
pickCanvas.setShapeLocation(event.getX(), event.getY());
                                                        Point3d eyePos        = 
pickCanvas.getStartPosition();
                                                        PickResult pickResult = 
pickCanvas.pickClosest();

                                                        if (pickResult != null)
                                                            {
                                                                PickIntersection 
pickIntersection =
                                                                    
pickResult.getClosestIntersection(eyePos);
                                                                Point3d pickedPoint =
                                                                    
pickIntersection.getPointCoordinatesVW();

                                                                if (currentKeyPressed 
== KeyEvent.VK_A)
                                                                    
System.err.println("Pressed A");
                                                                else if 
(currentKeyPressed == KeyEvent.VK_B)
                                                                    
System.err.println("Pressed B");
                                                                else
                                                                    
System.err.println("Pressed Something Else");

                                                                
System.err.println(pickedPoint);
                                                                System.err.println();
                                                            }

                                                        else
                                                            {
                                                                System.err.println("No 
point picked");
                                                                System.err.println();
                                                            }
                                                    }
                                            }
                                    }
                            }
                    }
            }

        wakeupOn(wakeupCondition);
    }
}

Reply via email to