[vtkusers] Using VTK with Java with some problems
Carlos Martinez Burgos
cmarbur at iti.upv.es
Tue Sep 18 06:54:52 EDT 2001
I have solved the first problem, it was my mistake, but I still get the
same result with the picks (see below).
I repost the code that shows my problem again. Could you run it and tell
me if this is an error of VTK or my mistake.
In case I couldn't get a solution to my problem, how could I implement a
pick in VTK? I think getting the picking coordinates from java mouse
listeners and testing if the ray from the view point, going through the
pick point, intersects the actors. Is there a filter to do that?
Please I need help.
Thanks.
On Wed, 12 Sep 2001, Carlos Martinez Burgos wrote:
> Hi all.
>
> I'm developing an application in Java, using VTK to show some 3D objects.
> I need to develop some functionalities like cutting planes, picking
> objects, camera interaction, parallel projections and so on. Furthermore I
> need to put the render panel on a window with some GUI, like buttons,
> labels, textfields, etc.
>
> I'm having problems to implement this in VTK, perhaps because I'm not a
> VTK guru. The main problems are:
>
> I have extended a JPanel in wich I add the Canvas that shows the
> renderWindow. I have copied some code from vtkPanel and added on this
> class to implement the render function, mouse interaction, etc.
> The problem is that when I add other GUI objects to this JPanel extended
> class I can't see it. I add the canvas to the center using a BorderLayout
> and another JPanel with border and some JLabel to the east. I can see this
> panel. How can I show it? Have somebody done this?
>
> Furthermore, sometimes, when I move the mouse outside the canvas, it turns
> gray like if it doesn't show anything. Do you know the problem?
>
>
> I have a problem with picking too. I implement a KeyListener in wich on a
> keyPressed event I create a vtkPicker and run its pick object with the
> position of the mouse, that is updated in a mouseMoved event. I implement
> a pick method on an object that contains the VTK pipeline to show a
> surface (vtkPolyData, vtkPolyDataMapper and vtkActor). In this method I
> show the outline of this surface (using a vtkOutlineFilter).
>
> The problem is that when I press the key, with the mouse pointing near to
> a surface, but not exactly on it, it is hited many times. I send some code
> to test it. I have run pickCells.tcl sample and this doesn't happen. Do
> you know why this occurs? Is this only a Java bindings problems?
>
>
> If you could answer with some code I'll be gratefull.
>
> Thank you and sorry for my english.
>
>
--
----------------------------------------------------------------------
Carlos Martínez Burgos | Instituto Tecnológico de Informática
Ingeniero Informático | Universidad Politécnica de Valencia
Tlf: +34 963877237 | Camí de Vera, S/N
cmarbur at iti.upv.es | 46071 Valencia - Spain
www.iti.upv.es/~cmarbur | www.iti.upv.es
----------------------------------------------------------------------
-------------- next part --------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import vtk.*;
public class PickTest extends JFrame implements KeyListener,MouseListener,MouseMotionListener {
MyVTKPanel panelVTK;
vtkConeSource cone;
vtkOutlineFilter coneOutline;
vtkPolyDataMapper coneMapper,coneOutlineMapper;
vtkActor coneActor,coneOutlineActor;
vtkSphereSource sphere;
vtkOutlineFilter sphereOutline;
vtkPolyDataMapper sphereMapper,sphereOutlineMapper;
vtkActor sphereActor,sphereOutlineActor;
int lastX,lastY;
boolean helpShowed=false;
public PickTest() {
super("Picking test");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
panelVTK=new MyVTKPanel();
panelVTK.setSize(700,700);
panelVTK.LightFollowCameraOn();
panelVTK.getRenderer().SetBackground(1,1,1);
panelVTK.addKeyListener(this);
panelVTK.addMouseListener(this);
panelVTK.addMouseMotionListener(this);
getContentPane().add(panelVTK,BorderLayout.CENTER);
cone=new vtkConeSource();
vtkPolyDataMapper coneMapper=new vtkPolyDataMapper();
coneMapper.SetInput(cone.GetOutput());
coneActor=new vtkActor();
coneActor.SetMapper(coneMapper);
coneOutline=new vtkOutlineFilter();
coneOutline.SetInput(cone.GetOutput());
coneOutlineMapper=new vtkPolyDataMapper();
coneOutlineMapper.SetInput(coneOutline.GetOutput());
coneOutlineActor=new vtkActor();
coneOutlineActor.SetMapper(coneOutlineMapper);
coneOutlineActor.GetProperty().SetColor(0,0,0);
coneOutlineActor.PickableOff();
coneOutlineActor.VisibilityOff();
panelVTK.getRenderer().AddActor(coneActor);
panelVTK.getRenderer().AddActor(coneOutlineActor);
sphere=new vtkSphereSource();
sphereMapper=new vtkPolyDataMapper();
sphereMapper.SetInput(sphere.GetOutput());
sphereActor=new vtkActor();
sphereActor.SetMapper(sphereMapper);
sphereActor.SetPosition(1,0,0);
sphereOutline=new vtkOutlineFilter();
sphereOutline.SetInput(sphere.GetOutput());
sphereOutlineMapper=new vtkPolyDataMapper();
sphereOutlineMapper.SetInput(sphereOutline.GetOutput());
sphereOutlineActor=new vtkActor();
sphereOutlineActor.SetMapper(sphereOutlineMapper);
sphereOutlineActor.GetProperty().SetColor(0,0,0);
sphereOutlineActor.SetPosition(1,0,0);
sphereOutlineActor.PickableOff();
sphereOutlineActor.VisibilityOff();
panelVTK.getRenderer().AddActor(sphereActor);
panelVTK.getRenderer().AddActor(sphereOutlineActor);
}
public void picked() {
vtkPicker picker=new vtkPicker();
System.out.println("Selection point: ("+lastX+","+lastY+")");
picker.Pick(lastX,getSize().getHeight()-lastY,0,panelVTK.getRenderer());
vtkActor actor=picker.GetActor();
if (actor==coneActor) {
pickedCone();
}
else if (actor==sphereActor) {
pickedSphere();
}
}
public void pickedCone() {
if (coneOutlineActor.GetVisibility()==0)
coneOutlineActor.VisibilityOn();
else
coneOutlineActor.VisibilityOff();
}
public void pickedSphere() {
if (sphereOutlineActor.GetVisibility()==0)
sphereOutlineActor.VisibilityOn();
else
sphereOutlineActor.VisibilityOff();
}
public void keyPressed(KeyEvent e) {
if (e.getKeyChar()=='u') {
picked();
}
else if (e.getKeyChar()=='r') {
panelVTK.getCamera().Azimuth(130);
panelVTK.getCamera().OrthogonalizeViewUp();
panelVTK.getLight().SetPosition(panelVTK.getCamera().GetPosition());
panelVTK.getLight().SetFocalPoint(panelVTK.getCamera().GetFocalPoint());
System.out.println("Now point to the cone at left of position (465,350) and pick with key 'u'");
}
else if (e.getKeyChar()=='h') {
System.out.println("1: press the 'r' key to reset the camera.");
System.out.println("2: point to the cone at left of position (465,350)");
System.out.println("3: press the 'u' key to pick the object");
System.out.println("In my computer I get the sphere selected instead of the cone. Do you?");
helpShowed=true;
}
panelVTK.Render();
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public void mouseEntered(MouseEvent e) {
lastX=e.getX();
lastY=e.getY();
if (helpShowed)
System.out.println("Mouse point: ("+lastX+","+lastY+")");
}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
lastX=e.getX();
lastY=e.getY();
if (helpShowed)
System.out.println("Mouse point: ("+lastX+","+lastY+")");
}
public void mouseClicked(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {
lastX=e.getX();
lastY=e.getY();
if (helpShowed)
System.out.println("Mouse point: ("+lastX+","+lastY+")");
}
public static void main(String args[]) {
PickTest frame=new PickTest();
frame.pack();
frame.setVisible(true);
System.out.println("Press the 'h' key to view some instructions.");
}
class MyVTKPanel extends vtkPanel {
public MyVTKPanel() {
super();
}
public vtkCamera getCamera() {
return cam;
}
public vtkLight getLight() {
return lgt;
}
}
}
More information about the vtkusers
mailing list