2013-10-06 7 views
5

जावाएफएक्स 8 में नई सुविधाओं के कारण, 3 डी यूआई नियंत्रणों के साथ 3 डी ऑब्जेक्ट्स को गठबंधन करना संभव हो गया।जावाएफएक्स 3 डी - यूआई नियंत्रण के साथ 3 डी ऑब्जेक्ट और सबसेन के साथ समूह के लिए अलग-अलग कैमरे कैसे सेट करें?

मैंने मैनुअल के रूप में इस दस्तावेज़ का उपयोग किया: JavaFX Tutorial, Exploring JavaFX 3D

तो, मैं इस कोड को बनाया:

public class CastAnalytics extends Application { 

    final Group root = new Group(); 
    final Group axisGroup = new Group(); 
    final XForm world = new XForm(); 
    final PerspectiveCamera camera = new PerspectiveCamera(true); 
    final PerspectiveCamera subSceneCamera = new PerspectiveCamera(false); 
    final XForm cameraXForm = new XForm(); 
    final XForm cameraXForm2 = new XForm(); 
    final XForm cameraXForm3 = new XForm(); 
    final double cameraDistance = 450; 
    final XForm moleculeGroup = new XForm(); 
    private Timeline timeline; 
    boolean timelinePlaying = false; 
    double CONTROL_MULTIPLIER = 0.1; 
    double SHIFT_MULTIPLIER = 0.1; 
    double ALT_MULTIPLIER = 0.5; 
    double mousePosX; 
    double mousePosY; 
    double mouseOldX; 
    double mouseOldY; 
    double mouseDeltaX; 
    double mouseDeltaY; 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     buildScene(); 
     buildCamera(); 
     buildAxes(); 

     Scene scene = new Scene(root, 1024, 768, true); 
     scene.setFill(Color.GREY); 
     handleKeyboard(scene, world); 
     handleMouse(scene, world); 

     primaryStage.setTitle("Sample Application"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 


     scene.setCamera(subSceneCamera); 
     scene.setCamera(camera); 
    } 

    private void buildScene() { 
     root.getChildren().add(world); 

     Label label = new Label("123"); 
     HBox hBox = new HBox(); 
     hBox.getChildren().add(label); 
     SubScene subScene = new SubScene(hBox, 200, 200); 
     subScene.setLayoutX(100); 
     subScene.setLayoutY(100); 

     root.getChildren().addAll(subScene); 
    } 

    private void buildCamera() { 
     root.getChildren().addAll(cameraXForm); 
     cameraXForm.getChildren().add(cameraXForm2); 
     cameraXForm2.getChildren().add(cameraXForm3); 
     cameraXForm3.getChildren().add(camera); 
     cameraXForm3.setRotateZ(180.0); 

     camera.setNearClip(0.1); 
     camera.setFarClip(10000.0); 
     camera.setTranslateZ(-cameraDistance); 
     cameraXForm.ry.setAngle(320.0); 
     cameraXForm.rx.setAngle(40); 
    } 

    private void buildAxes() { 
     Box box = new Box(200,200,200); 


     axisGroup.getChildren().addAll(box); 
     world.getChildren().addAll(axisGroup); 
    } 

    private void handleMouse(Scene scene, final Node root) { 
     scene.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override public void handle(MouseEvent me) { 
       mousePosX = me.getSceneX(); 
       mousePosY = me.getSceneY(); 
       mouseOldX = me.getSceneX(); 
       mouseOldY = me.getSceneY(); 
      } 
     }); 
     scene.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent me) { 
       mouseOldX = mousePosX; 
       mouseOldY = mousePosY; 
       mousePosX = me.getSceneX(); 
       mousePosY = me.getSceneY(); 
       mouseDeltaX = (mousePosX - mouseOldX); 
       mouseDeltaY = (mousePosY - mouseOldY); 

       double modifier = 1.0; 
       double modifierFactor = 0.1; 

       if (me.isControlDown()) { 
        modifier = 0.1; 
       } 
       if (me.isShiftDown()) { 
        modifier = 10.0; 
       } 
       if (me.isPrimaryButtonDown()) { 
        cameraXForm.ry.setAngle(cameraXForm.ry.getAngle() - mouseDeltaX * modifierFactor * modifier * 2.0); // + 
        cameraXForm.rx.setAngle(cameraXForm.rx.getAngle() + mouseDeltaY * modifierFactor * modifier * 2.0); // - 
       } else if (me.isSecondaryButtonDown()) { 
        double z = camera.getTranslateZ(); 
        double newZ = z + mouseDeltaX * modifierFactor * modifier; 
        camera.setTranslateZ(newZ); 
       } else if (me.isMiddleButtonDown()) { 
        cameraXForm2.t.setX(cameraXForm2.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3); // - 
        cameraXForm2.t.setY(cameraXForm2.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // - 
       } 
      } 
     }); 
    } 

    private void handleKeyboard(Scene scene, final Node root) { 
     final boolean moveCamera = true; 
     scene.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent event) { 
       Duration currentTime; 
       switch (event.getCode()) { 
        case Z: 
         if (event.isShiftDown()) { 
          cameraXForm.ry.setAngle(0.0); 
          cameraXForm.rx.setAngle(0.0); 
          camera.setTranslateZ(-300.0); 
         } 
         cameraXForm2.t.setX(0.0); 
         cameraXForm2.t.setY(0.0); 
         break; 
        case X: 
         if (event.isControlDown()) { 
          if (axisGroup.isVisible()) { 
           axisGroup.setVisible(false); 
          } else { 
           axisGroup.setVisible(true); 
          } 
         } 
         break; 
        case S: 
         if (event.isControlDown()) { 
          if (moleculeGroup.isVisible()) { 
           moleculeGroup.setVisible(false); 
          } else { 
           moleculeGroup.setVisible(true); 
          } 
         } 
         break; 
        case SPACE: 
         if (timelinePlaying) { 
          timeline.pause(); 
          timelinePlaying = false; 
         } else { 
          timeline.play(); 
          timelinePlaying = true; 
         } 
         break; 
        case UP: 
         if (event.isControlDown() && event.isShiftDown()) { 
          cameraXForm2.t.setY(cameraXForm2.t.getY() - 10.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown() && event.isShiftDown()) { 
          cameraXForm.rx.setAngle(cameraXForm.rx.getAngle() - 10.0 * ALT_MULTIPLIER); 
         } else if (event.isControlDown()) { 
          cameraXForm2.t.setY(cameraXForm2.t.getY() - 1.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown()) { 
          cameraXForm.rx.setAngle(cameraXForm.rx.getAngle() - 2.0 * ALT_MULTIPLIER); 
         } else if (event.isShiftDown()) { 
          double z = camera.getTranslateZ(); 
          double newZ = z + 5.0 * SHIFT_MULTIPLIER; 
          camera.setTranslateZ(newZ); 
         } 
         break; 
        case DOWN: 
         if (event.isControlDown() && event.isShiftDown()) { 
          cameraXForm2.t.setY(cameraXForm2.t.getY() + 10.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown() && event.isShiftDown()) { 
          cameraXForm.rx.setAngle(cameraXForm.rx.getAngle() + 10.0 * ALT_MULTIPLIER); 
         } else if (event.isControlDown()) { 
          cameraXForm2.t.setY(cameraXForm2.t.getY() + 1.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown()) { 
          cameraXForm.rx.setAngle(cameraXForm.rx.getAngle() + 2.0 * ALT_MULTIPLIER); 
         } else if (event.isShiftDown()) { 
          double z = camera.getTranslateZ(); 
          double newZ = z - 5.0 * SHIFT_MULTIPLIER; 
          camera.setTranslateZ(newZ); 
         } 
         break; 
        case RIGHT: 
         if (event.isControlDown() && event.isShiftDown()) { 
          cameraXForm2.t.setX(cameraXForm2.t.getX() + 10.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown() && event.isShiftDown()) { 
          cameraXForm.ry.setAngle(cameraXForm.ry.getAngle() - 10.0 * ALT_MULTIPLIER); 
         } else if (event.isControlDown()) { 
          cameraXForm2.t.setX(cameraXForm2.t.getX() + 1.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown()) { 
          cameraXForm.ry.setAngle(cameraXForm.ry.getAngle() - 2.0 * ALT_MULTIPLIER); 
         } 
         break; 
        case LEFT: 
         if (event.isControlDown() && event.isShiftDown()) { 
          cameraXForm2.t.setX(cameraXForm2.t.getX() - 10.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown() && event.isShiftDown()) { 
          cameraXForm.ry.setAngle(cameraXForm.ry.getAngle() + 10.0 * ALT_MULTIPLIER); // - 
         } else if (event.isControlDown()) { 
          cameraXForm2.t.setX(cameraXForm2.t.getX() - 1.0 * CONTROL_MULTIPLIER); 
         } else if (event.isAltDown()) { 
          cameraXForm.ry.setAngle(cameraXForm.ry.getAngle() + 2.0 * ALT_MULTIPLIER); // - 
         } 
         break; 
       } 
      } 
     }); 
    } 



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

लेकिन ते नतीजा यह है कि मैं क्या उम्मीद नहीं है। मैं 3D वस्तु ऊपर यूआई नियंत्रण के लिए Pane है चाहता था, लेकिन मैं क्या मिलता है यह है:

enter image description here

क्या मैं गलत कर रहा हूँ?

उत्तर

0

समस्या यहाँ है:

scene.setCamera(subSceneCamera); 
    scene.setCamera(camera); 

आप दृश्य (या SubScene) में केवल एक कैमरा सेट कर सकते हैं। आपको सबस्किन में दूसरा कैमरा सेट करने की आवश्यकता है। कुछ इस तरह का प्रयास करें:

@Override 
public void start(Stage primaryStage) throws Exception{ 
    ... 
    primaryStage.show(); 
    scene.setCamera(camera); 
} 
private void buildScene() { 
    ... 
    subScene.setLayoutX(100); 
    subScene.setLayoutY(100); 
    subScene.setCamera(subSceneCamera); 
    root.getChildren().addAll(subScene); 
} 
+1

मैं भी इस प्रकार की कोशिश की है। और मैंने अभी कोशिश की है। दुर्भाग्य से, एक ही परिणाम। – Eugene

+0

इनरिएक्टिव मेष FXTuxCube एप्लिकेशन में एक कार्यरत सबस्किन है। मैंने ओरेकल से मोलेकुला नमूना ऐप में पोर्टिंग करने की कोशिश की, लेकिन अब तक कोई सफलता नहीं मिली है। इससे कोई फर्क नहीं पड़ता कि मैंने सबस्किन कैमरे को सही तरीके से घुमाने की कोशिश की, फिर भी यह आपके स्क्रीनशॉट में दिखाई देता है। लेकिन आप यह पता लगाने की कोशिश कर सकते हैं कि अगस्त ने टक्सक्यूब में क्या किया था। उम्मीद है कि इससे थोड़ी मदद मिलेगीं। – ajeh

+2

जो मैं तुक्स क्यूब में समझता हूं, वह दृश्य और सबस्किन दोनों के लिए केवल 1 कैमरा का उपयोग कर रहा है, और कैमरे के बजाए मुख्य दृश्य में परिवर्तन लागू कर रहा है। मुझे लगता है कि ओरेकल ने MoleculeSampleApp को जारी करके जावाएफएक्स 3 डी सीखने वालों के लिए एक बड़ी डि-सेवा की है जो अपने स्वयं के एक्सफॉर्म क्लास में परिवर्तन को छुपाता है। – ajeh

1

मैं क्या (सीमित) परीक्षण मैंने किया है से समझ में से, वहाँ दो विकल्प हैं:

  1. एक उप दृश्य के लिए एक कैमरा सेट और है कि उप जोड़ने रूट के लिए एससीन। आप केवल एक कैमरा का उपयोग करेंगे। आपकी दुनिया को एक अलग समूह होना होगा और विश्व समूह को बदलकर उड़ान/पिवोटिंग कैमरा दृश्य पूरा करना होगा।

  2. जावाएफएक्स जिरा के साथ एक बग रिपोर्ट दर्ज करें।

मैं उप-दृश्य कैमरे के रूप में एक अलग कैमरे का उपयोग करके सफल नहीं था। कैमरे या उप-दृश्य पर लागू कोई भी परिवर्तन कभी भी आपके स्क्रीनशॉट में एक जैसी डिफ़ॉल्ट स्थिति से उप-दृश्य को घुमाता नहीं है। ओरेकल के साथ इस उप-दृश्य दस्तावेज को जारी नहीं करने के साथ, हम केवल तब तक प्रतीक्षा कर सकते हैं जब तक कि वे साफ न हों और अंतराल को भरें। तब तक हम JavaFX 3 डी में सब्सिने समर्थन पर विचार कर सकते हैं।

0

यहाँ समाधान

public class rotate3Dwithpanel extends Application 
{ 
    private double mouseOldX, mouseOldY = 0; 
    private Rotate rotateX = new Rotate(0, Rotate.X_AXIS); 
    private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS); 
    private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS); 

    @Override 
    public void start(Stage stage) throws Exception 
    { 
     final PhongMaterial redMaterial = new PhongMaterial(); 
     redMaterial.setSpecularColor(Color.ORANGE); 
     redMaterial.setDiffuseColor(Color.RED); 

     Box myBox = new Box(100, 100, 100); 
     myBox.setTranslateX(400); 
     myBox.setTranslateY(300); 
     myBox.setTranslateZ(400); 
     myBox.setMaterial(redMaterial); 

     Rectangle rectangle = new Rectangle(); 
     rectangle.setX(200); 
     rectangle.setY(600); 
     rectangle.setWidth(200); 
     rectangle.setHeight(100); 
     rectangle.setFill(Color.GREY); 

     // to Set pivot points 
     rotateX.setPivotX(400); 
     rotateX.setPivotY(300); 
     rotateX.setPivotZ(400); 

     rotateY.setPivotX(400); 
     rotateY.setPivotY(300); 
     rotateY.setPivotZ(400); 

     rotateZ.setPivotX(400); 
     rotateZ.setPivotY(300); 
     rotateZ.setPivotZ(400); 


     // initialize the camera 
     PerspectiveCamera camera = new PerspectiveCamera(false); 
     camera.getTransforms().addAll (rotateX, rotateY, new Translate(0, 0, 0)); 

     Group root = new Group(); 
     Group subRoot = new Group(); 

     root.getChildren().add(rectangle); 

     Scene scene = new Scene(root, 1000, 1000, true); 
     SubScene subScene = new SubScene(subRoot, 800, 800, true, SceneAntialiasing.BALANCED); 

     subScene.setCamera(camera); 
     subRoot.getChildren().add(myBox); 
     root.getChildren().add(subScene); 

     // events for rotation 
     rectangle.setOnMousePressed(event -> { 
      mouseOldX = event.getSceneX(); 
      mouseOldY = event.getSceneY(); 
     }); 

     rectangle.setOnMouseDragged(event -> { 
      if(event.isPrimaryButtonDown()) 
      { 
       rotateX.setAngle(rotateX.getAngle() - (event.getSceneY() - mouseOldY)); 
       rotateY.setAngle(rotateY.getAngle() + (event.getSceneX() - mouseOldX)); 
       mouseOldX = event.getSceneX(); 
       mouseOldY = event.getSceneY(); 
      } 
     }); 

     stage.setTitle("JavaFX 3D Object"); 
     stage.setScene(scene); 
     stage.show(); 
    } 

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

} 
संबंधित मुद्दे