Javafx导入的3d模型显示不正确

时间:2017-10-28 15:31:52

标签: javafx import model 3ds javafx-3d

我正在Javafx的interactivemesh.org中使用3d模型导入器。在场景中导入模型可以正常工作。但是,模型以奇怪的方式显示。正在显示其他面后面的一些面,即使它们应该被正面覆盖。我已经尝试过tdsImporter,以及obj和fxml导入器,都遇到了同样的问题。模型在模型浏览器中正确显示,所以我猜我的代码有问题。这是模型的样子(在不同的计算机上试过):

interactivemesh.org的HST模型

enter image description here

我用于3ds导入的源代码:

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

是否有人知道问题可能是什么以及如何解决?

1 个答案:

答案 0 :(得分:2)

根据Scene javadoc:

  

应用程序可以在创建场景时请求深度缓冲支持或场景抗锯齿支持。 [...]包含具有3D变换的3D形状或2D形状的场景可以使用深度缓冲支持来进行适当的深度排序渲染; [...]具有3D形状的场景可以启用场景抗锯齿以提高其渲染质量。

     

depthBuffer和antiAliasing标志是条件特征。使用相应的默认值:false和SceneAntialiasing.DISABLED。

因此,在您的代码中,请尝试:

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

甚至更好:

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