我有一些关于如何在3d世界中使用鼠标的问题。
现在我在三维世界中有几个点,通过这些点我可以画曲线。
我想用鼠标在这条曲线上选择一个点,3d世界的视点是可以改变的,所以我想知道当我在曲线附近点击鼠标按钮时,在任何视区,哪个点离鼠标最近?或者我选择了哪个点?
我确实不知道如何实现它,如果你知道请帮助我。
谢谢。祝好运。
发布于 2010-07-30 22:49:31
OpenGL有一个selection mode,你可以通过它获取鼠标点击的位置,并创建一个矩阵,将绘图限制在鼠标周围的某个任意(小)区域(例如,7x7像素块)。然后你可以绘制你的“东西”(曲线,点,任何东西),它将创建一个记录所有落入你定义的块内的对象。如果该块中有多个项目,您将获得所有项目的记录,每个项目一条记录,按从前到后的z顺序排序。
完成后,您将获得鼠标单击附近的点的记录。大多数时候,你只会使用最靠近前面的那个,但偶尔你会想要做更多的工作来找出它们中的哪一个(显然是不止一个)真正离最初的鼠标点击点最近。如果您决定这样做,gluProject
和(可能) gluUnProject
会很方便。
发布于 2010-07-30 23:01:25
如果您尝试单击离散点(可能是曲线上的节点),另一种方法是将它们重新投影到屏幕坐标中,并检查与鼠标位置的紧密匹配-因为这是在整数坐标中完成的,并且只需要大致准确地完成(假设您的点之间的距离超过几个屏幕像素)。
另一个技巧过去是在屏幕外缓冲区中重新绘制场景,每个点(或曲线上的位置)绘制为不同的RGB颜色-然后使用getPixel函数返回鼠标点下的颜色并查找点id。这在具有雾的复杂场景中不起作用。
发布于 2016-02-27 03:33:56
下面的java代码可以在3d屏幕中选择原始形状(线、点等)或3d几何图形(立方体、球体等),并打印所选的内容。
首先构建一个主类(i.e.tuval1),然后构建一个公共类(即secim2)。
公共类tuval1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new secim2();
}
}
导入java.awt.GraphicsConfiguration;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.media.j3d.Appearance;
导入javax.media.j3d.BranchGroup;
导入javax.media.j3d.Canvas3D;
导入javax.media.j3d.PolygonAttributes;
导入javax.media.j3d.Shape3D;
导入javax.media.j3d.Transform3D;
导入javax.media.j3d.TransformGroup;
导入javax.swing.JFrame;
导入javax.vecmath.Vector3f;
导入com.sun.j3d.utils.geometry.ColorCube;
导入com.sun.j3d.utils.geometry.Primitive;
导入com.sun.j3d.utils.geometry.Sphere;
导入com.sun.j3d.utils.picking.PickCanvas;
导入com.sun.j3d.utils.picking.PickResult;
导入com.sun.j3d.utils.universe.SimpleUniverse;
公共类secim2扩展了MouseAdapter{私有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);
canvas.setSize(400, 400);
SimpleUniverse universe = new SimpleUniverse(canvas);
BranchGroup group = new BranchGroup();
// create a color cube
Vector3f vector = new Vector3f(-0.3f, 0.0f, 0.0f);
Transform3D transform = new Transform3D();
transform.setTranslation(vector);
TransformGroup transformGroup = new TransformGroup(transform);
ColorCube cube = new ColorCube(0.2f);
transformGroup.addChild(cube);
group.addChild(transformGroup);
// create sphere
Vector3f vector2=new Vector3f(+0.5f,0.0f,0.0f);
Appearance app=new Appearance();
app.setPolygonAttributes(
new PolygonAttributes(PolygonAttributes.POLYGON_LINE,
PolygonAttributes.CULL_BACK,0.0f));
Transform3D transform2= new Transform3D();
transform2.setTranslation(vector2);
TransformGroup transformGroup2=new TransformGroup(transform2) ;
Sphere sphere= new Sphere(0.2f ,app);
transformGroup2.addChild(sphere );
group.addChild(transformGroup2);
universe.getViewingPlatform().setNominalViewingTransform();
universe.addBranchGraph(group);
pickCanvas = new PickCanvas(canvas, group);
pickCanvas.setMode(PickCanvas.BOUNDS);
pencere.add(canvas);
canvas.addMouseListener(this);
}
public void mouseClicked(MouseEvent o)
{
pickCanvas.setShapeLocation(o);
PickResult result = pickCanvas.pickClosest();
if (result == null) {
System.out.println("Nothing picked");
} else {
Primitive p = (Primitive)result.getNode(PickResult.PRIMITIVE);
Shape3D s = (Shape3D)result.getNode(PickResult.SHAPE3D);
if (p != null) {
// System.out.println("Selected");
System.out.println(p.getClass().getName());
} else if (s != null) {
System.out.println(s.getClass().getName());
} else{
System.out.println("null");
}
}
}
}
https://stackoverflow.com/questions/3372509
复制相似问题