gpt4 book ai didi

java - 如何使用相机正确显示 3D 形状?

转载 作者:行者123 更新时间:2023-11-30 07:04:54 24 4
gpt4 key购买 nike

我正在尝试让一些形状能够彼此“很好地配合”。我有两个相邻的盒子,其中一个盒子的“顶部”有一个圆柱体。我将它们放在带有相机的 SubScene 中,该相机可以通过滚动操作进行放大和缩小,并通过拖动进行平移。这是我的 MCVE:

import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.SubScene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.Cylinder;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;

public class MyApp extends Application {

DoubleProperty transX = new SimpleDoubleProperty();
DoubleProperty transY = new SimpleDoubleProperty();
DoubleProperty transZ = new SimpleDoubleProperty();

double startX, startY, curX, curY;

@Override
public void start(Stage stage) throws Exception {

Box box1 = new Box(30, 30, 5);
box1.setMaterial(new PhongMaterial(Color.RED));
Box box2 = new Box(30, 30, 5);
box2.setMaterial(new PhongMaterial(Color.GREEN));
box2.setTranslateX(32);
Cylinder cyn = new Cylinder(5, 15);

Group root = new Group(box1, box2, cyn);
root.getTransforms().addAll(new Translate(0, 0, 200),
new Rotate(-60, Rotate.X_AXIS),
new Rotate(-45, Rotate.Z_AXIS));

SubScene subs = new SubScene(root, 0, 0, true, SceneAntialiasing.BALANCED);

PerspectiveCamera camera = new PerspectiveCamera(true);
camera.setFarClip(1000);
camera.setNearClip(0);
camera.translateZProperty().bind(transZ);
camera.translateXProperty().bind(transX);
camera.translateYProperty().bind(transY);
subs.setCamera(camera);

Pane pane = new Pane(subs);
pane.setStyle("-fx-border-color: red;" +
"-fx-border-width: 3;");
subs.widthProperty().bind(pane.widthProperty());
subs.heightProperty().bind(pane.heightProperty());

pane.setOnScroll(e -> transZ.set(transZ.get() + e.getDeltaY() * 0.2));
pane.setOnMousePressed(e -> {
startX = curX = e.getX();
startY = curY = e.getY();
});
pane.setOnMouseDragged(e -> {
startX = curX;
startY = curY;
curX = e.getX();
curY = e.getY();
double deltaX = curX - startX;
double deltaY = curY - startY;
double deltaZ = deltaY * Math.sqrt(3);
transX.set(transX.get() - deltaX);
transY.set(transY.get() - deltaY);
transZ.set(transZ.get() + deltaZ);
});

Scene scene = new Scene(pane, 500, 500);
stage.setScene(scene);
stage.sizeToScene();
stage.show();
}

public static void main(String[] args) throws Exception {

launch(args);
}
}

我这里有两个问题:

  1. Z 顺序由我将它们放入组中的顺序指定。我希望 Z 顺序能够“照顾好自己”。如果我在空间中有具有特定坐标和尺寸的形状,并且相机处于特定位置和角度,我应该会看到独特的 View ,而无需指定顺序。这是一张图片:

    enter image description here

    看起来绿色框比红色框更靠近相机,但我的代码并不暗示这一点。

  2. 当相机平移时,圆柱体相对于盒子移动。在图像中,我用蓝线标记了红色框中圆柱体的位置:

    enter image description here

    现在我平移相机并得到

    enter image description here

    我希望当平移相机时形状的相对位置不会改变。

  3. 编辑:我从问题中删除了此问题并在另一个问题中提问:
    形状显示在边框顶部:

    enter image description here

    我认为因为形状位于 Pane 中,所以 Pane 的边框在 Z 顺序中会更高。我希望边框出现在顶部。

最佳答案

我猜这实际上是 JavaFX 中的一个错误,但至少它很容易修复。只是不要将相机的近裁剪 Pane 设置为 0。将这行代码更改为

camera.setNearClip(10);

将解决您的前两个问题。

关于java - 如何使用相机正确显示 3D 形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40317114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com