﻿{"id":1327,"date":"2013-09-22T14:29:33","date_gmt":"2013-09-22T05:29:33","guid":{"rendered":"http:\/\/yucchi.jp\/blog\/?p=1327"},"modified":"2013-09-22T14:31:38","modified_gmt":"2013-09-22T05:31:38","slug":"%e3%81%af%e3%81%98%e3%82%81%e3%81%a6%e3%81%ae-javafx-3d","status":"publish","type":"post","link":"http:\/\/yucchi.jp\/blog\/?p=1327","title":{"rendered":"\u306f\u3058\u3081\u3066\u306e JavaFX 3D"},"content":{"rendered":"<p>\u4eca\u56de\u306f\u3061\u3087\u3063\u3068\u80cc\u4f38\u3073\u3092\u3057\u3066\u30013D \u3092\u8a66\u3057\u3066\u307f\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u5148\u65e5\u3001\u30b7\u30ea\u30f3\u30c0\u30fc\u3092\u3061\u3087\u3053\u3063\u3068\u4f5c\u3063\u3066\u307f\u3066\u5272\u3068\u7c21\u5358\u306b\u4f5c\u308c\u308b\u3093\u3060\u3068\u601d\u3044\u8abf\u5b50\u3076\u3063\u3053\u304f\u79c1\u3067\u3059\u3002<\/p>\n<blockquote class=\"twitter-tweet\">\n<p>\u306f\u3058\u3081\u3066JavaFX\u306e3DAPI\u3068\u622f\u308c\u3066\u307f\u305f\u3002\u4f55\u51e6\u304b\u3067\u65e5\u672c\u8a9e\u306e\u8cc7\u6599\u3092\u76ee\u306b\u3057\u305f\u8a18\u61b6\u304c\u3042\u3063\u305f\u304c\u4f55\u51e6\u304b\u89e3\u3089\u306a\u304f\u306a\u3063\u305f\uff08\uff1e\uff1c\uff09\u4e00\u756a\u809d\u5fc3\u306a\u5ea7\u6a19\u304c\u3089\u307f\u304c\u3088\u304f\u89e3\u3089\u306a\u3044\uff08\u30f2\u30d2\uff01\u3068\u308a\u3042\u3048\u305a\u3053\u3093\u306a\u3082\u3093\u3092\u5275\u3063\u3066\u307f\u305f\u3002 <a href=\"http:\/\/t.co\/phyKZzyIGk\">pic.twitter.com\/phyKZzyIGk<\/a><\/p>\n<p>\u2014 Yucchi (@Yucchi_jp) <a href=\"https:\/\/twitter.com\/Yucchi_jp\/statuses\/380286185513308160\">September 18, 2013<\/a><\/p><\/blockquote>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script> <\/p>\n<blockquote class=\"twitter-tweet\">\n<p>Cylinder \u306e\u5f15\u6570\u3092\u4e09\u3064\u4f7f\u3046\u3068\u516d\u89d2\u67f1\u306a\u3069\u306e\u591a\u89d2\u67f1\u3082\u7c21\u5358\u306b\u5275\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3093\u3067\u3059\u306d\uff01\u51c4\u3044\u305e\uff01\u3000JavaFX <a href=\"http:\/\/t.co\/6Csxn9HPtG\">pic.twitter.com\/6Csxn9HPtG<\/a><\/p>\n<p>\u2014 Yucchi (@Yucchi_jp) <a href=\"https:\/\/twitter.com\/Yucchi_jp\/statuses\/380286663542321152\">September 18, 2013<\/a><\/p><\/blockquote>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script> <\/p>\n<p>\u5b9f\u306f Getting Started with JavaFX 3D Graphics \u3068\u8a00\u3046\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u304c\u51fa\u307e\u3057\u305f\u3002<\/p>\n<p>\u3057\u304b\u3057\u3001\u30d0\u30ea\u30d0\u30ea\u306e\u82f1\u8a9e\u306a\u306e\u3067\u826f\u304f\u89e3\u308a\u307e\u305b\u3093\u3002<\/p>\n<p>\u3044\u3064\u3082\u306e\u3053\u3068\u3067\u3059\u304c\u305d\u308c\u306f\u7f6e\u3044\u3068\u3044\u3066\u3001\u3042\u30fc\u3067\u3082\u306a\u3044\u3001\u3053\u30fc\u3067\u3082\u306a\u3044\u3001\u3068 JavaFX 3D API \u3068\u622f\u308c\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u305d\u3046\u3044\u3046\u3053\u3068\u306a\u306e\u3067\u9069\u5f53\u306a\u3053\u3068\u3092\u3044\u3064\u3082\u3068\u540c\u3058\u3088\u3046\u306b\u3057\u3066\u307e\u3059\u3002(^_^;)<\/p>\n<p>\u4eca\u56de\u306f\u4e0b\u306e\u753b\u50cf\u306e\u3088\u3046\u306a\u3082\u306e\u3092\u4f5c\u3063\u3066\u3001\u30b9\u30e9\u30a4\u30c0\u30fc\u3067\u30b0\u30ea\u30b0\u30ea\u52d5\u304b\u305b\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/1.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"1\" style=\"border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px\" border=\"0\" alt=\"1\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/1_thumb.jpg\" width=\"522\" height=\"484\"><\/a><\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/2.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"2\" style=\"border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px\" border=\"0\" alt=\"2\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/2_thumb.jpg\" width=\"524\" height=\"484\"><\/a><\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/3.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"3\" style=\"border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px\" border=\"0\" alt=\"3\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/3_thumb.jpg\" width=\"522\" height=\"484\"><\/a><\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/4.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"4\" style=\"border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px\" border=\"0\" alt=\"4\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/09\/4_thumb.jpg\" width=\"523\" height=\"484\"><\/a><\/p>\n<p>\u307e\u305f\u3001\uff38\u8ef8\u3068\uff39\u8ef8\u3060\u3051\u3067\u3059\u3051\u3069\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u5909\u66f4\u3082\u30b9\u30e9\u30a4\u30c0\u30fc\u3067\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u3064\u3044\u3067\u306b\u30e9\u30a4\u30c8\u3068\u53cd\u5c04\u5149\u3082\u8a2d\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u30ea\u30bb\u30c3\u30c8\u30b9\u30a4\u30c3\u30c1\u3068\u30ab\u30e1\u30e9\u95a2\u4fc2\u3082\u3068\u601d\u3044\u307e\u3057\u305f\u304c\u3081\u3093\u3069\u304f\u3055\u304f\u306a\u3063\u3066\u304d\u305f\u306e\u3067\u6b62\u3081\u306b\u3057\u307e\u3057\u305f\u3002\uff08\u30f2\u30d2<\/p>\n<p>\u305d\u308c\u3067\u306f\u3044\u3044\u52a0\u6e1b\u3067\u9069\u5f53\u306a\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u304c\u8f09\u305b\u3066\u304a\u304d\u307e\u3059\u306d\u3002<\/p>\n<p>\u9593\u9055\u3044\u7b49\u3042\u308a\u307e\u3057\u305f\u3089\u512a\u3057\u304f\u5fa1\u6559\u793a\u304f\u3060\u3055\u3044\u307e\u305b\uff01<\/p>\n<p><pre title=\"Cylinder_3D.java\">\r\npackage jp.yucchi.cylinder_3d;\r\n\r\nimport javafx.application.Application;\r\nimport javafx.fxml.FXMLLoader;\r\nimport javafx.scene.Parent;\r\nimport javafx.scene.Scene;\r\nimport javafx.stage.Stage;\r\n\r\npublic class Cylinder_3D extends Application {\r\n\r\n    @Override\r\n    public void start(Stage stage) throws Exception {\r\n\r\n        \/\/ FXMLDocumentController \u306b Scene \u3092\u6e21\u3059\u3002\r\n        \/\/ \u3082\u3063\u3068\u30b9\u30de\u30fc\u30c8\u306a\u65b9\u6cd5\u304c\u3042\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u3002\r\n        FXMLLoader loader = new FXMLLoader(getClass().getResource(\"FXMLDocument.fxml\"));\r\n        Parent root = (Parent) loader.load();\r\n        FXMLDocumentController c = loader.getController();\r\n        Scene scene = new Scene(root);\r\n        c.setThisScene(scene);\r\n\r\n\/\/        \/\/ \u3053\u3063\u3061\u3067\u3082\u554f\u984c\u306f\u7121\u3044\u3002\r\n\/\/        Parent root = FXMLLoader.load(getClass().getResource(\"FXMLDocument.fxml\"));\r\n\/\/        Scene scene = new Scene(root);\r\n\/\/        PerspectiveCamera cam = new PerspectiveCamera(false);\r\n\/\/        scene.setCamera(cam);\r\n        stage.setTitle(\"\u306f\u3058\u3081\u3066\u306e JavaFX 3D\");\r\n        stage.setScene(scene);\r\n        stage.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<pre title=\"FXMLDocumentController.java\">\r\npackage jp.yucchi.cylinder_3d;\r\n\r\nimport java.net.URL;\r\nimport java.util.ResourceBundle;\r\nimport javafx.beans.value.ObservableValue;\r\nimport javafx.event.ActionEvent;\r\nimport javafx.fxml.FXML;\r\nimport javafx.fxml.Initializable;\r\nimport javafx.scene.AmbientLight;\r\nimport javafx.scene.PerspectiveCamera;\r\nimport javafx.scene.PointLight;\r\nimport javafx.scene.Scene;\r\nimport javafx.scene.control.ComboBox;\r\nimport javafx.scene.control.Slider;\r\nimport javafx.scene.control.TitledPane;\r\nimport javafx.scene.image.Image;\r\nimport javafx.scene.layout.AnchorPane;\r\nimport javafx.scene.paint.Color;\r\nimport javafx.scene.paint.PhongMaterial;\r\nimport javafx.scene.shape.Cylinder;\r\nimport javafx.scene.shape.Shape3D;\r\nimport javafx.scene.transform.Rotate;\r\n\r\npublic class FXMLDocumentController implements Initializable {\r\n\r\n    @FXML\r\n    private AnchorPane ap;\r\n\r\n    @FXML\r\n    private AnchorPane ap_3d;\r\n\r\n    @FXML\r\n    private TitledPane Transforms;\r\n\r\n    @FXML\r\n    private TitledPane Layout;\r\n\r\n    @FXML\r\n    private TitledPane Light;\r\n\r\n    @FXML\r\n    private Slider Transform_X;\r\n\r\n    @FXML\r\n    private Slider Transform_Y;\r\n\r\n    @FXML\r\n    private Slider Transform_Z;\r\n\r\n    @FXML\r\n    private Slider Layout_X;\r\n\r\n    @FXML\r\n    private Slider Layout_Y;\r\n\r\n    @FXML\r\n    private ComboBox<String> DiffuseColorCombo;\r\n\r\n    @FXML\r\n    private ComboBox<String> SpecularColorCombo;\r\n\r\n    @FXML\r\n    private ComboBox<String> AmbientLightCombo;\r\n\r\n    @FXML\r\n    private ComboBox<String> PointLightCombo;\r\n\r\n    @FXML\r\n    private Slider Ambient_slider;\r\n\r\n    @FXML\r\n    private Slider Point_slider;\r\n\r\n    private Color diffuseColor;\r\n\r\n    private Color specularColor;\r\n\r\n    private AmbientLight ambient;\r\n\r\n    private PointLight point;\r\n\r\n    @FXML\r\n    public void handleDiffuse(ActionEvent event) {\r\n\r\n        switch (DiffuseColorCombo.getValue()) {\r\n            case \"WHITE\":\r\n                diffuseColor = Color.WHITE;\r\n                break;\r\n            case \"AQUA\":\r\n                diffuseColor = Color.AQUA;\r\n                break;\r\n            case \"YELLOW\":\r\n                diffuseColor = Color.YELLOW;\r\n                break;\r\n            case \"RED\":\r\n                diffuseColor = Color.RED;\r\n                break;\r\n            case \"PINK\":\r\n                diffuseColor = Color.PINK;\r\n                break;\r\n            case \"VIOLET\":\r\n                diffuseColor = Color.VIOLET;\r\n                break;\r\n            case \"GREEN\":\r\n                diffuseColor = Color.GREEN;\r\n                break;\r\n            case \"ORANGE\":\r\n                diffuseColor = Color.ORANGE;\r\n                break;\r\n            case \"BLACK\":\r\n                diffuseColor = Color.BLACK;\r\n                break;\r\n            default:\r\n                diffuseColor = Color.GHOSTWHITE;\r\n        }\r\n\r\n        material.setDiffuseColor(diffuseColor);\r\n\r\n    }\r\n\r\n    @FXML\r\n    public void handleSpecular(ActionEvent event) {\r\n\r\n        switch (SpecularColorCombo.getValue()) {\r\n            case \"WHITE\":\r\n                specularColor = Color.WHITE;\r\n                break;\r\n            case \"AQUA\":\r\n                specularColor = Color.AQUA;\r\n                break;\r\n            case \"YELLOW\":\r\n                specularColor = Color.YELLOW;\r\n                break;\r\n            case \"RED\":\r\n                specularColor = Color.RED;\r\n                break;\r\n            case \"PINK\":\r\n                specularColor = Color.PINK;\r\n                break;\r\n            case \"VIOLET\":\r\n                specularColor = Color.VIOLET;\r\n                break;\r\n            case \"GREEN\":\r\n                specularColor = Color.GREEN;\r\n                break;\r\n            case \"ORANGE\":\r\n                specularColor = Color.ORANGE;\r\n                break;\r\n            case \"BLACK\":\r\n                specularColor = Color.BLACK;\r\n                break;\r\n            default:\r\n                specularColor = Color.GHOSTWHITE;\r\n        }\r\n\r\n        material.setSpecularColor(specularColor);\r\n\r\n    }\r\n\r\n    @FXML\r\n    public void handleAmbientLight(ActionEvent event) {\r\n\r\n        switch (AmbientLightCombo.getValue()) {\r\n            case \"WHITE\":\r\n                ambient.setColor(Color.rgb(255, 255, 255, Ambient_slider.getValue()));\r\n                break;\r\n            case \"AQUA\":\r\n                ambient.setColor(Color.rgb(0, 255, 255, Ambient_slider.getValue()));\r\n                break;\r\n            case \"YELLOW\":\r\n                ambient.setColor(Color.rgb(255, 255, 0, Ambient_slider.getValue()));\r\n                break;\r\n            case \"RED\":\r\n                ambient.setColor(Color.rgb(255, 0, 0, Ambient_slider.getValue()));\r\n                break;\r\n            case \"PINK\":\r\n                ambient.setColor(Color.rgb(255, 192, 203, Ambient_slider.getValue()));\r\n                break;\r\n            case \"VIOLET\":\r\n                ambient.setColor(Color.rgb(238, 130, 238, Ambient_slider.getValue()));\r\n                break;\r\n            case \"GREEN\":\r\n                ambient.setColor(Color.rgb(0, 128, 0, Ambient_slider.getValue()));\r\n                break;\r\n            case \"ORANGE\":\r\n                ambient.setColor(Color.rgb(255, 165, 0, Ambient_slider.getValue()));\r\n                break;\r\n            case \"BLACK\":\r\n                ambient.setColor(Color.rgb(0, 0, 0, Ambient_slider.getValue()));\r\n                break;\r\n            default:\r\n                ambient.setColor(Color.rgb(184, 134, 11, Ambient_slider.getValue()));\r\n        }\r\n\r\n    }\r\n\r\n    @FXML\r\n    public void handlePointtLight(ActionEvent event) {\r\n\r\n        switch (PointLightCombo.getValue()) {\r\n            case \"WHITE\":\r\n                point.setColor(Color.rgb(255, 255, 255, Point_slider.getValue()));\r\n                break;\r\n            case \"AQUA\":\r\n                point.setColor(Color.rgb(0, 255, 255, Point_slider.getValue()));\r\n                break;\r\n            case \"YELLOW\":\r\n                point.setColor(Color.rgb(255, 255, 0, Point_slider.getValue()));\r\n                break;\r\n            case \"RED\":\r\n                point.setColor(Color.rgb(255, 0, 0, Point_slider.getValue()));\r\n                break;\r\n            case \"PINK\":\r\n                point.setColor(Color.rgb(255, 192, 203, Point_slider.getValue()));\r\n                break;\r\n            case \"VIOLET\":\r\n                point.setColor(Color.rgb(238, 130, 238, Point_slider.getValue()));\r\n                break;\r\n            case \"GREEN\":\r\n                point.setColor(Color.rgb(0, 128, 0, Point_slider.getValue()));\r\n                break;\r\n            case \"ORANGE\":\r\n                point.setColor(Color.rgb(255, 165, 0, Point_slider.getValue()));\r\n                break;\r\n            case \"BLACK\":\r\n                point.setColor(Color.rgb(0, 0, 0, Point_slider.getValue()));\r\n                break;\r\n            default:\r\n                point.setColor(Color.rgb(184, 134, 11, Point_slider.getValue()));\r\n        }\r\n\r\n    }\r\n\r\n    private Scene scene;\r\n    private PerspectiveCamera cam;\r\n    private Cylinder cylinder;\r\n    private PhongMaterial material;\r\n\r\n    @Override\r\n    public void initialize(URL url, ResourceBundle rb) {\r\n        \/\/ \uff13\uff24\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u751f\u6210\u3002\r\n        Shape3D cl = make3DObject(500, 350, 80, 250);\r\n        \/\/ \u5468\u56f2\u306e\u5149\u6e90\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002\r\n        ambient = new AmbientLight();\r\n        ambient.setColor(Color.rgb(184, 134, 11, 0.5));\r\n\r\n        \/\/ \u70b9\u5149\u6e90\u3092\u8a2d\u5b9a\u3002\r\n        point = new PointLight();\r\n        point.setColor(Color.rgb(255, 255, 255, 1));\r\n        \/\/ \u30ec\u30a4\u30a2\u30a6\u30c8\u8a2d\u5b9a\u3002\r\n        point.setLayoutX(400);\r\n        point.setLayoutY(100);\r\n        point.setTranslateZ(-1100);\r\n        point.getScope().add(cl);\r\n        ap_3d.getChildren().addAll(cl, point, ambient);\r\n\r\n        \/\/ \u3053\u308c\u3088\u308a\u8a2d\u5b9a\u5024\u5909\u66f4\u51e6\u7406\r\n        Transform_X.valueProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {\r\n            cylinder.getTransforms().add(new Rotate(newValue.doubleValue() - oldValue.doubleValue(), Rotate.X_AXIS));\r\n        });\r\n\r\n        Transform_Y.valueProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {\r\n            cylinder.getTransforms().add(new Rotate(newValue.doubleValue() - oldValue.doubleValue(), Rotate.Y_AXIS));\r\n        });\r\n\r\n        Transform_Z.valueProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {\r\n            cylinder.getTransforms().add(new Rotate(newValue.doubleValue() - oldValue.doubleValue(), Rotate.Z_AXIS));\r\n        });\r\n\r\n        Layout_X.valueProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {\r\n            cylinder.setLayoutX(newValue.doubleValue());\r\n        });\r\n\r\n        Layout_Y.valueProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {\r\n            cylinder.setLayoutY(newValue.doubleValue());\r\n        });\r\n\r\n        Ambient_slider.valueProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {\r\n            if (AmbientLightCombo.getValue() != null) {\r\n                switch (AmbientLightCombo.getValue()) {\r\n                    case \"WHITE\":\r\n                        ambient.setColor(Color.rgb(255, 255, 255, newValue.doubleValue()));\r\n                        break;\r\n                    case \"AQUA\":\r\n                        ambient.setColor(Color.rgb(0, 255, 255, newValue.doubleValue()));\r\n                        break;\r\n                    case \"YELLOW\":\r\n                        ambient.setColor(Color.rgb(255, 255, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"RED\":\r\n                        ambient.setColor(Color.rgb(255, 0, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"PINK\":\r\n                        ambient.setColor(Color.rgb(255, 192, 203, newValue.doubleValue()));\r\n                        break;\r\n                    case \"VIOLET\":\r\n                        ambient.setColor(Color.rgb(238, 130, 238, newValue.doubleValue()));\r\n                        break;\r\n                    case \"GREEN\":\r\n                        ambient.setColor(Color.rgb(0, 128, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"ORANGE\":\r\n                        ambient.setColor(Color.rgb(255, 165, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"BLACK\":\r\n                        ambient.setColor(Color.rgb(0, 0, 0, newValue.doubleValue()));\r\n                        break;\r\n                    default:\r\n                        ambient.setColor(Color.rgb(184, 134, 11, newValue.doubleValue()));\r\n                }\r\n            } else {\r\n                ambient.setColor(Color.rgb(184, 134, 11, newValue.doubleValue()));\r\n            }\r\n        });\r\n\r\n        Point_slider.valueProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {\r\n            if (PointLightCombo.getValue() != null) {\r\n                switch (PointLightCombo.getValue()) {\r\n                    case \"WHITE\":\r\n                        point.setColor(Color.rgb(255, 255, 255, newValue.doubleValue()));\r\n                        break;\r\n                    case \"AQUA\":\r\n                        point.setColor(Color.rgb(0, 255, 255, newValue.doubleValue()));\r\n                        break;\r\n                    case \"YELLOW\":\r\n                        point.setColor(Color.rgb(255, 255, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"RED\":\r\n                        point.setColor(Color.rgb(255, 0, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"PINK\":\r\n                        point.setColor(Color.rgb(255, 192, 203, newValue.doubleValue()));\r\n                        break;\r\n                    case \"VIOLET\":\r\n                        point.setColor(Color.rgb(238, 130, 238, newValue.doubleValue()));\r\n                        break;\r\n                    case \"GREEN\":\r\n                        point.setColor(Color.rgb(0, 128, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"ORANGE\":\r\n                        point.setColor(Color.rgb(255, 165, 0, newValue.doubleValue()));\r\n                        break;\r\n                    case \"BLACK\":\r\n                        point.setColor(Color.rgb(0, 0, 0, newValue.doubleValue()));\r\n                        break;\r\n                    default:\r\n                        point.setColor(Color.rgb(255, 255, 255, newValue.doubleValue()));\r\n                }\r\n            } else {\r\n                point.setColor(Color.rgb(255, 255, 255, newValue.doubleValue()));\r\n            }\r\n        });\r\n\r\n    }\r\n\r\n    private Shape3D make3DObject(double x, double y, double radius, double height) {\r\n        \/\/ \u30b7\u30ea\u30f3\u30c0\u30fc\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u751f\u6210\u3002\r\n        cylinder = new Cylinder(radius, height);\r\n        \/\/ \u30d5\u30a9\u30f3\u30b7\u30a7\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u8a2d\u5b9a\u3002\r\n        material = new PhongMaterial();\r\n        \/\/ \u30c6\u30af\u30b9\u30c1\u30e3\u3092\u8cbc\u308b\u3002\r\n        Image diffuseMap = new Image(getClass().getResource(\"Duke.jpg\").toString());\r\n        material.setDiffuseMap(diffuseMap);\r\n        cylinder.setMaterial(material);\r\n        \/\/ \u6563\u4e71\u5149\u306b\u3088\u308b\u8272\u306e\u8a2d\u5b9a\r\n        material.setDiffuseColor(Color.GHOSTWHITE);\r\n        \/\/ \u30b9\u30da\u30ad\u30e5\u30e9\u30ab\u30e9\u30fc\uff08\u53cd\u5c04\u5149\u306e\u8272\uff09\u306e\u8a2d\u5b9a\u3002\r\n        material.setSpecularColor(Color.BLACK);\r\n        cylinder.setMaterial(material);\r\n        cylinder.setLayoutX(x);\r\n        cylinder.setLayoutY(y);\r\n        cylinder.getTransforms().add(new Rotate(0, Rotate.X_AXIS));\r\n        cylinder.getTransforms().add(new Rotate(0, Rotate.Y_AXIS));\r\n        cylinder.getTransforms().add(new Rotate(0, Rotate.Z_AXIS));\r\n        return cylinder;\r\n\r\n    }\r\n\r\n    void setThisScene(Scene scene) {\r\n        this.scene = scene;\r\n        cam = new PerspectiveCamera(false);\r\n        scene.setCamera(cam);\r\n    }\r\n\r\n}\r\n\r\n<\/pre>\n<pre title=\"FXMLDocument.fxml\">\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\r\n<?import java.lang.*?>\r\n<?import java.util.*?>\r\n<?import javafx.collections.*?>\r\n<?import javafx.scene.*?>\r\n<?import javafx.scene.control.*?>\r\n<?import javafx.scene.layout.*?>\r\n\r\n<AnchorPane id=\"AnchorPane\" fx:id=\"ap\" prefHeight=\"900.0\" prefWidth=\"1000.0\" xmlns:fx=\"http:\/\/javafx.com\/fxml\/1\" xmlns=\"http:\/\/javafx.com\/javafx\/2.2\" fx:controller=\"jp.yucchi.cylinder_3d.FXMLDocumentController\">\r\n  <children>\r\n    <AnchorPane fx:id=\"ap_3d\" prefHeight=\"700.0\" prefWidth=\"1000.0\" AnchorPane.bottomAnchor=\"200.0\" AnchorPane.leftAnchor=\"0.0\" AnchorPane.rightAnchor=\"0.0\" AnchorPane.topAnchor=\"0.0\" \/>\r\n    <Accordion prefHeight=\"200.0\" prefWidth=\"1000.0\" AnchorPane.bottomAnchor=\"0.0\" AnchorPane.leftAnchor=\"0.0\" AnchorPane.rightAnchor=\"0.0\">\r\n      <expandedPane>\r\n        <TitledPane fx:id=\"Transforms\" animated=\"true\" text=\"Transforms\">\r\n          <content>\r\n            <AnchorPane id=\"Content\" minHeight=\"0.0\" minWidth=\"0.0\" prefHeight=\"180.0\" prefWidth=\"200.0\">\r\n              <children>\r\n                <Slider fx:id=\"Transform_X\" blockIncrement=\"1.0\" majorTickUnit=\"90.0\" max=\"360.0\" min=\"-360.0\" minorTickCount=\"45\" prefHeight=\"27.0\" prefWidth=\"916.0\" showTickLabels=\"true\" showTickMarks=\"false\" snapToTicks=\"false\" value=\"0.0\" AnchorPane.bottomAnchor=\"89.0\" AnchorPane.leftAnchor=\"66.0\" AnchorPane.rightAnchor=\"14.0\" AnchorPane.topAnchor=\"14.0\" \/>\r\n                <Slider fx:id=\"Transform_Y\" majorTickUnit=\"90.0\" max=\"360.0\" min=\"-360.0\" minorTickCount=\"45\" prefWidth=\"916.0\" showTickLabels=\"true\" showTickMarks=\"false\" snapToTicks=\"false\" AnchorPane.bottomAnchor=\"57.0\" AnchorPane.leftAnchor=\"66.0\" AnchorPane.rightAnchor=\"14.0\" AnchorPane.topAnchor=\"59.0\" \/>\r\n                <Slider fx:id=\"Transform_Z\" majorTickUnit=\"90.0\" max=\"360.0\" min=\"-360.0\" minHeight=\"4.0\" minorTickCount=\"45\" prefHeight=\"4.0\" prefWidth=\"918.0\" showTickLabels=\"true\" showTickMarks=\"false\" snapToTicks=\"false\" AnchorPane.bottomAnchor=\"24.0\" AnchorPane.leftAnchor=\"66.0\" AnchorPane.rightAnchor=\"12.0\" AnchorPane.topAnchor=\"102.0\" \/>\r\n                <Label minWidth=\"8.0\" prefWidth=\"17.0\" text=\"X\" AnchorPane.bottomAnchor=\"102.5\" AnchorPane.leftAnchor=\"14.0\" AnchorPane.topAnchor=\"11.5\" \/>\r\n                <Label prefWidth=\"17.0\" text=\"Y\" AnchorPane.bottomAnchor=\"63.0\" AnchorPane.leftAnchor=\"14.0\" AnchorPane.topAnchor=\"51.0\" \/>\r\n                <Label prefWidth=\"17.0\" text=\"Z\" AnchorPane.bottomAnchor=\"28.0\" AnchorPane.leftAnchor=\"14.0\" AnchorPane.topAnchor=\"86.0\" \/>\r\n              <\/children>\r\n            <\/AnchorPane>\r\n          <\/content>\r\n        <\/TitledPane>\r\n      <\/expandedPane>\r\n      <panes>\r\n        <fx:reference source=\"Transforms\" \/>\r\n        <TitledPane fx:id=\"Layout\" animated=\"true\" text=\"Layout\">\r\n          <content>\r\n            <AnchorPane id=\"Content\" minHeight=\"0.0\" minWidth=\"0.0\" prefHeight=\"180.0\" prefWidth=\"200.0\">\r\n              <children>\r\n                <Slider fx:id=\"Layout_X\" blockIncrement=\"1.0\" majorTickUnit=\"100.0\" max=\"1000.0\" minorTickCount=\"50\" prefWidth=\"882.0\" showTickLabels=\"true\" showTickMarks=\"false\" snapToTicks=\"false\" value=\"500.0\" AnchorPane.bottomAnchor=\"73.0\" AnchorPane.leftAnchor=\"100.0\" AnchorPane.rightAnchor=\"14.0\" AnchorPane.topAnchor=\"25.0\" \/>\r\n                <Slider fx:id=\"Layout_Y\" blockIncrement=\"1.0\" majorTickUnit=\"100.0\" max=\"700.0\" minorTickCount=\"50\" prefWidth=\"882.0\" showTickLabels=\"true\" value=\"350.0\" AnchorPane.bottomAnchor=\"22.0\" AnchorPane.leftAnchor=\"100.0\" AnchorPane.rightAnchor=\"14.0\" AnchorPane.topAnchor=\"76.0\" \/>\r\n                <Label layoutX=\"29.0\" layoutY=\"24.0\" text=\"X\" \/>\r\n                <Label layoutX=\"29.0\" layoutY=\"75.0\" text=\"Y\" \/>\r\n              <\/children>\r\n            <\/AnchorPane>\r\n          <\/content>\r\n        <\/TitledPane>\r\n        <TitledPane fx:id=\"Light\" animated=\"true\" expanded=\"false\" styleClass=\"first-titled-pane\" text=\"Light\">\r\n          <content>\r\n            <AnchorPane id=\"Content\" minHeight=\"0.0\" minWidth=\"0.0\" prefHeight=\"180.0\" prefWidth=\"200.0\">\r\n              <children>\r\n                <Label layoutX=\"14.0\" layoutY=\"27.0\" prefHeight=\"34.0\" prefWidth=\"106.0\" text=\"DiffuseColor\" \/>\r\n                <Label layoutX=\"14.0\" layoutY=\"72.0\" prefHeight=\"34.0\" prefWidth=\"106.0\" text=\"SpecularColor\" \/>\r\n                <ComboBox fx:id=\"DiffuseColorCombo\" onAction=\"#handleDiffuse\" prefHeight=\"21.0\" prefWidth=\"181.0\" promptText=\"DiffuseColor\" AnchorPane.bottomAnchor=\"79.0\" AnchorPane.leftAnchor=\"120.0\" AnchorPane.rightAnchor=\"695.0\" AnchorPane.topAnchor=\"30.0\">\r\n                  <items>\r\n                    <FXCollections fx:factory=\"observableArrayList\">\r\n                      <String fx:value=\"WHITE\" \/>\r\n                      <String fx:value=\"AQUA\" \/>\r\n                      <String fx:value=\"YELLOW\" \/>\r\n                      <String fx:value=\"RED\" \/>\r\n                      <String fx:value=\"PINK\" \/>\r\n                      <String fx:value=\"VIOLET\" \/>\r\n                      <String fx:value=\"GREEN\" \/>\r\n                      <String fx:value=\"ORANGE\" \/>\r\n                      <String fx:value=\"BLACK\" \/>\r\n                    <\/FXCollections>\r\n                  <\/items>\r\n                <\/ComboBox>\r\n                <ComboBox fx:id=\"SpecularColorCombo\" onAction=\"#handleSpecular\" prefHeight=\"21.0\" prefWidth=\"181.0\" promptText=\"SpecularColor\" AnchorPane.bottomAnchor=\"31.0\" AnchorPane.leftAnchor=\"120.0\" AnchorPane.rightAnchor=\"695.0\" AnchorPane.topAnchor=\"78.0\">\r\n                  <items>\r\n                    <FXCollections fx:factory=\"observableArrayList\">\r\n                      <String fx:value=\"WHITE\" \/>\r\n                      <String fx:value=\"AQUA\" \/>\r\n                      <String fx:value=\"YELLOW\" \/>\r\n                      <String fx:value=\"RED\" \/>\r\n                      <String fx:value=\"PINK\" \/>\r\n                      <String fx:value=\"VIOLET\" \/>\r\n                      <String fx:value=\"GREEN\" \/>\r\n                      <String fx:value=\"ORANGE\" \/>\r\n                      <String fx:value=\"BLACK\" \/>\r\n                    <\/FXCollections>\r\n                  <\/items>\r\n                <\/ComboBox>\r\n                <Label layoutX=\"385.0\" layoutY=\"36.0\" prefWidth=\"92.0\" text=\"AmbientLight\" \/>\r\n                <Label layoutX=\"385.0\" layoutY=\"81.0\" prefWidth=\"92.0\" text=\"PointLight\" \/>\r\n                <ComboBox fx:id=\"AmbientLightCombo\" layoutX=\"499.0\" layoutY=\"33.0\" onAction=\"#handleAmbientLight\" prefHeight=\"21.0\" prefWidth=\"181.0\" promptText=\"AmbientLight\">\r\n                  <items>\r\n                    <FXCollections fx:factory=\"observableArrayList\">\r\n                      <String fx:value=\"WHITE\" \/>\r\n                      <String fx:value=\"AQUA\" \/>\r\n                      <String fx:value=\"YELLOW\" \/>\r\n                      <String fx:value=\"RED\" \/>\r\n                      <String fx:value=\"PINK\" \/>\r\n                      <String fx:value=\"VIOLET\" \/>\r\n                      <String fx:value=\"GREEN\" \/>\r\n                      <String fx:value=\"ORANGE\" \/>\r\n                      <String fx:value=\"BLACK\" \/>\r\n                    <\/FXCollections>\r\n                  <\/items>\r\n                <\/ComboBox>\r\n                <ComboBox fx:id=\"PointLightCombo\" layoutX=\"499.0\" layoutY=\"81.0\" onAction=\"#handlePointtLight\" prefHeight=\"21.0\" prefWidth=\"181.0\" promptText=\"PointLight\">\r\n                  <items>\r\n                    <FXCollections fx:factory=\"observableArrayList\">\r\n                      <String fx:value=\"WHITE\" \/>\r\n                      <String fx:value=\"AQUA\" \/>\r\n                      <String fx:value=\"YELLOW\" \/>\r\n                      <String fx:value=\"RED\" \/>\r\n                      <String fx:value=\"PINK\" \/>\r\n                      <String fx:value=\"VIOLET\" \/>\r\n                      <String fx:value=\"GREEN\" \/>\r\n                      <String fx:value=\"ORANGE\" \/>\r\n                      <String fx:value=\"BLACK\" \/>\r\n                    <\/FXCollections>\r\n                  <\/items>\r\n                <\/ComboBox>\r\n                <Slider fx:id=\"Ambient_slider\" blockIncrement=\"0.05\" layoutX=\"706.0\" layoutY=\"37.0\" majorTickUnit=\"0.2\" max=\"1.0\" minorTickCount=\"0\" prefWidth=\"269.0\" showTickLabels=\"true\" value=\"0.5\" \/>\r\n                <Slider fx:id=\"Point_slider\" blockIncrement=\"0.05\" layoutX=\"706.0\" layoutY=\"85.0\" majorTickUnit=\"0.2\" max=\"1.0\" minHeight=\"7.0\" minorTickCount=\"0\" prefHeight=\"7.0\" prefWidth=\"269.0\" showTickLabels=\"true\" value=\"1.0\" \/>\r\n              <\/children>\r\n            <\/AnchorPane>\r\n          <\/content>\r\n        <\/TitledPane>\r\n      <\/panes>\r\n    <\/Accordion>\r\n  <\/children>\r\n<\/AnchorPane>\r\n\r\n<\/pre>\n<\/p>\n<p>\u3044\u3064\u3082\u306e\u3088\u3046\u306b\u52d5\u753b\u3082\u30b5\u30fc\u30d3\u30b9\u3067\u3059\uff01\n<\/p>\n<p><video width=\"864\" height=\"486\" controls><source src=\"http:\/\/yucchi.jp\/movie\/Cylinder_3D\/Cylinder_3D.mp4\" type=\"video\/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>\u4f59\u8a08\u306a\u304a\u4e16\u8a71\u3067\u3057\u3087\u3046\u304c Java 8 \u5b9f\u884c\u74b0\u5883\u306e\u52c7\u8005\u69d8\u306b\u306f\u3053\u3061\u3089\u3092\u304a\u8a66\u3057\u3067\u3057\u307e\u3059\u3002<\/p>\n<p><font size=\"5\"><b>Webstart:<\/b> <a href=\"http:\/\/yucchi.jp\/java\/java_web_start\/Cylinder_3D\/Cylinder_3D.jnlp\">click to launch this app as webstart<\/a><\/font><font size=\"5\"><\/font><font size=\"5\"> \uff08Java 8 \u5b9f\u884c\u74b0\u5883\u5fc5\u9808\uff09<\/font><\/p>\n<div id=\"scid:0767317B-992E-4b12-91E0-4F059A8CECA8:be7f32b3-496b-460b-83ad-adc564261163\" 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%3D1327&title=%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%20JavaFX%203D' 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%3D1327&t=%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%20JavaFX%203D' 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=1327\" ><\/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=1327\" data-text=\"\u306f\u3058\u3081\u3066\u306e JavaFX 3D\" data-lang=\"ja\">Tweet<\/a><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u4eca\u56de\u306f\u3061\u3087\u3063\u3068\u80cc\u4f38\u3073\u3092\u3057\u3066\u30013D \u3092\u8a66\u3057\u3066\u307f\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002 \u5148\u65e5\u3001\u30b7\u30ea\u30f3\u30c0\u30fc\u3092\u3061\u3087\u3053\u3063\u3068\u4f5c\u3063\u3066\u307f\u3066\u5272\u3068\u7c21\u5358\u306b\u4f5c\u308c\u308b\u3093\u3060\u3068\u601d\u3044\u8abf\u5b50\u3076\u3063\u3053\u304f\u79c1\u3067\u3059\u3002 \u306f\u3058\u3081\u3066JavaFX\u306e3DAPI\u3068\u622f\u308c\u3066\u307f\u305f\u3002\u4f55\u51e6\u304b\u3067\u65e5\u672c\u8a9e\u306e\u8cc7\u6599\u3092\u76ee\u306b\u3057\u305f\u8a18\u61b6\u304c\u3042\u3063\u305f\u304c\u4f55\u51e6\u304b\u89e3\u3089\u306a\u304f\u306a\u3063\u305f\uff08\uff1e\uff1c\uff09\u4e00\u756a\u809d\u5fc3\u306a\u5ea7\u6a19\u304c\u3089\u307f\u304c\u3088\u304f\u89e3\u3089\u306a\u3044\uff08\u30f2\u30d2\uff01\u3068\u308a\u3042\u3048\u305a\u3053\u3093\u306a\u3082\u3093\u3092\u5275\u3063\u3066\u307f\u305f\u3002 pic.twitter.com\/phyKZzyIGk \u2014 Yucchi (@Yucchi_jp) September 18, 2013 Cylinder \u306e\u5f15\u6570\u3092\u4e09\u3064\u4f7f\u3046\u3068\u516d\u89d2\u67f1\u306a\u3069\u306e\u591a\u89d2\u67f1\u3082\u7c21\u5358\u306b\u5275\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3093\u3067\u3059\u306d\uff01\u51c4\u3044\u305e\uff01\u3000JavaFX pic.\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-1327","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\/1327","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=1327"}],"version-history":[{"count":2,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1327\/revisions"}],"predecessor-version":[{"id":1328,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1327\/revisions\/1328"}],"wp:attachment":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1327"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}