как подобрать мышку в 3d мире - PullRequest
2 голосов
/ 30 июля 2010

У меня есть несколько вопросов о том, как подобрать мышь в трехмерном мире.

Теперь у меня есть несколько точек в трехмерном мире, используя эти точки, я могу нарисовать кривую

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

Я понятия не имею, как это реализовать, помогите, пожалуйста, если вы знаете.

Спасибо. Удачи.

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Если вы пытаетесь щелкнуть дискретные точки (возможно, узловые точки на кривой), другой подход заключается в том, чтобы проецировать их обратно в координаты экрана и проверять на близкое совпадение с расположением мыши - поскольку это делается в целочисленных координатах и ​​требует толькобыть примерно точным (при условии, что ваши точки расположены на расстоянии более нескольких пикселей экрана).

Еще одна хитрость - перерисовать сцену в закадровом буфере, где каждая точка (или позиция на кривой) нарисована вдругой цвет RGB - затем используйте функцию getPixel, чтобы вернуть цвет под точкой мыши и найти идентификатор точки. Это не работает в сложных сценах с туманом.

2 голосов
/ 30 июля 2010

OpenGL имеет режим выбора , где вы можете выбрать позицию щелчка мыши и создать матрицу, которая ограничивает рисование какой-либо произвольной (маленькой) областью вокруг мыши (например, блок пикселей 7x7) ). Затем вы можете нарисовать ваши «вещи» (кривые, точки, что угодно), и это создаст запись обо всех объектах, которые попали в блок, который вы определили. Если в этот блок попало более одного элемента, вы получите записи о том, что сделал, по одной записи на элемент, отсортированные по z-порядку спереди назад.

Когда вы закончите, вы получите запись точек, которые были близки к щелчку мыши. В большинстве случаев вы просто будете использовать ближайший к фронту, но время от времени вам захочется проделать немного больше работы, чтобы выяснить, какой из них (если их было больше одного, очевидно) был действительно самым близким к исходной точке щелчка мыши. gluProject и (возможно) gluUnProject могут пригодиться, если вы решите это сделать.

0 голосов
/ 26 февраля 2016

java-код, приведенный ниже, позволяет выбирать примитивные фигуры (линии, точки и т. Д.) Или трехмерные геометрии (куб, сфера и т. Д.) На трехмерном экране и печатать то, что выбрано.

во-первых, построил основной класс (ietuval1), а во-вторых, публичный класс (то есть secim2).

публичный класс tuval1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub

new secim2 ();

}

}

import java.awt.GraphicsConfiguration;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.media.j3d.Appearance;

import javax.media.j3d.BranchGroup;

import javax.media.j3d.Canvas3D;

import javax.media.j3d.PolygonAttributes;

import javax.media.j3d.Shape3D;

import javax.media.j3d.Transform3D;

импорт javax.media.j3d.TransformGroup;

импорт javax.swing.JFrame;

импорт javax.vecmath.Vector3f;

импорт com.sun.j3d.utils.geometry.ColorCube;

import com.sun.j3d.utils.geometry.Primitive;

import com.sun.j3d.utils.geometry.Sphere;

import com.sun.j3d.utils.picking.PickCanvas;

import com.sun.j3d.utils.picking.PickResult;

import com.sun.j3d.utils.universe.SimpleUniverse;

открытый класс secim2 extends 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");

       }

    }

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...