javafximportmodel3dsjavafx-3d

Javafx imported 3d model incorrectly displayed


I am playing around with the 3d model importers from interactivemesh.org in Javafx. The import of the models in a scene works without error. However, the models are being displayed in a weird way. Some of the faces that are behind other faces are being displayed even though they should be covered by the front faces. I have tried the tdsImporter, as well as obj and the fxml importer, all encountered the same issue. The models are shown correctly in the model browser, so I guess something is wrong with my code. Here is what the model looks like (tried it on different computers):

The HST Model from interactivemesh.org

enter image description here

Also the source code I use for the 3ds import:

import com.interactivemesh.jfx.importer.tds.TdsModelImporter;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;

public class Test3d extends Application {

    Group group = new Group();

    @Override
    public void start(Stage meineStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("test.fxml"));

        Scene meineScene = new Scene(root, 1280, 800);
        meineStage.setTitle("Startbildschirm");
        meineStage.setScene(meineScene);
        meineStage.show();
        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.getTransforms().addAll(
                new Rotate(0, Rotate.Y_AXIS),
                new Rotate(-45, Rotate.X_AXIS),
                new Rotate(-45, Rotate.Z_AXIS),
                new Translate(0, 0, -110));
        meineScene.setCamera(camera);
        camera.setNearClip(0.1);
        camera.setFarClip(200);

        TdsModelImporter tdsImporter = new TdsModelImporter();
        tdsImporter.read("hst.3ds");
        Node[] tdsMesh = (Node[]) tdsImporter.getImport();
       tdsImporter.close();

        for (int i = 0; i < tdsMesh.length; i++) {
          tdsMesh[i].setScaleX(0.1);
          tdsMesh[i].setScaleY(0.1);
          tdsMesh[i].setScaleZ(0.1);
          tdsMesh[i].getTransforms().setAll(new Rotate(60, Rotate.Y_AXIS), new Rotate(-90, Rotate.X_AXIS));
        }

        Group root1 = new Group(tdsMesh);
        meineScene.setRoot(root1);
    }   

    public static void main(String[] args) {
        launch(args); 
        }
    }

Does anybody have an idea what the problem could be and how to fix it?


Solution

  • According to the Scene javadoc:

    An application may request depth buffer support or scene anti-aliasing support at the creation of a Scene. [...] A scene containing 3D shapes or 2D shapes with 3D transforms may use depth buffer support for proper depth sorted rendering; [...] A scene with 3D shapes may enable scene anti-aliasing to improve its rendering quality.

    The depthBuffer and antiAliasing flags are conditional features. With the respective default values of: false and SceneAntialiasing.DISABLED.

    So in your code, try:

    Scene meineScene = new Scene(root, 1280, 800, true);
        
    

    or even better:

    Scene meineScene = new Scene(root, 1280, 800, true, SceneAntialiasing.BALANCED);