Я разрабатываю шутер от первого лица в javaFx8.У меня проблемы с 3DShapes, которые я использую в качестве стен в моей сцене.Это странный эффект, когда я могу видеть сквозь стену за другими стенами позади.
Я заметил, что порядок добавления стен в моей группе влияет на эффект.
Кажется, что последняя стена всписок ведет себя нормально и остается непрозрачным, когда камера игрока указывает на него, но если эта же стена будет первой в списке, она будет прозрачной.
Включение глубинного буфера сцены не помогло, насколько я понимаю,для перекрывающихся фигур, что не в моем случае.Может быть, я что-то упустил.Любая помощь будет высоко ценится.
Иллюстрация проблемы:
public class Display extends Application {
private final int WIDTH = 1920;
private final int HEIGHT = 1080;
private Group stage;
private MyCamera camera;
private Obstacle platform;
private Player player;
private Scene scene;
@Override
public void start(Stage GameWorld) {
platform = new Obstacle(7000, 7000, 0, 0, 0, 0);
player = new Player(100, -3000, 0, 92.0);
camera = new MyCamera(player);
initStage();
initScene();
initKeyListner(scene);
initMouseControl(stage, scene);
GameWorld.setScene(scene);
GameWorld.show();
}
private void initScene(){
scene = new Scene(stage, WIDTH, HEIGHT, true, SceneAntialiasing.BALANCED);// True allows 3D features
scene.setFill(Color.WHITE);
scene.setCamera(camera.getCamera());
}
private void initStage(){
stage = new Group();
stage.getChildren().add(new AmbientLight(Color.WHITE));
stage.getChildren().add(platform.getBody());
stage.getChildren().add(player.getBody());
Obstacle wall1 = new Obstacle(60, 7000, 200,3500, 0, GROUND_Z);
Obstacle wall2 = new Obstacle(7000, 60, 200,10, -3500, GROUND_Z);
Obstacle wall3 = new Obstacle(60, 7000, 200,-3500, 0, GROUND_Z);
Obstacle wall4 = new Obstacle(7000, 60, 200,10, 3500, GROUND_Z);
Obstacle wall5 = new Obstacle(600, 2500, 200,-2000, 1600, GROUND_Z);
Obstacle wall6 = new Obstacle(600, 2500, 200,2000, 1600, GROUND_Z);
Obstacle wall7 = new Obstacle(600, 2500, 200,2000, -1600, GROUND_Z);
Obstacle wall8 = new Obstacle(600, 2500, 200,-2000, -1600, GROUND_Z);
Group groupWall = new Group(wall1.getBody(), wall2.getBody(), wall3.getBody(),
wall4.getBody(), wall6.getBody(),wall5.getBody(), wall7.getBody(), wall8.getBody());
groupWall.setId("walls");
stage.getChildren().add(groupWall);
}
public static void main(String[] args) {
Application.launch(args);
}
}
public class MyCamera {
private Camera camera;
public MyCamera(Player player){
camera = new PerspectiveCamera(true);
init(player);
}
public void init(Player player){
camera.getTransforms().addAll(new Translate(0, player.getSize()/2, -30), new Rotate(90, Rotate.X_AXIS));
camera.setFarClip(6000);
camera.setNearClip(0.01);
}
public Camera getCamera(){
return camera;
}
}
public class Obstacle {
public Box obstacle;
public Obstacle(double w, double h, double depth,
double xt, double yt, double zt){
obstacle = new Box(w, h, depth);
setTranslation(xt, yt, zt);
}
public void setTranslation(double x, double y, double z){
obstacle.setTranslateX(x);
obstacle.setTranslateY(y);
obstacle.setTranslateZ(z);
}
public Box getBody(){
return obstacle;
}
}