Как я могу получить координаты точки в 3D на основе щелчка мыши? - PullRequest
0 голосов
/ 01 февраля 2011

Я хочу, чтобы при нажатии на конкретную точку на экране был вызван вызов функции, которая возвращает точку в трехмерной сцене, которую я нажимаю.

Например, когда я нажимаю в левом верхнем углу экрана, он должен вернуть x = 0, y = 1, z = 1; Пожалуйста, помогите мне создать метод для этого.

редактирование:

Root = new BranchGroup();

setLayout(new BorderLayout());
add(canvas3D,BorderLayout.CENTER);
SimpleUniverse universe = new SimpleUniverse(canvas3D);

Shape();
universe.addBranchGraph(Root);
ViewingPlatform viewingPlatform = universe.getViewingPlatform();
OrbitBehavior behavior = new OrbitBehavior(canvas3D);
behavior.setSchedulingBounds(bounds);
viewingPlatform.setViewPlatformBehavior(behavior);
viewingPlatform.setNominalViewingTransform();
}

Я использую SimpleUniverse в NetBeans.

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

Боюсь, ответ не прямой. В зависимости от того, что находится в вашей сцене, координаты мыши должны меняться при нажатии на экран. Например, если у вас есть два объекта, так что передний перекрывает задний, вам нужно получить координаты передних объектов. Это называется mouse picking, и для этого есть несколько методов. Я нашел несколько форумов, которые объясняют, как это делается, и есть примеры кода.

По сути, идея заключается в том, что вы представляете, что между вами и пользователем находится лазер (или что-то еще, что излучает луч). Затем эта вещь проецирует луч через точку на поверхности экрана, где была нажата мышь "в" экран. Все, что находится на пути лучей, будет затем выбрано, и, возможно, порядок окклюзии объектов на пути луча будет разрешен, чтобы дать вам объект, ближайший к «экрану».

Я не знаком с J3D, но собрал следующий код из нескольких уроков. Это должно помочь вам начать хотя бы. Это то, что вы ищете, это строка Point3D intercept = ... внизу.

http://www.java3d.org/selection.html

package j3d_picking;

import java.awt.*;
import javax.swing.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.picking.behaviors.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.picking.PickIntersection;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.picking.PickTool;
import javax.vecmath.Point3d;

public class HelloJava3D
        extends JFrame
{

    public HelloJava3D()
    {
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(config);

        BranchGroup scene = createSceneGraph();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        BoundingSphere behaveBounds = new BoundingSphere();
        ExamplePickBehavior behavior = new ExamplePickBehavior(canvas3D, scene, behaveBounds);
        scene.addChild(behavior);

        scene.compile();
        simpleU.addBranchGraph(scene);

        getContentPane().add(canvas3D, BorderLayout.CENTER);
    } // end of HelloJava3D (constructor)

    public BranchGroup createSceneGraph()
    {
        // Create the root of the branch graph
        BranchGroup objRoot = new BranchGroup();

        // Create a simple shape leaf node, add it to the scene graph.
        // ColorCube is a Convenience Utility class
        ColorCube cube = new ColorCube(0.4);
        cube.setCapability(Node.ENABLE_PICK_REPORTING);
        PickTool.setCapabilities(cube, PickTool.INTERSECT_FULL);
        objRoot.addChild(cube);

        return objRoot;
    } // end of createSceneGraph method of HelloJava3D

    public static void main(String[] args)
    {
        JFrame frame = new HelloJava3D();
        frame.setTitle("Hello Java3D");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(0, 0, 400, 300);
        frame.setVisible(true);
    }

    private class ExamplePickBehavior extends PickMouseBehavior
    {

        public ExamplePickBehavior(Canvas3D canvas, BranchGroup bg, Bounds bounds)
        {
            super(canvas, bg, bounds);
            setSchedulingBounds(bounds);

            pickCanvas.setMode(PickTool.GEOMETRY_INTERSECT_INFO);
            // allows PickIntersection objects to be returned
        }

        public void updateScene(int xpos, int ypos)
        {
            pickCanvas.setShapeLocation(xpos, ypos);
            // register mouse pointer location on the screen (canvas)

            Point3d eyePos = pickCanvas.getStartPosition();
            // get the viewer's eye location

            PickResult pickResult = null;
            pickResult = pickCanvas.pickClosest();
            // get the intersected shape closest to the viewer

            if (pickResult != null) {
                PickIntersection pi = pickResult.getClosestIntersection(eyePos);
                // get the closest intersect to the eyePos point
                Point3d intercept = pi.getPointCoordinatesVW();
                System.out.println(intercept);
                // extract the intersection pt in scene coords space
                // use the intersection pt in some way...
            }
        } // end of updateScene(  )
    } // end of ExamplePickBehavior class
}
0 голосов
/ 29 февраля 2016

enter code here Код Java, приведенный ниже, печатает координаты центра трехмерного объекта (фигур) на трехмерном экране. Результат (x = -0,5, y = 0,0, z = 0,4)

         public class secim2 extends MouseAdapter{


private PickCanvas pickCanvas;





public secim2(){
    JFrame pencere=new JFrame();
    pencere.setSize(300, 300);
    pencere.setVisible(true);
    JFrame frame = new JFrame(" 3D Box Select");

    GraphicsConfiguration config =                 SimpleUniverse.getPreferredConfiguration();

    Canvas3D canvas = new Canvas3D(config);

    SimpleUniverse universe = new SimpleUniverse(canvas);

    BranchGroup group = new BranchGroup();


    // create a color cube


       Transform3D transform= new Transform3D();
    Vector3d vector = new Vector3d(-0.5, 0.0, 0.4);

        Transform3D transform = new Transform3D();

        transform.setTranslation(vector);

        TransformGroup transformGroup = new TransformGroup(transform);

        ColorCube cube = new ColorCube(0.1f);

        transformGroup.addChild(cube);

        group.addChild(transformGroup);


        universe.getViewingPlatform().setNominalViewingTransform();

        universe.addBranchGraph(group);


      pickCanvas = new PickCanvas(canvas, group);

      pickCanvas.setMode(PickCanvas.GEOMETRY_INTERSECT_INFO);

     pencere.add(canvas);

      canvas.addMouseListener(this);


}

public void mouseClicked(MouseEvent e)

{



    pickCanvas.setShapeLocation(e);

    PickResult result = pickCanvas.pickClosest();

    if (result == null) {


    } else {

       Primitive p = (Primitive)result.getNode(PickResult.PRIMITIVE);  

       Shape3D s = (Shape3D)result.getNode(PickResult.SHAPE3D);

       if (p != null) {

         System.out.println(p.getClass().getName());


       } else if (s != null) {

             System.out.println(s.getClass().getName());

             Vector3f position = new Vector3f(); 

      s.getLocalToVworld(transform);  

        transform.get(position);

       System.out.print(position);

      // System.out.print( s.getLocalToVworld(transform2);
       } else{

          System.out.println("null");

       }

    }

}

}

публичный класс tuval1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub

новый secim2 ();

}
*

} * 1013

...