获取相对于其坐标和变换的节点上的鼠标位置 [英] Get mouse position on node relative to it's coordinates and transforms

查看:142
本文介绍了获取相对于其坐标和变换的节点上的鼠标位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有3D场景,我在场景中有一个窗格,它有一个x轴旋转变换,我想用这个窗格作为战略游戏板,但我有问题。



当我在窗格中输入鼠标时,它给我错误的光标位置。



例如当我进入鼠标来自左上角(红色圆圈)内部窗格(带有黑色边框的旋转窗格)它应该显示我(0,0)作为窗格内的光标位置,但它显示的内容类似于(200,400)。





如何解决这个问题?



或者换句话说,如何在节点上获得相对于节点及其变换的鼠标坐标? / p>

以下是一个示例:

  import javafx.application.Application; 
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.RotateBuilder;
import javafx.stage.Stage;


公共类JFXRotationXOrds extends Application {

@Override
public void start(Stage primaryStage)throws Exception {
VBox root = new垂直框();
root.getChildren()。add(new Rectangle(20,20,Color.BLUE));
root.getChildren()。add(new Circle(20,Color.RED));
//root.rotateProperty().set(30);
root.getTransforms()。add(RotateBuilder.create()。angle(-30).pivotX(0).pivotY(100).axis(new Point3D(1,0,0))。build() );
root.setStyle( - fx-border-color:black; -fx-border-width:5;);

root.setOnMouseMoved(new EventHandler< MouseEvent>(){
@Override
public void handle(MouseEvent arg0){
if(arg0.getEventType()= = MouseEvent.MOUSE_MOVED){
System.out.println(arg0.getX()+,+ arg0.getY());
}

}
});

场景场景=新场景(root,200,500);
primaryStage.setTitle(旋转坐标示例);
primaryStage.setScene(scene);
scene.setCamera(PerspectiveCameraBuilder.create()。fieldOfView(10).build());
primaryStage.show();

}

public static void main(String [] args){
Application.launch(args);
}
}


解决方案

更新



问题已修复 JDK8早期版本。您可以下载该版本,也可以等到它出来。它在2月份作为此票的一部分修复: RT-28129



已编辑



我输入 JavaFX Jira上的票证。您可以按照它查看状态更新。



我已更新演示以反映您的问题。当转换使用z轴(昨天 - 今天对我来说不同)时似乎有效,但是当转换在X或Y轴上时则不行。



希望这对你有所帮助。

  import javafx.application.Application; 
import javafx.event.EventHandler;
import javafx.geometry.Point3D;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.RotateBuilder;
import javafx.stage.Stage;


公共类JFXRotationXOrds extends Application {

@Override
public void start(Stage primaryStage)throws Exception {
VBox root = new垂直框();
final旋转rotate = RotateBuilder.create()。angle(80).pivotX(100).pivotY(100).pivotZ(0).axis(new Point3D(1,0,0))。build() ;
root.getTransforms()。add(rotate);
root.setStyle( - fx-border-color:black; -fx-border-width:5;);

root.setOnMouseMoved(new EventHandler< MouseEvent>(){
@Override
public void handle(MouseEvent arg0){
if(arg0.getEventType()= = MouseEvent.MOUSE_MOVED){
System.out.println(arg0.getSceneX()+,+ arg0.getSceneY());
}
}
});

场景场景=新场景(root,200,500);
PerspectiveCamera camera = new PerspectiveCamera();
scene.setCamera(相机);
primaryStage.setTitle(BorderPane示例);
primaryStage.setScene(scene);
primaryStage.show();

}

public static void main(String [] args){
Application.launch(args);
}
}


I have 3D scene and I have pane inside the scene which has a rotate transform by x axis, I want to use this pane as strategic game board, but I have problem.

when I enter mouse inside a pane it gives me wrong position of cursor.

For example when I enter mouse from upper left corner(red circle) inside pane(rotated pane with black border) it should shows me (0,0) as cursor position inside the pane, But it shows something like (200 , 400).

How can I solve this problem?

OR in other words, how can I get the mouse coordinate on node relative to node and its transforms?

Here is an example:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.RotateBuilder;
import javafx.stage.Stage;


public class JFXRotationXOrds  extends Application{

    @Override
    public void start(Stage primaryStage) throws Exception {
        VBox root = new VBox();
        root.getChildren().add(new Rectangle(20, 20, Color.BLUE));  
        root.getChildren().add(new Circle(20, Color.RED));
        //root.rotateProperty().set(30);
        root.getTransforms().add(RotateBuilder.create().angle(-30).pivotX(0).pivotY(100).axis(new Point3D(1, 0, 0)).build());
        root.setStyle("-fx-border-color: black; -fx-border-width:5; ");

        root.setOnMouseMoved(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent arg0) {
                if(arg0.getEventType() == MouseEvent.MOUSE_MOVED){
                    System.out.println(arg0.getX() + "," + arg0.getY());
                }

            }
        });

        Scene scene = new Scene(root, 200, 500);
        primaryStage.setTitle("Rotation Coordinates Example");
        primaryStage.setScene(scene);
        scene.setCamera(PerspectiveCameraBuilder.create().fieldOfView(10).build());
        primaryStage.show();

    }

    public static void main(String[] args){
        Application.launch(args);
    }
}

解决方案

Update

The problem has been fixed in the JDK8 Early Access Release. You can either download that version, or wait until it comes out. It was fixed in February as part of this ticket: RT-28129

Edited

I entered a ticket on the JavaFX Jira. You can follow it to see the status updates.

I've updated the demo to reflect your problem. It seemed to work when the transformation was using the z-axis (yesterday - different for me today), but not when the transformation was on the X or Y axes.

Hopefully this helps you some.

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Point3D;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.RotateBuilder;
import javafx.stage.Stage;


public class JFXRotationXOrds  extends Application{

    @Override
    public void start(Stage primaryStage) throws Exception {
        VBox root = new VBox();
        final Rotate rotate = RotateBuilder.create().angle(80).pivotX(100).pivotY(100).pivotZ(0).axis(new Point3D(1,0,0)).build();
        root.getTransforms().add(rotate);
        root.setStyle("-fx-border-color: black; -fx-border-width:5; ");

        root.setOnMouseMoved(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent arg0) {
                if(arg0.getEventType() == MouseEvent.MOUSE_MOVED){
                    System.out.println(arg0.getSceneX() + "," + arg0.getSceneY());
                }
            }
        });

        Scene scene = new Scene(root, 200, 500);
        PerspectiveCamera camera = new PerspectiveCamera();
        scene.setCamera(camera);
        primaryStage.setTitle("BorderPane Example");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args){
        Application.launch(args);
    }
}

这篇关于获取相对于其坐标和变换的节点上的鼠标位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆