JavaFX 3D PerspectiveCamera влияет на положение перетаскивания узла - PullRequest
0 голосов
/ 05 марта 2019

У меня возникли проблемы при попытке перемещения узлов в JavaFX в 3D-сцене.Проблема в том, что я хочу, чтобы мышь оставалась в положении внутри узла, на который я нажал, то есть в центре.С PerspectiveCamera это изменит положение.Я попробовал несколько разных методов, и мне не повезло.2D-прямоугольники и 3D-боксы (без камеры) работают отлично, но после добавления PerspectiveCamera, независимо от параметра true / false, у меня возникают проблемы.

Мне интересно, следует ли сообщать об этой ошибке,или если есть какой-то способ получить другую перспективу, влияющую на перемещение узлов

public class Move extends Application {

double x0,xDiff;
double y0,yDiff;
@Override
public void start(Stage primaryStage) {

    Box b = new Box(100,100,1);
    b.setLayoutX(0);
    b.setLayoutY(0);
//    b.setTranslateZ(20000);

    Pane root = new Pane();
    root.getChildren().add(b);

    PhongMaterial p = new PhongMaterial();
    p.setDiffuseColor(Color.RED);
    b.setMaterial(p);

    Scene scene = new Scene(root, 2000, 1250,true);
    PerspectiveCamera camera = new PerspectiveCamera(true);
    camera.setTranslateZ(-1000);
    camera.setFarClip(2000);
    scene.setCamera(camera);
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

        b.setOnMousePressed(event
     ->{
            x0 = event.getSceneX();
            y0 = event.getSceneY();
            event.consume();
        });

        b.setOnMouseDragged(event
    ->{



        xDiff = event.getSceneX() - x0;
        yDiff = event.getSceneY() - y0;
        b.setLayoutX(b.getLayoutX() + xDiff);
        b.setLayoutY(b.getLayoutY() + yDiff);

        x0 = event.getSceneX();
        y0 = event.getSceneY();

});
}     
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

Я использую Java 8 с обновлением 91 или 181 (кажется, NetBeans устанавливает значение по умолчанию на 91, но у меня 181 какхорошо)

JavaFX Перемещение 3D-объектов с помощью мыши по виртуальной плоскости

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

Большое спасибо

РЕДАКТИРОВАТЬ: После попытки вернуться к тому, как я первоначально перетащил, я смог добраться до точки, где я мог заставить курсор мыши оставаться в середине, но я пытаюсь выяснить, каки точное положение.

b.setLayoutX(b.getLayoutX() + (event.getX()));
b.setLayoutY(b.getLayoutY() + (event.getY()));

даст мне центр узла.

Первоначально я использовал код, подобный этому для 2D, но у меня были проблемы с 3D, что, я полагаю,был из-за разницы 0,0 верхнего левого угла, против 0,0,0 в центре.

Код для 2D был что-то вроде

b.setLayoutX(b.getLayoutX() + (event.getX()-b.getMinX()));
b.setLayoutY(b.getLayoutY() + (event.getY()-b.getMinY()));

По существуИсходя из того, что я вижу, когда я устанавливаю исходный макет + положение события, он просто перемещает центр / верхний левый угол к координатам события мыши, поэтому я попытался бы получить разницу между источником узла и mouseEvent,это то, что делает event.getX (), и попытайтесь выяснить разницу для перемещения, для чего и нужен event.getSceneX() - x0.Я пытался сделать это без Scene X / Y, но, похоже, он не работает должным образом, но я не уверен, что мне следует использовать SceneX / Y.

...