Get 3d coordinates of a mouse click from a ChartView.

481 views
Skip to first unread message

Benjamin Pavie

unread,
Apr 18, 2013, 7:06:34 PM4/18/13
to jz...@googlegroups.com
Hi Everybody,

I'm trying to get the 3d coordinates of a dot when I'm clicking on it but somehow, the 3d coordinate looks wrong.
Here is the code that I wrote:

package org.jzy3d.demos.swing;


import javax.swing.JComponent;
import javax.swing.JFrame;


import org.jzy3d.chart.Chart;
import org.jzy3d.chart.controllers.keyboard.camera.CameraKeyController;
import org.jzy3d.chart.controllers.mouse.camera.CameraMouseController;
import org.jzy3d.chart.controllers.mouse.picking.MousePickingController;
import org.jzy3d.colors.Color;
import org.jzy3d.maths.Coord3d;
import org.jzy3d.plot3d.primitives.Scatter;


public class SwingTest {
 
 
private SwingTest(){
   
Chart chart = getChart();
    addChartToFrame
(chart);
 
}


 
 
public Chart getChart(){
   
//int size = 100000;
   
int size=3;
       
float x;
       
float y;
       
float z;
       
float a;
       
       
Coord3d[] points = new Coord3d[size];
       
Color[]   colors = new Color[size];

        points
[0] = new Coord3d(0, 0, 10);
        colors
[0] = Color.RED;
        points
[1] = new Coord3d(20, 0, 0);
        colors
[1] = Color.BLUE;
        points
[2] = new Coord3d(0, 30, 0);
        colors
[2] = Color.GREEN;
       
       
Scatter scatter = new Scatter(points, colors);
       
//Set dot size
        scatter
.setWidth(10);
       
Chart chart = new Chart("swing");
        chart
.getScene().add(scatter);
        chart
.addController(new CameraKeyController());
       
//chart.addController(new CameraMouseController());
       
//for example of reimplementation (extends)
        chart
.addController(new MyMousePickingController(chart));
       
return chart;
 
}
 
 
private JFrame addChartToFrame(Chart chart){
   
JFrame frame = new JFrame("SwingTest");
    frame
.setBounds(100, 100, 800, 600);
    frame
.add((JComponent)chart.getCanvas());
   
    frame
.setVisible(true);
   
return frame;
 
}


 
 
public static void main(String [] args){
   
new SwingTest();
 
}
 
}


And my MyMousePickingController:

package org.jzy3d.demos.swing;


import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;


import javax.media.opengl.GL2;
import javax.media.opengl.glu.GLU;


import org.jzy3d.chart.Chart;
import org.jzy3d.chart.ChartView;
import org.jzy3d.chart.controllers.camera.AbstractCameraController;
import org.jzy3d.chart.controllers.mouse.MouseUtilities;
import org.jzy3d.chart.controllers.thread.camera.CameraThreadController;
import org.jzy3d.maths.Coord2d;
import org.jzy3d.maths.Coord3d;
import org.jzy3d.maths.IntegerCoord2d;
import org.jzy3d.picking.PickingSupport;
import org.jzy3d.plot3d.rendering.scene.Graph;
import org.jzy3d.plot3d.rendering.view.View;


public class MyMousePickingController<V, E> extends AbstractCameraController
   
implements MouseListener, MouseMotionListener, MouseWheelListener {
 
public MyMousePickingController() {
   
super();
    picking
= new PickingSupport();
 
}


 
public MyMousePickingController(Chart chart) {
   
super(chart);
    picking
= new PickingSupport();
 
}


 
public MyMousePickingController(Chart chart, int brushSize) {
   
super(chart);
    picking
= new PickingSupport(brushSize);
 
}


 
public MyMousePickingController(Chart chart, int brushSize, int bufferSize) {
   
super(chart);
    picking
= new PickingSupport(brushSize, bufferSize);
 
}


 
public void register(Chart chart) {
   
super.register(chart);
   
this.chart = chart;
   
this.prevMouse = Coord2d.ORIGIN;
    chart
.getCanvas().addMouseListener(this);
    chart
.getCanvas().addMouseMotionListener(this);
    chart
.getCanvas().addMouseWheelListener(this);
 
}


 
public void dispose() {
   
for (Chart c : targets) {
      c
.getCanvas().removeMouseListener(this);
      c
.getCanvas().removeMouseMotionListener(this);
      c
.getCanvas().removeMouseWheelListener(this);
   
}


   
if (threadController != null)
      threadController
.stop();


   
super.dispose(); // i.e. target=null
 
}


 
/****************/


 
public PickingSupport getPickingSupport() {
   
return picking;
 
}


 
public void setPickingSupport(PickingSupport picking) {
   
this.picking = picking;
 
}


 
/****************/


 
public void mouseClicked(MouseEvent e) {
   
System.out.println("X:"+e.getX()+" Y:"+e.getY());
   
int yflip = -e.getY() + targets.get(0).getCanvas().getRendererHeight();
   
ChartView view =(ChartView)targets.get(0).getView();
   
Coord3d thisMouse3d = view.projectMouse(e.getX(), yflip);
   
System.out.println("X:"+thisMouse3d.x+" Y:"+thisMouse3d.y+" Z:"+thisMouse3d.z);


   
Coord3d eye = view.getCamera().getEye();
   
System.out.println("eye: X:"+eye.x+" Y:"+eye.y+" Z:"+eye.z);
   
Coord3d viewPoint = view.getViewPoint();
   
System.out.println("ViewPoint: X:"+viewPoint.x+" Y:"+viewPoint.y+" Z:"+viewPoint.z);
   
Coord3d scaling = view.getLastViewScaling();
   
System.out.println("Scaling: X:"+scaling.x+" Y:"+scaling.y+" Z:"+scaling.z);
 
}


 
public void mouseEntered(MouseEvent e) {
 
}


 
public void mouseExited(MouseEvent e) {
 
}


 
public void mouseReleased(MouseEvent e) {
 
}


 
public void mouseDragged(MouseEvent e) {
   
Coord2d mouse = new Coord2d(e.getX(), e.getY());


   
// Rotate
   
if (MouseUtilities.isLeftDown(e)) {
     
Coord2d move = mouse.sub(prevMouse).div(100);
      rotate
(move);
   
}
   
// Shift
   
else if (MouseUtilities.isRightDown(e)) {
     
Coord2d move = mouse.sub(prevMouse);
     
if (move.y != 0)
        shift
(move.y / 500);
   
}
    prevMouse
= mouse;    
 
}


 
/** Compute zoom */
 
public void mouseWheelMoved(MouseWheelEvent e) {
   
if (threadController != null)
      threadController
.stop();
   
System.out.println(e.getWheelRotation());
   
float factor = 1 + (e.getWheelRotation() / 10.0f);
   
System.out.println(MyMousePickingController.class.getSimpleName() + "wheel:" + factor * 100);
    zoomX
(factor);
    zoomY
(factor);
    chart
.getView().shoot();
 
}


 
public void mouseMoved(MouseEvent e) {
     
//System.out.println("moved");
    pick
(e);
 
}


 
public void mousePressed(MouseEvent e) {
   
if (handleSlaveThread(e))
     
return;
    pick
(e);
 
}


 
public void pick(MouseEvent e) {
   
int yflip = -e.getY() + targets.get(0).getCanvas().getRendererHeight();
    prevMouse
.x = e.getX();
    prevMouse
.y = e.getY();// yflip;
   
View view = chart.getView();
    prevMouse3d
= view.projectMouse(e.getX(), yflip);
    GL2 gl
= chart().getView().getCurrentGL();
   
Graph graph = chart().getScene().getGraph();
   
// will trigger vertex selection event to those subscribing to
   
// PickingSupport.
    picking
.pickObjects(gl, glu, view, graph, new IntegerCoord2d(e.getX(),
        yflip
));
 
}


 
public boolean handleSlaveThread(MouseEvent e) {
   
if (MouseUtilities.isDoubleClick(e)) {
     
if (threadController != null) {
        threadController
.start();
       
return true;
     
}
   
}
   
if (threadController != null)
      threadController
.stop();
   
return false;
 
}


 
/**********************/


 
protected float factor = 1;
 
protected float lastInc;
 
protected Coord3d mouse3d;
 
protected Coord3d prevMouse3d;
 
protected PickingSupport picking;
 
protected GLU glu = new GLU();


 
protected Chart chart;


 
protected Coord2d prevMouse;
 
protected CameraThreadController threadController;


}


In this second class, I try to get the coordinate in 3d of the clicked point (method mouseClicked). However, the value returned by Coord3d thisMouse3d = view.projectMouse(e.getX(), yflip); looks totally wrong...
What am I missing ?

Benjamin
Reply all
Reply to author
Forward
0 new messages