2011-01-31 3 views
0

Я хочу, чтобы, когда я нажимаю на определенную точку на экране, вызов функции, возвращающий точку в 3d-сцене, которую я нажимаю.Как получить координаты точки в 3D на основе щелчка мыши?

Например, когда я нажимаю левую верхнюю часть экрана, он должен возвращать 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

Как ваша сцена сгенерирована, вы используете какой-либо конкретной 3D-движок? –

+2

Нет Я использую NetBeans. –

+3

«Нет, я использую NetBeans», не говорит нам о многом. Это похоже на приложение Swing, я прав? Используете ли вы MouseListener для этого приложения? Или вы пытаетесь прослушивать щелчки мыши на компьютере пользователя вне графического интерфейса? Если это так, Java может быть неправильным инструментом для этой работы. –

ответ

3

Боюсь, что ответ не прямолинейный. В зависимости от того, что находится в вашей сцене, координаты мыши должны меняться при нажатии на экран. Например, если у вас есть два объекта, так что передняя часть закрывает задний, тогда вы хотите получить координаты передних объектов. Это называется 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

Вы, очевидно, приложили много усилий в этот ответ - спасибо! –

+1

@Hovercraft: да, я как бы заинтриговал себя - форма промедления, я полагаю :) –

-1

enter code here Java-код ниже, печатает (формы) центр 3D-координаты объекта в 3D-экран. Результат (х = -0.5, у = 0,0, г = 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();

} 

}

Смежные вопросы