首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在3d世界中使用鼠标

如何在3d世界中使用鼠标
EN

Stack Overflow用户
提问于 2010-07-30 22:38:50
回答 3查看 578关注 0票数 2

我有一些关于如何在3d世界中使用鼠标的问题。

现在我在三维世界中有几个点,通过这些点我可以画曲线。

我想用鼠标在这条曲线上选择一个点,3d世界的视点是可以改变的,所以我想知道当我在曲线附近点击鼠标按钮时,在任何视区,哪个点离鼠标最近?或者我选择了哪个点?

我确实不知道如何实现它,如果你知道请帮助我。

谢谢。祝好运。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-30 22:49:31

OpenGL有一个selection mode,你可以通过它获取鼠标点击的位置,并创建一个矩阵,将绘图限制在鼠标周围的某个任意(小)区域(例如,7x7像素块)。然后你可以绘制你的“东西”(曲线,点,任何东西),它将创建一个记录所有落入你定义的块内的对象。如果该块中有多个项目,您将获得所有项目的记录,每个项目一条记录,按从前到后的z顺序排序。

完成后,您将获得鼠标单击附近的点的记录。大多数时候,你只会使用最靠近前面的那个,但偶尔你会想要做更多的工作来找出它们中的哪一个(显然是不止一个)真正离最初的鼠标点击点最近。如果您决定这样做,gluProject和(可能) gluUnProject会很方便。

票数 2
EN

Stack Overflow用户

发布于 2010-07-30 23:01:25

如果您尝试单击离散点(可能是曲线上的节点),另一种方法是将它们重新投影到屏幕坐标中,并检查与鼠标位置的紧密匹配-因为这是在整数坐标中完成的,并且只需要大致准确地完成(假设您的点之间的距离超过几个屏幕像素)。

另一个技巧过去是在屏幕外缓冲区中重新绘制场景,每个点(或曲线上的位置)绘制为不同的RGB颜色-然后使用getPixel函数返回鼠标点下的颜色并查找点id。这在具有雾的复杂场景中不起作用。

票数 3
EN

Stack Overflow用户

发布于 2016-02-27 03:33:56

下面的java代码可以在3d屏幕中选择原始形状(线、点等)或3d几何图形(立方体、球体等),并打印所选的内容。

首先构建一个主类(i.e.tuval1),然后构建一个公共类(即secim2)。

公共类tuval1 {

代码语言:javascript
运行
复制
public static void main(String[] args) {
    // TODO Auto-generated method stub

new secim2();

代码语言:javascript
运行
复制
}

}

导入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;

代码语言:javascript
运行
复制
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");

       }

    }

}

}

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3372509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档