JFX8 Mixed 2D and 3D, Scene Subscene incorrect drawing 3ds-file

Morvling

Mitglied
Hallo liebe Java-forumler 😀

Ich bin kein wirklicher pro in Java aber ich habe leider folgendes Problem:

Ich benutze Java8 - JavaFX8 und den Interactive-Mesh Modelimporter um nen 3Ds-viewer zu schreiben. Wenn ich das 3ds-Modell ohne eine Subscene importiere klappt es super, aber sobald ich eine SubScene mit einbaue, stellt er das 3ds-Modell nichtmehr richtig dar ... Die beiden folgenden Links enthalten Bilder der fehlerfreien und der fehlerhaften darstellung ...

http://s3.postimg.org/nsef8o1f3/without_Subscene.png

http://s3.postimg.org/y16wehpgv/with_Subscene.png

Das hier ist der Code mit SubScene:

Code:
import com.interactivemesh.jfx.importer.ImportException;
import com.interactivemesh.jfx.importer.tds.TdsModelImporter;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Camera;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SubScene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;



public class JavaFX7 extends Application {

HBox hBoxControls;
Group model3D;
double y_Axis;
double x_Axis;
double rotate;
public Rotate cameraXRotate;
public Rotate cameraYRotate;
public Translate cameraPosition2;

Camera camera;



public void controls() { 
    ...
            ...
}

public void model () {

    //
    // importing 3ds Modell
    // 

    TdsModelImporter myModel = new TdsModelImporter();
        try {
            String path = "C:/Users/Corvin/Downloads/DUC916_L.3DS/DUC916_L.3DS";
            myModel.read(path);
        }
        catch (ImportException e)
        {
            System.out.println("Error importing 3ds model: "+e.getMessage());
            return;
        }

    final Node[] myMesh = myModel.getImport();
    myModel.close();
    model3D = new Group(myMesh);        

}

public static void main(String[] args) {

    launch();
}

@Override
public void start(Stage stage) throws Exception {

    y_Axis = 0.0;
    controls();
    model();

    Camera camera = new PerspectiveCamera();

     //-------------------
    cameraXRotate = new Rotate(-5,Rotate.X_AXIS);
    cameraYRotate = new Rotate(-50,Rotate.Y_AXIS);
    cameraPosition2 = new Translate(0,-1900,-14000);    

    camera.getTransforms().add(cameraXRotate);
    camera.getTransforms().add(cameraYRotate);
    camera.getTransforms().add(cameraPosition2);
     //-------------------

    Pane sub = new Pane();
    AnchorPane root = new AnchorPane();     

    AnchorPane.setRightAnchor(hBoxControls, 10.0);
    AnchorPane.setBottomAnchor(hBoxControls, 10.0);
    root.getChildren().add(hBoxControls);

    // ---------------------------------------
    Scene scene = new Scene(root, 800, 600, true);  
    SubScene subScene = new SubScene (sub, 800, 600);

    subScene.setCamera(camera);

    sub.getChildren().add(model3D);

    root.getChildren().add(subScene);

    stage.setScene(scene);
    stage.show();

}

}


Schonmal vielen dank für jeden der sich das hier anguckt und sich vielleicht die Mühe macht mir zu helfen. Würde mich über jegliche Idee freuen, ich komme nämlich wirklich Null weiter ... ;(

mfg

Morvling
 
Hallo Morvling,

ich habe ein ähnliches Problem wie du.

Ich importiere 3ds Models, aber die Models werden immer viel zu klein oder gar nicht angezeigt. Oder erst wenn ich eine Translation mache.
Weisst du wie ich die Werte für die Translation berechnen kann?
Ich mein diese Zeile:
Code:
cameraPosition2 = new Translate(0,-1900,-14000);
 
Lustig: Ich musste neulich beim Testen unseres JavaFX-basierten Applets (bitte kein Kommentar dazu) feststellen, dass es unter JFX8 auch nicht mehr gleich aussah. Ich glaube das irgendetwas an den Layouts gemacht wurde (was die Darstellung auch nahelegen würde). Bei mir war es vor allem das BorderPane. Zum Glück ist das AppletLayout ziemlich fix, da war eine Fallabhägige (Javaabhängige) Anpassung recht leicht eingebaut.

#edit: Auch bei mir musste ein wenig (mehr) mit translate herumgespielt werden.
 
Zuletzt bearbeitet:
Heryho, habe ganz vergessen hier nochmal reinzugucken ...

Hab leider gerade meinen Code auch nicht zur hand, aber der Fehler bei mir war, dass ich den Falschen Konstruktor der SubScene genommen habe, da gibts einen mit Antialiasing ... "new SubScene(arg0,arg1,arg2,boolean,Antialiasing)" iwie so, und da dann "SceneAntiAliasing.BALANCED" oder sowas. Blöder fehler aber naja ...

Und was die Translates angeht habe ich leider noch keine "gute" Lösung gefunden ... Ich habe eigendlich das Gefühl, dass da im Importer irgendwas schief geht, bzw. im Export aus z.B 3dsMax oder so ...
 
Von interactiveMesh gibt es ja auch den ModelBrowserJFX. Wenn ich damit meine Models öffne sehen sie wunderbar aus. Der ModelBrowserJFX baut auf der gleichen API auf, TdsModelImporter etc.. (oder täusche ich mich hier?) von daher glaube ich das der Fehler nicht bei den Models liegt sondern darin wie ich die API verwende.
Ich habe deswegen an interactiveMesh eine E-Mail geschrieben, mal sehen ob was zurückkommt.

@Morvling: ich nehme an du hast die Translates dann auch durch try and error herausbekommen?
 
Zuletzt bearbeitet:
Der Kerl von Interactivemesh ist sehr freundlich, habe dem auch schonmal ne mail geschrieben, es hat etwas gedauert aber hat geantwortet.

japp, Try and Error ... aber eigendlich ziemlicher Mist, das auf diesem Weg zu machen ...
 
InteractiveMesh hat mir geantwortet. Ich denke es ist in seinem Sinne wenn ich die Antwort hier poste, weil er möchte ja das man seine API verwendet:

damit die PerspectiveCamera die importierte Szene wunschgemäß darstellt, ist
entweder die Kamera oder die Szene zu transformieren. Typischerweise wird die
Kamera bewegt, muss aber nicht.

Um die Ausdehnung und das Zentrum der Szene zu erhalten, holt man sich von
der javafx.scene.Group, die die Szene beinhaltet, das javafx.geometry.Bounds
Objekt mit 'getBoundsInLocal()'.

Dieses Bounds Objekt liefert alle Daten, um ein javafx.scene.transform.Translate
Objekt zu erzeugen, das die Kamera oder die Szene positioniert.

Die Klasse FXTuxCubeSubScene des Beispiels FXTuxCube gibt weiter Anhaltspunkte,
siehe FXTuxCube : JavaFX 3D sample.

Vielleicht ist auch das Tutorial 'Getting Started with JavaFX 3D Graphics'
hilfreich:
Part I: Getting Started with JavaFX 3D Graphics (Release 8)
 

Zurück
Oben