当前位置: 首页 > 面试题库 >

JavaFX 3D如何使用相对位置移动节点

柴英锐
2023-03-14
问题内容

我正在尝试使某些节点的动作自动化。我想将一个节点移到另一个节点的顶​​部,但是我无法使用通用方法来实现它。

IE浏览器我写了这样的事情:

    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));
        }

我究竟做错了什么?我想我没有考虑重要的事情,但我不知道。我希望有人能以正确的方式向我解释…预先感谢。


问题答案:

根据此处看到的第一个示例,下面的示例使用aTimeline来动画化b1着色AQUA,朝向b2,朝着色的运动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);
    }
}


 类似资料:
  • 我正在做Liferay 6.2项目。在Liferay中,他们使用了Vaadin。当我点击一个按钮时,它会打开一个不同的iframe。我可以为所有功能编写代码。现在我想使用WebDriver将光标移动到iframe元素。因为当我将鼠标移动到iframe复选框之后,我的自动脚本就可以运行了。我想自动化一个脚本,将鼠标指针移动到元素。 我已经尝试了下面的代码,但它不起作用。 1) 使用动作移动元素: 2

  • 我有一个包含文本视图的回收器视图。文本视图的数量可以变化,它们的大小也可以变化,并且可以动态更改。 当用户滚动到列表中的某个位置并退出应用程序时,我希望能够在下一个会话中返回到该确切位置。 为此,我需要知道从视图中当前TextView开始的地方已经滚动了多少像素,以及滚动的当前位置。例如,如果用户看到第三个TextView,并从该TextView开始的地方向下滚动100个像素,我将能够使用scro

  • 问题内容: 和CSS 和有什么不一样?那你什么时候应该使用呢? 问题答案: CSS绝对定位 绝对定位是最容易理解的。您从CSS 属性开始: 这告诉浏览器应将要定位的所有内容从文档的正常流程中删除,并将其放置在页面上的确切位置。它不会影响HTML中它之前或之后的元素在网页上的放置方式,但是除非您重写它,否则 它将 取决于其父级的位置。 如果你想一个元素从文档窗口的顶部10个像素的位置,你会使用偏移与

  • 问题内容: 我在另一个div内有两个div,我想使用css将一个子div放在父div的右上角,另一个子div放在父div的底下。即,我想对两个子div使用绝对定位,但是将它们相对于父div而不是页面定位。我怎样才能做到这一点? 范例html: 问题答案: 这工作,因为手段类似“使用,,,来定位自己相对于谁拥有最近的祖先或”。 因此,我们使have 和子代都有,然后使用和定位子代。

  • 我目前创建了一个动态的身体,并且用Vector2()以恒定的速度移动。我想要的是当身体离开屏幕边缘时,立即从当前点回到原点。我该怎么做?

  • 问题内容: 当我尝试对具有足够大数字的范围进行绘图时,我得到了所有刻度线都相对移动的轴。例如: 我在横坐标轴上得到了这些刻度: 问题是如何删除并获取: 问题答案: 这将抓取,获取x轴axis对象,然后获取主对象,并将设置为false(doc)。 在matplotlib的较新版本(1.4+)中,可以通过 更改默认行为。