﻿{"id":1338,"date":"2013-10-05T20:42:02","date_gmt":"2013-10-05T11:42:02","guid":{"rendered":"http:\/\/yucchi.jp\/blog\/?p=1338"},"modified":"2013-10-05T20:43:04","modified_gmt":"2013-10-05T11:43:04","slug":"%e5%88%9d%e3%82%81%e3%81%a6%e3%81%ae-javafx-3d-%e3%81%9d%e3%81%ae%ef%bc%92","status":"publish","type":"post","link":"http:\/\/yucchi.jp\/blog\/?p=1338","title":{"rendered":"\u521d\u3081\u3066\u306e JavaFX 3D \u305d\u306e\uff12"},"content":{"rendered":"<p>JavaFX \u306e 3D API \u3068\u622f\u308c\u3066\u307f\u305f\u306e\u3067\u3059\u304c\u3001\u554f\u984c\u767a\u751f\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u3053\u306e\u524d\u3001\u8a66\u3057\u306b\u4f5c\u3063\u305f\u30a2\u30d7\u30ea\u306e\u30ab\u30e1\u30e9\u30a2\u30f3\u30b0\u30eb\u3092\u5909\u66f4\u3057\u305f\u3068\u3053\u308d\u4e0b\u56f3\u306e\u3088\u3046\u306a\u72b6\u614b\u3068\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/1.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"1\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"1\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/1_thumb.png\" width=\"832\" height=\"772\"><\/a><\/p>\n<p>\u3053\u308c\u3067\u306f\u30b9\u30e9\u30a4\u30c0\u30fc\u304c\u4e0a\u624b\u304f\u64cd\u4f5c\u3067\u304d\u307e\u305b\u3093\u3002\uff08\u305d\u3053\u304b\uff01\uff1f<\/p>\n<p>\u30ab\u30e1\u30e9\u30a2\u30f3\u30b0\u30eb\u5909\u66f4\u306e\u30b3\u30fc\u30c9\u306f\u4e0b\u8a18\u306e\u3088\u3046\u3067\u9593\u9055\u3044\u306a\u3055\u305d\u3046\u3067\u3059\u3002<\/p>\n<p>cam.getTransforms().add(new Rotate(90, Rotate.Y_AXIS));<\/p>\n<p>\u3055\u3066\u3001\u56f0\u3063\u305f\u3002\u3002\u3002<\/p>\n<p>\u30ab\u30e1\u30e9\u30a2\u30f3\u30b0\u30eb\u5909\u66f4\u306e\u5bfe\u8c61\u3068\u306a\u308b\u7269\u3092\u9650\u5b9a\u3057\u305f\u3044\u5834\u5408\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u306e\u3060\u308d\u3046\u304b\uff1f<\/p>\n<p>\u305d\u3053\u3067 SubScene \u304c\u98af\u723d\u3068\u59ff\u3092\u73fe\u3059\u306e\u3067\u3042\u3063\u305f\uff01<\/p>\n<p>\u3064\u307e\u308a\u3001SubScene \u306b\u5c02\u7528\u30ab\u30e1\u30e9\u3092\u8a2d\u7f6e\u3057\u3066\u3001\u52d5\u3044\u3066\u6b32\u3057\u304f\u306a\u3044\u3082\u306e\u306f\u4eca\u307e\u3067\u306e Scene \u7528\u306e\u30ab\u30e1\u30e9\u3067\u6620\u3059\u3002<\/p>\n<p>\u5b9f\u306b\u8ad6\u7406\u7684\u304b\u3064\u5408\u7406\u7684\u3067\u3059\u306d\u3002(^_^)<\/p>\n<p>\u3067\u3082\u3001FXML \u30a2\u30d7\u30ea\u3068\u3057\u3066\u306f\u3069\u306e\u3088\u3046\u306b\u3059\u308c\u3070\u3044\u3044\u306e\u304b\u89e3\u3089\u306a\u304b\u3063\u305f\u3002<\/p>\n<p>SceneBuilder \u3067\u7c21\u5358\u306b\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308c\u3070\u3044\u3044\u306e\u306b\u306d\u3002<\/p>\n<p>\u3063\u3066\u3053\u3068\u3067\u4e45\u3057\u3076\u308a\u306b\u30b3\u30fc\u30c9\u3067 UI \u3092\u69cb\u7bc9\u3059\u308b\u306f\u3081\u3068\u306a\u3063\u305f\u3002<\/p>\n<p>\u5f93\u3063\u3066\u624b\u629c\u304d\u306e\u3044\u3064\u3082\u3088\u308a\u6c5a\u304f\u3066\u304a\u304b\u3057\u306a\u30b3\u30fc\u30c9\u306b\u306a\u3063\u3066\u3044\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u3002(^_^;)<\/p>\n<p>\u3053\u308c\u3060\u3051\u3060\u3068\u9762\u767d\u304f\u306a\u3044\u3057\u3001\u73fe\u5b9f\u7684\u306b 3D \u30c7\u30fc\u30bf\u306f\u5c02\u7528\u306e\u30bd\u30d5\u30c8\u3067\u4f5c\u6210\u3055\u308c\u305f\u7269\u3092\u4f7f\u3046\u30b1\u30fc\u30b9\u304c\u4e00\u822c\u7684\u3060\u308d\u3046\u3002<\/p>\n<p>\u4eca\u56de\u306f\u3001OBJ \u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u305d\u308c\u3092\u30b0\u30ea\u30b0\u30ea\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u3068\u8a00\u3063\u3066\u3082 \u30b8\u30e0\u3055\u3093\u304c\u30cd\u30c3\u30c8\u4e0a\u3067\u516c\u958b\u3057\u3066\u3044\u305f\u30b5\u30f3\u30d7\u30eb\u3092\u53c2\u8003\u306b\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3057\u305f\u3002<\/p>\n<p>Thank you from the bottom of my heart\uff01<\/p>\n<p>\u307e\u3060 JavaFX \u672c\u4f53\u306b\u305d\u308c\u3089\u3092\u8aad\u307f\u8fbc\u3080\u6a5f\u80fd\u306f\u642d\u8f09\u3055\u308c\u3066\u306a\u3044\u306e\u3067\u65e9\u671f\u304a\u8a66\u3057\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>Java One \u3067\u3082\u3053\u308c\u306b\u3064\u3044\u3066\u306f\u5b9f\u88c5\u4e88\u5b9a\u3067\u3042\u308b\u3068\u8a00\u53ca\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u306e\u3067\u826f\u3044\u5b50\u306e\u307f\u3093\u306a\u306f\u304a\u3068\u306a\u3057\u304f\u5f85\u3061\u307e\u3057\u3087\u3046\u306d\u2661<\/p>\n<p>\u56f0\u3063\u305f\u3061\u3083\u3093\u306e\u79c1\u306f\u7389\u7815\u899a\u609f\u3067\u7a81\u304d\u9032\u307f\u307e\u3059\u3002\uff08\u30f2\u30d2<\/p>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3053\u3093\u306a\u306e\u304c\u3067\u304d\u3061\u3083\u3044\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/2.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"2\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"2\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/2_thumb.jpg\" width=\"644\" height=\"357\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/3.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"3\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"3\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/3_thumb.jpg\" width=\"758\" height=\"772\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/4.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"4\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"4\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/10\/4_thumb.jpg\" width=\"622\" height=\"772\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u3048\u3063\uff1f<\/p>\n<p>\u3088\u304f\u89e3\u3089\u306a\u3044\u3063\u3066\uff1f<\/p>\n<p>\u305d\u3046\u3067\u3057\u3087\u3046\u3002\u305d\u3046\u3067\u3057\u3087\u3046\u3002<\/p>\n<p>\u305d\u3046\u3044\u3046\u3042\u306a\u305f\u306e\u305f\u3081\u306b\u52d5\u753b\u3082\u7528\u610f\u3057\u307e\u3057\u305f\u3002<\/p>\n<p><video controls height=\"486\" width=\"864\"><source type=\"video\/mp4\" src=\"http:\/\/yucchi.jp\/movie\/Try3D\/Try3D.mp4\">\u3042\u306a\u305f\u304c\u3054\u5229\u7528\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u306f\u518d\u751f\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/video><\/p>\n<p>\u52d5\u753b\u307f\u3066\u3082\u611f\u6fc0\u306f\u306a\u304b\u3063\u305f\u3063\u3066\uff1f<\/p>\n<p>\u305f\u3057\u304b\u306b\u305f\u3060\u7d75\u304c\u52d5\u304f\u306b\u3059\u304e\u306a\u3044\u3067\u3059\u304b\u3089\u306d\u3002<\/p>\n<p>\u3067\u3082\u3053\u306e\u3054\u6642\u4e16 3D \u3092\u306a\u3081\u3066\u3044\u305f\u3089\u3042\u3063\u3068\u3044\u3046\u307e\u306b\u6642\u4ee3\u306e\u6ce2\u306b\u98f2\u307f\u8fbc\u307e\u308c\u3066\u3057\u307e\u3046\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u305d\u308c\u3060\u306f\u8208\u5473\u306e\u3042\u308b\u304b\u305f\u306f\u3053\u306e\u9762\u767d\u304f\u3082\u306a\u304f\u5f79\u306b\u305f\u305f\u306a\u3044\u30a2\u30d7\u30ea\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u307e\u305b\u3002<\/p>\n<p><pre title=\"Try3D.java\">\r\npackage jp.yucchi.try3d;\r\n\r\nimport com.interactivemesh.jfx.importer.ImportException;\r\nimport com.interactivemesh.jfx.importer.obj.ObjModelImporter;\r\nimport java.net.URL;\r\nimport javafx.application.Application;\r\nimport javafx.beans.binding.When;\r\nimport javafx.beans.property.BooleanProperty;\r\nimport javafx.beans.property.DoubleProperty;\r\nimport javafx.beans.property.SimpleBooleanProperty;\r\nimport javafx.beans.property.SimpleDoubleProperty;\r\nimport javafx.event.ActionEvent;\r\nimport javafx.scene.AmbientLight;\r\nimport javafx.scene.Group;\r\nimport javafx.scene.PerspectiveCamera;\r\nimport javafx.scene.PointLight;\r\nimport javafx.scene.Scene;\r\nimport javafx.scene.SubScene;\r\nimport javafx.scene.control.Accordion;\r\nimport javafx.scene.control.Button;\r\nimport javafx.scene.control.CheckBox;\r\nimport javafx.scene.control.Label;\r\nimport javafx.scene.control.Slider;\r\nimport javafx.scene.control.TitledPane;\r\nimport javafx.scene.layout.AnchorPane;\r\nimport javafx.scene.layout.Background;\r\nimport javafx.scene.layout.HBox;\r\nimport javafx.scene.paint.Color;\r\nimport javafx.scene.shape.DrawMode;\r\nimport javafx.scene.shape.MeshView;\r\nimport javafx.scene.transform.Rotate;\r\nimport javafx.stage.Stage;\r\n\r\npublic class Try3D extends Application {\r\n    \r\n    private final DoubleProperty xPos = new SimpleDoubleProperty(0);\r\n    private final DoubleProperty yPos = new SimpleDoubleProperty(0);\r\n    private final DoubleProperty zPos = new SimpleDoubleProperty(0);\r\n    private final DoubleProperty sxPos = new SimpleDoubleProperty(1.0);\r\n    private final DoubleProperty syPos = new SimpleDoubleProperty(1.0);\r\n    private final DoubleProperty szPos = new SimpleDoubleProperty(1.0);\r\n    private final DoubleProperty rxPos = new SimpleDoubleProperty(0);\r\n    private final DoubleProperty ryPos = new SimpleDoubleProperty(0);\r\n    private final DoubleProperty rzPos = new SimpleDoubleProperty(0);\r\n    private final BooleanProperty showWireframe = new SimpleBooleanProperty(false);\r\n    private double anchorAngleX = 0;\r\n    private double anchorAngleY = 0;\r\n    private final DoubleProperty angleX = new SimpleDoubleProperty(0);\r\n    private final DoubleProperty angleY = new SimpleDoubleProperty(0);\r\n    private double anchorX;\r\n    private double anchorY;\r\n    private MeshView[] objMesh;\r\n    \r\n    @Override\r\n    public void start(Stage primaryStage) {\r\n        Group root = new Group();\r\n        Label translateLabel = new Label(\"Translate\");\r\n        Label xLabel = new Label(\"X\");\r\n        Label yLabel = new Label(\"Y\");\r\n        Label zLabel = new Label(\"Z\");\r\n        Label scaleLabel = new Label(\"Scale      \");\r\n        Label sxLabel = new Label(\"X\");\r\n        Label syLabel = new Label(\"Y\");\r\n        Label szLabel = new Label(\"Z\");\r\n        Label rotateLabel = new Label(\"Rotate    \");\r\n        Label rxLabel = new Label(\"X\");\r\n        Label ryLabel = new Label(\"Y\");\r\n        Label rzLabel = new Label(\"Z\");\r\n        Label drawModeLabel = new Label(\"Wireframe\");\r\n        Label resetLabel = new Label(\"        Reset\");\r\n        Slider xSlider = new Slider(-3000, 3000, 0);\r\n        Slider ySlider = new Slider(-3000, 3000, 0);\r\n        Slider zSlider = new Slider(-5000, 5000, 0);\r\n        Slider sxSlider = new Slider(0.01, 10, 1.0);\r\n        Slider sySlider = new Slider(0.01, 10, 1.0);\r\n        Slider szSlider = new Slider(0.01, 10, 1.0);\r\n        Slider rxSlider = new Slider(-360, 360, 0);\r\n        Slider rySlider = new Slider(-360, 360, 0);\r\n        Slider rzSlider = new Slider(-360, 360, 0);\r\n        xSlider.setPrefSize(533, 0);\r\n        ySlider.setPrefSize(533, 0);\r\n        zSlider.setPrefSize(533, 0);\r\n        sxSlider.setPrefSize(533, 0);\r\n        sySlider.setPrefSize(533, 0);\r\n        szSlider.setPrefSize(533, 0);\r\n        rxSlider.setPrefSize(533, 0);\r\n        rySlider.setPrefSize(533, 0);\r\n        rzSlider.setPrefSize(533, 0);\r\n        xSlider.setShowTickLabels(true);\r\n        xSlider.setMajorTickUnit(500);\r\n        ySlider.setShowTickLabels(true);\r\n        ySlider.setMajorTickUnit(500);\r\n        zSlider.setShowTickLabels(true);\r\n        zSlider.setMajorTickUnit(500);\r\n        sxSlider.setShowTickLabels(true);\r\n        sxSlider.setMajorTickUnit(2.0);\r\n        sySlider.setShowTickLabels(true);\r\n        sySlider.setMajorTickUnit(2.0);\r\n        szSlider.setShowTickLabels(true);\r\n        szSlider.setMajorTickUnit(2.0);\r\n        rxSlider.setShowTickLabels(true);\r\n        rxSlider.setMajorTickUnit(90);\r\n        rySlider.setShowTickLabels(true);\r\n        rySlider.setMajorTickUnit(90);\r\n        rzSlider.setShowTickLabels(true);\r\n        rzSlider.setMajorTickUnit(90);\r\n        \r\n        CheckBox meshCheckBox = new CheckBox(\"Wireframe\");\r\n        \r\n        Button btn = new Button();\r\n        btn.setText(\"Reset\");\r\n        \r\n        final Accordion accordion = new Accordion();\r\n        final TitledPane translatePane = new TitledPane(\"Camera Translate\", new HBox(30, translateLabel, xLabel, xSlider, yLabel, ySlider, zLabel, zSlider));\r\n        final TitledPane scalePane = new TitledPane(\"Camera Scale\", new HBox(30, scaleLabel, sxLabel, sxSlider, syLabel, sySlider, szLabel, szSlider));\r\n        final TitledPane rotatePane = new TitledPane(\"Camera Rotate\", new HBox(30, rotateLabel, rxLabel, rxSlider, ryLabel, rySlider, rzLabel, rzSlider));\r\n        final TitledPane drawModePane = new TitledPane(\"DrawMode & Reset\", new HBox(20, drawModeLabel, meshCheckBox, resetLabel, btn));\r\n       \r\n        translatePane.setAnimated(true);\r\n        scalePane.setAnimated(true);\r\n        rotatePane.setAnimated(true);\r\n        drawModePane.setAnimated(true);\r\n        \r\n        accordion.getPanes().addAll(translatePane, scalePane, rotatePane, drawModePane);\r\n        accordion.setExpandedPane(translatePane);\r\n        \r\n        root.getChildren().add(accordion);\r\n        \r\n        accordion.setLayoutX(17);\r\n        accordion.setLayoutY(873);\r\n        \r\n        Scene scene = new Scene(root, 1910, 1020, true);\r\n        scene.setFill(Color.PINK);\r\n        \r\n        PerspectiveCamera cam = new PerspectiveCamera(false);\r\n        scene.setCamera(cam);\r\n        \r\n        root.getChildren().add(cam);\r\n\r\n        \r\n        \r\n        \/\/ Create SubScene        \r\n        PerspectiveCamera subCam = new PerspectiveCamera(false);\r\n        \r\n        AnchorPane subRoot = new AnchorPane();\r\n        subRoot.setBackground(Background.EMPTY);\r\n        \r\n        ObjModelImporter objImporter = new ObjModelImporter();\r\n        \r\n        try {\r\n            URL objUrl = this.getClass().getResource(\"bunny\/b.obj\");\r\n            objImporter.read(objUrl);\r\n        } catch (ImportException e) {\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n        \r\n        MeshView[] objMesh = objImporter.getImport();\r\n        \r\n        objImporter.close();\r\n        \r\n        Group objGroup = new Group();\r\n        \r\n        for (int i = 0; i < objMesh.length; i++) {\r\n            objGroup.getChildren().addAll(objMesh[i]);\r\n            objMesh[i].drawModeProperty().bind(new When(showWireframe).then(DrawMode.LINE).otherwise(DrawMode.FILL));\r\n        }\r\n        \r\n        objGroup.setLayoutX(960);\r\n        objGroup.setLayoutY(430);\r\n        \r\n        AmbientLight ambient = new AmbientLight();\r\n        ambient.setColor(Color.rgb(255, 255, 255, 0.6));\r\n\r\n        PointLight point = new PointLight();\r\n        point.setColor(Color.rgb(255, 255, 255, 1.0));\r\n        point.setLayoutX(400);\r\n        point.setLayoutY(100);\r\n        point.setTranslateZ(-1200);\r\n        point.getScope().add(objGroup);\r\n        \r\n        subRoot.getChildren().addAll(objGroup, subCam, ambient, point);\r\n        \r\n        SubScene subScene = new SubScene(subRoot, 1920, 860, true, true);\r\n        subScene.setFill(Color.BLACK);\r\n        subScene.setCamera(subCam);\r\n        \r\n        root.getChildren().addAll(subScene);\r\n        \r\n        Rotate xRotate;\r\n        Rotate yRotate;\r\n        objGroup.getTransforms().setAll(\r\n                xRotate = new Rotate(0, Rotate.X_AXIS),\r\n                yRotate = new Rotate(0, Rotate.Y_AXIS)\r\n        );\r\n        xRotate.angleProperty().bind(angleX);\r\n        yRotate.angleProperty().bind(angleY);\r\n        \r\n        subScene.setOnMousePressed(event -> {\r\n            anchorX = event.getSceneX();\r\n            anchorY = event.getSceneY();\r\n            anchorAngleX = angleX.get();\r\n            anchorAngleY = angleY.get();\r\n        });\r\n        \r\n        subScene.setOnMouseDragged(event -> {\r\n            angleX.set(anchorAngleX - (anchorY - event.getSceneY()));\r\n            angleY.set(anchorAngleY + anchorX - event.getSceneX());\r\n        });\r\n        \r\n        xSlider.valueProperty().bindBidirectional(xPos);\r\n        subCam.translateXProperty().bind(xPos);\r\n        ySlider.valueProperty().bindBidirectional(yPos);\r\n        subCam.translateYProperty().bind(yPos);\r\n        zSlider.valueProperty().bindBidirectional(zPos);\r\n        subCam.translateZProperty().bind(zPos);\r\n        \r\n        sxSlider.valueProperty().bindBidirectional(sxPos);\r\n        subCam.scaleXProperty().bind(sxPos);\r\n        sySlider.valueProperty().bindBidirectional(syPos);\r\n        subCam.scaleYProperty().bind(syPos);\r\n        szSlider.valueProperty().bindBidirectional(szPos);\r\n        subCam.scaleZProperty().bind(szPos);\r\n        \r\n        Rotate rxRotate;\r\n        Rotate ryRotate;\r\n        Rotate rzRotate;\r\n        subCam.getTransforms().setAll(\r\n                rxRotate = new Rotate(0, Rotate.X_AXIS),\r\n                ryRotate = new Rotate(0, Rotate.Y_AXIS),\r\n                rzRotate = new Rotate(0, Rotate.Z_AXIS)\r\n        );\r\n        \r\n        rxRotate.angleProperty().bind(rxPos);\r\n        ryRotate.angleProperty().bind(ryPos);\r\n        rzRotate.angleProperty().bind(rzPos);\r\n        rxSlider.valueProperty().bindBidirectional(rxPos);\r\n        rySlider.valueProperty().bindBidirectional(ryPos);\r\n        rzSlider.valueProperty().bindBidirectional(rzPos);\r\n        \r\n        meshCheckBox.selectedProperty().bindBidirectional(showWireframe);\r\n        \r\n        btn.setOnAction((ActionEvent event) -> {\r\n            objGroup.setLayoutX(960);\r\n            objGroup.setLayoutY(430);\r\n            anchorAngleX = 0;\r\n            anchorAngleY = 0;\r\n            angleX.set(0);\r\n            angleY.set(0);\r\n            xSlider.setValue(0);\r\n            ySlider.setValue(0);\r\n            zSlider.setValue(0);\r\n            sxSlider.setValue(1.0);\r\n            sySlider.setValue(1.0);\r\n            szSlider.setValue(1.0);\r\n            rxSlider.setValue(0);\r\n            rySlider.setValue(0);\r\n            rzSlider.setValue(0);\r\n        });\r\n        \r\n        primaryStage.setTitle(\"\u306f\u3058\u3081\u3066\u306e JavaFX 3D\");\r\n        primaryStage.setScene(scene);\r\n        primaryStage.setResizable(false);\r\n        primaryStage.show();\r\n    }\r\n    \r\n    public static void main(String[] args) {\r\n        launch(args);\r\n    }\r\n    \r\n}\r\n\r\n<\/pre>\n<\/p>\n<p>\u6700\u5f8c\u306b Java 8 \u5b9f\u884c\u74b0\u5883\u3092\u304a\u6301\u3061\u306e\u52c7\u8005\u69d8\u306b\u306f Java Web Start \u3092\u3054\u7528\u610f\u3055\u305b\u3066\u3044\u305f\u3060\u3044\u3066\u304a\u308a\u307e\u3059\u3002<\/p>\n<p><font size=\"5\"><b>Webstart:<\/b> <\/font><a href=\"http:\/\/yucchi.jp\/java\/java_web_start\/Try3D\/Try3D.jnlp\"><font size=\"5\">click to launch this app as webstart<\/font><\/a><font size=\"5\"> \uff08Java 8 \u5b9f\u884c\u74b0\u5883\u5fc5\u9808\uff09<\/font><\/p>\n<p>\u3061\u306a\u307f\u306b\u3053\u306e\u7d20\u6575\u306a 3D \u30c7\u30fc\u30bf\u306f <a href=\"http:\/\/www003.upp.so-net.ne.jp\/kakomiki\/\">SaYaKaProject<\/a> \u69d8\u306e\u3082\u306e\u3092\u4f7f\u7528\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3057\u305f\u3002<\/p>\n<p>\u3053\u306e\u3088\u3046\u306b\u5275\u9020\u6027\u8c4a\u304b\u306a\u4f5c\u8005\u69d8\u306b\u306f\u672c\u5f53\u306b\u5c0a\u656c\u3057\u307e\u3059\u3002<\/p>\n<p>\u79c1\u306f\u4ee5\u524d Shade \u3092\u8cfc\u5165\u3057\u3066\u308f\u305a\u304b3\u30f6\u6708\u3067\u632b\u6298\u3057\u305f\u7d4c\u9a13\u3092\u3082\u3063\u3066\u307e\u3059\u3002(&gt;_&lt;\uff61)<\/p>\n<p>\u305d\u308c\u3060\u306f\u307e\u305f\u306d\uff5e\u266a<\/p>\n<div id=\"scid:0767317B-992E-4b12-91E0-4F059A8CECA8:21ed4788-fada-4ac4-a702-2812ba713382\" class=\"wlWriterEditableSmartContent\" style=\"float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px\">Hatena \u30bf\u30b0: <a href=\"http:\/\/b.hatena.ne.jp\/t\/JavaFX\" rel=\"tag\">JavaFX<\/a><\/div>\n<div class='wp_social_bookmarking_light'>\n            <div class=\"wsbl_hatena\"><a href='\/\/b.hatena.ne.jp\/add?mode=confirm&url=http%3A%2F%2Fyucchi.jp%2Fblog%2F%3Fp%3D1338&title=%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%20JavaFX%203D%20%E3%81%9D%E3%81%AE%EF%BC%92' title='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='http:\/\/yucchi.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/hatena.gif' alt='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' title='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' width='16' height='12' class='wp_social_bookmarking_light_img' \/><\/a><\/div>\n            <div class=\"wsbl_facebook\"><a href='http:\/\/www.facebook.com\/share.php?u=http%3A%2F%2Fyucchi.jp%2Fblog%2F%3Fp%3D1338&t=%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%20JavaFX%203D%20%E3%81%9D%E3%81%AE%EF%BC%92' title='Facebook \u306b\u30b7\u30a7\u30a2' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='http:\/\/yucchi.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/facebook.png' alt='Facebook \u306b\u30b7\u30a7\u30a2' title='Facebook \u306b\u30b7\u30a7\u30a2' width='16' height='16' class='wp_social_bookmarking_light_img' \/><\/a><\/div>\n            <div class=\"wsbl_google_plus_one\"><g:plusone size=\"medium\" annotation=\"none\" href=\"http:\/\/yucchi.jp\/blog\/?p=1338\" ><\/g:plusone><\/div>\n            <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"http:\/\/yucchi.jp\/blog\/?p=1338\" data-text=\"\u521d\u3081\u3066\u306e JavaFX 3D \u305d\u306e\uff12\" data-lang=\"ja\">Tweet<\/a><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>JavaFX \u306e 3D API \u3068\u622f\u308c\u3066\u307f\u305f\u306e\u3067\u3059\u304c\u3001\u554f\u984c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u3053\u306e\u524d\u3001\u8a66\u3057\u306b\u4f5c\u3063\u305f\u30a2\u30d7\u30ea\u306e\u30ab\u30e1\u30e9\u30a2\u30f3\u30b0\u30eb\u3092\u5909\u66f4\u3057\u305f\u3068\u3053\u308d\u4e0b\u56f3\u306e\u3088\u3046\u306a\u72b6\u614b\u3068\u306a\u308a\u307e\u3057\u305f\u3002 \u3053\u308c\u3067\u306f\u30b9\u30e9\u30a4\u30c0\u30fc\u304c\u4e0a\u624b\u304f\u64cd\u4f5c\u3067\u304d\u307e\u305b\u3093\u3002\uff08\u305d\u3053\u304b\uff01\uff1f \u30ab\u30e1\u30e9\u30a2\u30f3\u30b0\u30eb\u5909\u66f4\u306e\u30b3\u30fc\u30c9\u306f\u4e0b\u8a18\u306e\u3088\u3046\u3067\u9593\u9055\u3044\u306a\u3055\u305d\u3046\u3067\u3059\u3002 cam.getTransforms().add(new Rotate(90, Rotate.Y_AXIS)); \u3055\u3066\u3001\u56f0\u3063\u305f\u3002\u3002\u3002 \u30ab\u30e1\u30e9\u30a2\u30f3\u30b0\u30eb\u5909\u66f4\u306e\u5bfe\u8c61\u3068\u306a\u308b\u7269\u3092\u9650\u5b9a\u3057\u305f\u3044\u5834\u5408\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u306e\u3060\u308d\u3046\u304b\uff1f \u305d\u3053\u3067 SubScene \u304c\u98af\u723d\u3068\u59ff\u3092\u73fe\u3059\u306e\u3067\u3042\u3063\u305f\uff01 \u3064\u307e\u308a\u3001SubScene \u306b\u5c02\u7528\u30ab\u30e1\u30e9\u3092\u8a2d\u7f6e\u3057\u3066\u3001\u52d5\u3044\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[21],"class_list":["post-1338","post","type-post","status-publish","format-standard","hentry","category-javafx","tag-javafx"],"_links":{"self":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1338"}],"version-history":[{"count":1,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1338\/revisions"}],"predecessor-version":[{"id":1340,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1338\/revisions\/1340"}],"wp:attachment":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1338"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}