Java 3D
От: Flem1234  
Дата: 11.06.07 15:59
Оценка:
кто-нибудь знает, как сделать:
3D стрелочка, которая указывает на мышку? Чтобы она вращалась вокруг оси Z, при движении мыши.
Re: Java 3D
От: Blazkowicz Россия  
Дата: 12.06.07 09:54
Оценка: 1 (1)
Здравствуйте, Flem1234, Вы писали:

F>кто-нибудь знает, как сделать:

F>3D стрелочка, которая указывает на мышку? Чтобы она вращалась вокруг оси Z, при движении мыши.



package com.offshorecreations.datavisualization.diagram3d;

import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseBehaviorCallback;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;

/**
 * MouseRotate is a Java3D behavior object that lets users control the
 * rotation of an object via a mouse.
 * <p>
 * To use this utility, first create a transform group that this
 * rotate behavior will operate on. Then,
 *<blockquote><pre>
 *
 *   MouseRotate behavior = new MouseRotate();
 *   behavior.setTransformGroup(objTrans);
 *   objTrans.addChild(behavior);
 *   behavior.setSchedulingBounds(bounds);
 *
 *</pre></blockquote>
 * The above code will add the rotate behavior to the transform
 * group. The user can rotate any object attached to the objTrans.
 *
 * This class was changed from original to stop rotation when Control key is in pressed state.
 */

public class MouseRotate extends MouseBehavior {
    double x_angle, y_angle;
    double x_factor = .03;
    double y_factor = .03;

    private MouseBehaviorCallback callback = null;

    /**
     * Creates a rotate behavior given the transform group.
     * @param transformGroup The transformGroup to operate on.
     */
    public MouseRotate(TransformGroup transformGroup) {
    super(transformGroup);
    }

    /**
     * Creates a default mouse rotate behavior.
     **/
    public MouseRotate() {
    super(0);
    }

    /**
     * Creates a rotate behavior.
     * Note that this behavior still needs a transform
     * group to work on (use setTransformGroup(tg)) and
     * the transform group must add this behavior.
     * @param flags interesting flags (wakeup conditions).
     */
    public MouseRotate(int flags) {
    super(flags);
    }

    /**
     * Creates a rotate behavior that uses AWT listeners and behavior
     * posts rather than WakeupOnAWTEvent.  The behavior is added to the
     * specified Component. A null component can be passed to specify
     * the behavior should use listeners.  Components can then be added
     * to the behavior with the addListener(Component c) method.
     * @param c The Component to add the MouseListener
     * and MouseMotionListener to.
     * @since Java 3D 1.2.1
     */
    public MouseRotate(Component c) {
    super(c, 0);
    }

    /**
     * Creates a rotate behavior that uses AWT listeners and behavior
     * posts rather than WakeupOnAWTEvent.  The behaviors is added to
     * the specified Component and works on the given TransformGroup.
     * A null component can be passed to specify the behavior should use
     * listeners.  Components can then be added to the behavior with the
     * addListener(Component c) method.
     * @param c The Component to add the MouseListener and
     * MouseMotionListener to.
     * @param transformGroup The TransformGroup to operate on.
     * @since Java 3D 1.2.1
     */
    public MouseRotate(Component c, TransformGroup transformGroup) {
    super(c, transformGroup);
    }

    /**
     * Creates a rotate behavior that uses AWT listeners and behavior
     * posts rather than WakeupOnAWTEvent.  The behavior is added to the
     * specified Component.  A null component can be passed to specify
     * the behavior should use listeners.  Components can then be added to
     * the behavior with the addListener(Component c) method.
     * Note that this behavior still needs a transform
     * group to work on (use setTransformGroup(tg)) and the transform
     * group must add this behavior.
     * @param flags interesting flags (wakeup conditions).
     * @since Java 3D 1.2.1
     */
    public MouseRotate(Component c, int flags) {
    super(c, flags);
    }

    public void initialize() {
    super.initialize();
    x_angle = 0;
    y_angle = 0;
    if ((flags & INVERT_INPUT) == INVERT_INPUT) {
        invert = true;
        x_factor *= -1;
        y_factor *= -1;
    }
    }

    /**
     * Return the x-axis movement multipler.
     **/
    public double getXFactor() {
    return x_factor;
    }

    /**
     * Return the y-axis movement multipler.
     **/
    public double getYFactor() {
    return y_factor;
    }


    /**
     * Set the x-axis amd y-axis movement multipler with factor.
     **/
    public void setFactor( double factor) {
    x_factor = y_factor = factor;
    }

    /**
     * Set the x-axis amd y-axis movement multipler with xFactor and yFactor
     * respectively.
     **/
    public void setFactor( double xFactor, double yFactor) {
    x_factor = xFactor;
    y_factor = yFactor;
    }

    public void processStimulus (Enumeration criteria) {
    WakeupCriterion wakeup;
    AWTEvent[] events;
     MouseEvent evt;
//     int id;
//     int dx, dy;

    while (criteria.hasMoreElements()) {
        wakeup = (WakeupCriterion) criteria.nextElement();
        if (wakeup instanceof WakeupOnAWTEvent) {
        events = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
        if (events.length > 0) {
            evt = (MouseEvent) events[events.length-1];
            doProcess(evt);
        }
        }

        else if (wakeup instanceof WakeupOnBehaviorPost) {
        while (true) {
            // access to the queue must be synchronized
            synchronized (mouseq) {
            if (mouseq.isEmpty()) break;
            evt = (MouseEvent)mouseq.remove(0);
            // consolidate MOUSE_DRAG events
            while ((evt.getID() == MouseEvent.MOUSE_DRAGGED) &&
                   !mouseq.isEmpty() &&
                   (((MouseEvent)mouseq.get(0)).getID() ==
                MouseEvent.MOUSE_DRAGGED)) {
                evt = (MouseEvent)mouseq.remove(0);
            }
            }
            doProcess(evt);
        }
        }

    }
    wakeupOn (mouseCriterion);
    }

    void doProcess(MouseEvent evt) {
    int id;
    int dx, dy;

    processMouseEvent(evt);
    if (((buttonPress)&&((flags & MANUAL_WAKEUP) == 0)) ||
        ((wakeUp)&&((flags & MANUAL_WAKEUP) != 0))) {
        id = evt.getID();
        if ((id == MouseEvent.MOUSE_DRAGGED) &&
        !evt.isControlDown() && ! evt.isAltDown()){
        x = evt.getX();
        y = evt.getY();

        dx = x - x_last;
        dy = y - y_last;

        if (!reset){
            x_angle = dy * y_factor;
            y_angle = dx * x_factor;

            transformX.rotX(x_angle);
            transformY.rotY(y_angle);

            transformGroup.getTransform(currXform);

            Matrix4d mat = new Matrix4d();
            // Remember old matrix
            currXform.get(mat);

            // Translate to origin
            currXform.setTranslation(new Vector3d(0.0,0.0,0.0));
            if (invert) {
            currXform.mul(currXform, transformX);
            currXform.mul(currXform, transformY);
            } else {
            currXform.mul(transformX, currXform);
            currXform.mul(transformY, currXform);
            }

            // Set old translation back
            Vector3d translation = new
                    Vector3d(mat.m03, mat.m13, mat.m23);
            currXform.setTranslation(translation);

            // Update xform
            transformGroup.setTransform(currXform);

            transformChanged( currXform );

            if (callback!=null)
            callback.transformChanged( MouseBehaviorCallback.ROTATE,
                           currXform );
        }
        else {
            reset = false;
        }

        x_last = x;
        y_last = y;
        }
        else if (id == MouseEvent.MOUSE_PRESSED) {
        x_last = evt.getX();
        y_last = evt.getY();
        }
    }
    }

    /**
     * Users can overload this method  which is called every time
     * the Behavior updates the transform
     *
     * Default implementation does nothing
     */
    public void transformChanged( Transform3D transform ) {
    }


    /**
     * The transformChanged method in the callback class will
     * be called every time the transform is updated
     */
    public void setupCallback( MouseBehaviorCallback callback ) {
    this.callback = callback;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.