javafx 3d камера от первого лица видит сквозь форму - PullRequest
2 голосов
/ 30 апреля 2019

Я разрабатываю шутер от первого лица в javaFx8.У меня проблемы с 3DShapes, которые я использую в качестве стен в моей сцене.Это странный эффект, когда я могу видеть сквозь стену за другими стенами позади.

Я заметил, что порядок добавления стен в моей группе влияет на эффект.
Кажется, что последняя стена всписок ведет себя нормально и остается непрозрачным, когда камера игрока указывает на него, но если эта же стена будет первой в списке, она будет прозрачной.

Включение глубинного буфера сцены не помогло, насколько я понимаю,для перекрывающихся фигур, что не в моем случае.Может быть, я что-то упустил.Любая помощь будет высоко ценится.

Иллюстрация проблемы:

enter image description here

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

...