Java FX 3D:不遵守其Z坐标的对象
我正在尝试设置一个球体绕另一个球体旋转的动画,但是当它的Z坐标变小时,前面的球体不会移动到第二个球体的后面
例如,(0,0,1)和(0,0,-1)都出现在(0,0,0)前面,只是它们的大小根据透视图的不同而不同。不知道如何解决这个问题或我做错了什么,Java FX新手
public class Main extends Application {
private static final int WIDTH = 1280;
private static final int HEIGHT = 720;
Planet earth = new Planet("Earth",50,0,0,0);
Planet earth2 = new Planet("Earth 2",50,25,0,50);
public void start(Stage primaryStage) throws Exception {
Group group = new Group();
group.getChildren().addAll(earth,earth2);
PerspectiveCamera camera = new PerspectiveCamera();
Scene scene = new Scene(group, WIDTH, HEIGHT);
scene.setFill(Color.BLACK);
scene.setCamera(camera);
camera.setNearClip(0);
camera.setFarClip(1000);
camera.setTranslateX(-WIDTH/2);
camera.setTranslateY(-HEIGHT/2);
camera.setTranslateZ(-1000);
primaryStage.setTitle("3D Scene");
primaryStage.setScene(scene);
primaryStage.show();
timeline();
}
public static void main(String[] args) {
launch(args);
}
private void timeline(){
final long start = System.nanoTime();
double FACTOR = 1;
new AnimationTimer(){
@Override
public void handle(long now) {
double t = (now-start)/1000000000.0;
//System.out.println(t);
//earth2.setTranslateX(150*Math.cos(t));
earth2.setTranslateZ(150+500*Math.sin(t));
earth.setPosition(0,0,0);
System.out.println(earth2+" | "+earth);
}
}.start();
}
}
public class Planet extends Sphere {
private String name;
public Planet(String name, double radius, double x, double y, double z){
super(radius);
setPosition(x,y,z);
this.name = name;
}
public void setPosition(double x, double y, double z){
setTranslateX(x);
setTranslateY(y);
setTranslateZ(z);
}
public void move(double x, double y, double z){
translateXProperty().add(x);
translateYProperty().add(y);
translateZProperty().add(z);
}
@Override
public String toString() {
return "["+name+"] - ("+getTranslateX()+","+getTranslateY()+","+getTranslateZ()+")";
}
}
结果:
# 1 楼答案
需要在包含3D对象和/或变换的
Scene
上启用深度缓冲。以下是the documentation:深度缓冲在
Scene
实例化后无法启用,必须使用以下构造函数之一:boolean
参数是深度缓冲标志注意:这也适用于^{}
您还提到必须将^{} 设置为
0.01
,而不是0
。为方便起见,以下是该房产的文件:它说这个值应该大于零。当然,它还说一个值
<= 0
将被视为一个“非常小的正数”,我理解这意味着一个值<= 0
将被解释为一个任意接近,但仍然大于的数字。所以我不确定为什么将值设置为0
会导致任何问题