JavaFX 3D如何使用相对位置移动节点 [英] JavaFX 3D How to move node using relative positions

查看:200
本文介绍了JavaFX 3D如何使用相对位置移动节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试自动化某些节点的移动。
我想在另一个节点上移动一个节点但是我无法使用通用方法实现它。



I.E。我写了这样的东西:

  public Point3D getPosition(Node referenceNode,Node nodeToPlace){
Bounds refBounds = referenceNode。 getBoundsInParent();
double refX = refBounds.getMinX()+(refBounds.getWidth()/ 2);
double refY = refBounds.getMaxY()+ nodeToPlace.getBoundsInParent()。getHeight();
double refZ = refBounds.getMinZ()+(refBounds.getDepth()/ 2);

double nodeToPlaceX = nodeToPlace.getBoundsInParent()。getMinX()+
(nodeToPlace.getBoundsInParent()。getWidth()/ 2);
double nodeToPlaceY = nodeToPlace.getBoundsInParent()。getMinY()+
(nodeToPlace.getBoundsInParent()。getHeigth()/ 2);
double nodeToPlaceZ = nodeToPlace.getBoundsInParent()。getMinZ()+
(nodeToPlace.getBoundsInParent()。getDepth()/ 2);

double translationX = refX - nodeToPlaceX;
double translationY = refY - nodeToPlaceY;
double translationZ = refZ - nodeToPlaceZ;

nodeToPlace.getTransforms()。add(new Translate(translationX,
translationY,translationZ));
}

我做错了什么?我想我并没有考虑重要的事情,但我无法理解。我希望有人能以正确的方式解释我......提前致谢。

解决方案

基于第一个看到的例子

  import javafx.animation.Animation; 
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;

/ **
@@see https://stackoverflow.com/a/37516327/230513
* @see https://stackoverflow.com/a/37370840/ 230513
* /
公共类TimelineMove扩展应用程序{

私有静态最终双SIZE = 300;
私人最终内容内容= Content.create(SIZE);

public void play(){
content.animation.play();
}

private static final class Content {

private static final Duration DURATION = Duration.seconds(4);
private static final int W = 64;
private final Group group = new Group();
private final旋转rx = new旋转(0,Rotate.X_AXIS);
private final旋转ry = new Rotate(0,Rotate.Y_AXIS);
private final旋转rz = new旋转(0,Rotate.Z_AXIS);
私人决赛Box b1;
私人决赛Box b2;
私人最终动画动画;

private static内容创建(双倍大小){
内容c =新内容(大小);
c.group.getChildren()。addAll(c.b1,c.b2);
c.group.getTransforms()。addAll(c.rz,c.ry,c.rx);
c.rx.setAngle(12);
c.ry.setAngle(-12);
返回c;
}

私人内容(双倍大小){
Point3D p1 =新Point3D(-size / 4,-size / 4,size / 4);
b1 = createBox(Color.AQUA,p1);
Point3D p2 =新Point3D(size / 4,size / 4,-size / 4);
b2 = createBox(Color.CORAL,p2);
animation = createTimeline(p1,p2);
}

私人Box createBox(颜色,Point3D p){
方框b =新方框(W,W,W);
b.setMaterial(new PhongMaterial(color));
b.setTranslateX(p.getX());
b.setTranslateY(p.getY());
b.setTranslateZ(p.getZ());
返回b;
}

私人时间线createTimeline(Point3D p1,Point3D p2){
时间轴t =新时间轴();
t.setCycleCount(Timeline.INDEFINITE);
t.setAutoReverse(true);
KeyValue keyX = new KeyValue(b1.translateXProperty(),p2.getX() - p1.getX());
KeyValue keyY = new KeyValue(b1.translateYProperty(),p2.getY() - p1.getY());
KeyValue keyZ = new KeyValue(b1.translateZProperty(),p1.getZ() - p2.getZ());
KeyFrame keyFrame = new KeyFrame(DURATION,keyX,keyY,keyZ);
t.getKeyFrames()。add(keyFrame);
返回t;
}
}

@Override
public void start(Stage primaryStage)抛出异常{
primaryStage.setTitle(JavaFX 3D);
场景场景=新场景(content.group,SIZE * 2,SIZE * 2,true);
primaryStage.setScene(scene);
scene.setFill(Color.BLACK);
PerspectiveCamera camera = new PerspectiveCamera(true);
camera.setFarClip(SIZE * 6);
camera.setTranslateZ(-2 * SIZE);
scene.setCamera(相机);
scene.setOnScroll((final ScrollEvent e) - > {
camera.setTranslateZ(camera.getTranslateZ()+ e.getDeltaY());
});
primaryStage.show();
play();
}

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


I am trying to automate some node's movements. I would like to move a node on top of another node but I am not able to achieve it using a generic method.

I.E. I wrote something like this:

    public Point3D getPosition(Node referenceNode, Node nodeToPlace) {
            Bounds refBounds = referenceNode.getBoundsInParent();
            double refX = refBounds.getMinX() + (refBounds.getWidth() / 2);
            double refY = refBounds.getMaxY() + nodeToPlace.getBoundsInParent().getHeight();
            double refZ = refBounds.getMinZ() + (refBounds.getDepth() / 2);

            double nodeToPlaceX = nodeToPlace.getBoundsInParent().getMinX() + 
                    (nodeToPlace.getBoundsInParent().getWidth()/2);
            double nodeToPlaceY = nodeToPlace.getBoundsInParent().getMinY() + 
                    (nodeToPlace.getBoundsInParent().getHeigth()/2);
            double nodeToPlaceZ = nodeToPlace.getBoundsInParent().getMinZ() + 
                    (nodeToPlace.getBoundsInParent().getDepth()/2);

            double translationX = refX - nodeToPlaceX;
            double translationY = refY - nodeToPlaceY;
            double translationZ = refZ - nodeToPlaceZ;

            nodeToPlace.getTransforms().add(new Translate(translationX,
            translationY, translationZ));
        }

What am I doing wrong? I suppose that I am not considering something of important but I can't figure it. I hope that someone can explain me the right way... Thanks in advance.

解决方案

Based on the first example seen here, the example below uses a Timeline to animate the motion of b1, shaded AQUA, toward b2, tinted CORAL.

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 @ @see https://stackoverflow.com/a/37516327/230513
 * @see https://stackoverflow.com/a/37370840/230513
 */
public class TimelineMove extends Application {

    private static final double SIZE = 300;
    private final Content content = Content.create(SIZE);

    public void play() {
        content.animation.play();
    }

    private static final class Content {

        private static final Duration DURATION = Duration.seconds(4);
        private static final int W = 64;
        private final Group group = new Group();
        private final Rotate rx = new Rotate(0, Rotate.X_AXIS);
        private final Rotate ry = new Rotate(0, Rotate.Y_AXIS);
        private final Rotate rz = new Rotate(0, Rotate.Z_AXIS);
        private final Box b1;
        private final Box b2;
        private final Animation animation;

        private static Content create(double size) {
            Content c = new Content(size);
            c.group.getChildren().addAll(c.b1, c.b2);
            c.group.getTransforms().addAll(c.rz, c.ry, c.rx);
            c.rx.setAngle(12);
            c.ry.setAngle(-12);
            return c;
        }

        private Content(double size) {
            Point3D p1 = new Point3D(-size / 4, -size / 4, size / 4);
            b1 = createBox(Color.AQUA, p1);
            Point3D p2 = new Point3D(size / 4, size / 4, -size / 4);
            b2 = createBox(Color.CORAL, p2);
            animation = createTimeline(p1, p2);
        }

        private Box createBox(Color color, Point3D p) {
            Box b = new Box(W, W, W);
            b.setMaterial(new PhongMaterial(color));
            b.setTranslateX(p.getX());
            b.setTranslateY(p.getY());
            b.setTranslateZ(p.getZ());
            return b;
        }

        private Timeline createTimeline(Point3D p1, Point3D p2) {
            Timeline t = new Timeline();
            t.setCycleCount(Timeline.INDEFINITE);
            t.setAutoReverse(true);
            KeyValue keyX = new KeyValue(b1.translateXProperty(), p2.getX() - p1.getX());
            KeyValue keyY = new KeyValue(b1.translateYProperty(), p2.getY() - p1.getY());
            KeyValue keyZ = new KeyValue(b1.translateZProperty(), p1.getZ() - p2.getZ());
            KeyFrame keyFrame = new KeyFrame(DURATION, keyX, keyY, keyZ);
            t.getKeyFrames().add(keyFrame);
            return t;
        }
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("JavaFX 3D");
        Scene scene = new Scene(content.group, SIZE * 2, SIZE * 2, true);
        primaryStage.setScene(scene);
        scene.setFill(Color.BLACK);
        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.setFarClip(SIZE * 6);
        camera.setTranslateZ(-2 * SIZE);
        scene.setCamera(camera);
        scene.setOnScroll((final ScrollEvent e) -> {
            camera.setTranslateZ(camera.getTranslateZ() + e.getDeltaY());
        });
        primaryStage.show();
        play();
    }

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

这篇关于JavaFX 3D如何使用相对位置移动节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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