﻿{"id":1384,"date":"2013-12-10T11:31:52","date_gmt":"2013-12-10T02:31:52","guid":{"rendered":"http:\/\/yucchi.jp\/blog\/?p=1384"},"modified":"2013-12-10T11:50:44","modified_gmt":"2013-12-10T02:50:44","slug":"javafx-3d-%e5%ad%a6%e7%bf%92%e3%81%a4%e3%81%84%e3%81%a7%e3%81%ab%e5%89%b5%e3%81%a3%e3%81%9f-3d-%e3%82%b2%e3%83%bc%e3%83%a0","status":"publish","type":"post","link":"http:\/\/yucchi.jp\/blog\/?p=1384","title":{"rendered":"JavaFX 3D \u5b66\u7fd2\u3064\u3044\u3067\u306b\u5275\u3063\u305f 3D \u30b2\u30fc\u30e0"},"content":{"rendered":"<p>\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u306f\u3001<a href=\"http:\/\/www.adventar.org\/calendars\/146\" target=\"_blank\">JavaFX Advent Calendar 2013<\/a>, 10\u65e5\u76ee\u3067\u3059\u3002<\/p>\n<p>\u6628\u65e5\u306f @sk44 \u3055\u3093\u306e <a href=\"http:\/\/d.hatena.ne.jp\/hagi44\/20131209\/1386518599\" name=\"1386518599\">JavaFX \u3067\u30da\u30fc\u30b8\u3081\u304f\u308a\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u7684\u306a\u306a\u306b\u304b<\/a> \u3067\u3057\u305f\u3002<\/p>\n<p>\u660e\u65e5\u306f @kis \u3055\u3093\u3067\u3059\u3002<\/p>\n<p>\u4eca\u65e5\u306f\u79c1\u304c\u6700\u8fd1\u30b0\u30ea\u30b0\u30ea\u3057\u3066\u3044\u308b JavaFX 3D \u306b\u3064\u3044\u3066\u65ad\u7247\u7684\u3067\u306f\u3042\u308a\u307e\u3059\u304c\u30cd\u30c3\u30c8\u4e0a\u3067\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u56f0\u96e3\u306a\u3053\u3068\u306b\u3064\u3044\u3066\u66f8\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u3068\u8a00\u3063\u3066\u3082\u79c1\u306f\u7d20\u4eba\u3067\u672c\u6765\u3053\u306e\u3088\u3046\u306a\u30a4\u30d9\u30f3\u30c8\u3067\u71b1\u304f\u8a9e\u308b\u3088\u3046\u306a\u30b9\u30ad\u30eb\u306f\u6301\u3061\u5408\u308f\u305b\u3066\u3044\u307e\u305b\u3093\u3002<\/p>\n<p>\u3088\u3063\u3066\u304a\u304b\u3057\u306a\u3053\u3068\u3084\u9593\u9055\u3063\u305f\u3053\u3068\u3092\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u306f\u6975\u3081\u3066\u5927\u304d\u3044\u306e\u3067\u30b3\u30e1\u30f3\u30c8\u3067\u3054\u6307\u6458\u3044\u305f\u3060\u3051\u308b\u3068\u5e78\u3044\u3067\u3059\u3002<\/p>\n<p>\u305d\u3046\u3044\u3046\u3053\u3068\u3067\u672c\u6765\u30013D \u306e\u57fa\u790e\u3067\u3042\u308b\u30ab\u30e1\u30e9\u3001\u30e9\u30a4\u30c8\u3001\u30c6\u30af\u30b9\u30c1\u30e3\u3001\u30e2\u30c7\u30eb\u306e\u79fb\u52d5\u3001\u56de\u8ee2\u3001\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u3001\u305d\u3057\u3066 SubScene \u3068\u3044\u3063\u305f\u5fc5\u305a\u5fc5\u8981\u3068\u306a\u308b\u3053\u3068\u306f\u5272\u611b\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3059\u3002<\/p>\n<p>\u57fa\u790e\u304c\u77e5\u308a\u305f\u3044\u3068\u601d\u308f\u308c\u308b\u65b9\u3082\u3044\u3089\u3063\u3057\u3083\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u3053\u3067\u8033\u5bc4\u308a\u306a\u60c5\u5831\u3092\uff01<\/p>\n<p>12 \u6708 13 \u65e5\u306b <a href=\"http:\/\/javafx.doorkeeper.jp\/events\/7168\" target=\"_blank\">JavaFX \u52c9\u5f37\u4f1a &amp; \u5fd8\u5e74\u4f1a<\/a> \u3067 @skrb \u3055\u3093\u304c\u521d\u5fc3\u8005\u306b\u3082\u5206\u304b\u308a\u3084\u3059\u304f 3D \u306b\u3064\u3044\u3066\u89e3\u8aac\u3055\u308c\u308b\u4e88\u5b9a\u3067\u3059\u3002<\/p>\n<p>\u90fd\u4f1a\u306b\u4f4f\u307e\u308f\u308c\u3066\u3044\u308b\u65b9\u3084\u3001\u3069\u3046\u3057\u3066\u3082\u805e\u304d\u305f\u3044\u65b9\u306f\u3053\u306e\u6a5f\u4f1a\u306b\u53c2\u52a0\u3055\u308c\u3066\u30b0\u30ea\u30b0\u30ea\u3057\u307e\u3057\u3087\u3046\uff01(^_^)<\/p>\n<p>\u6b8b\u5ff5\u306a\u304c\u3089\u53c2\u52a0\u3067\u304d\u306a\u3044\u65b9\u306f @skrb \u3055\u3093\u304c 24 \u65e5\u306e JavaFX Advent Calendar \u30a8\u30f3\u30c8\u30ea\u30fc\u306b 13 \u65e5\u306e\u5185\u5bb9\u3092\u7d39\u4ecb\u3057\u3066\u304f\u308c\u308b\u4e88\u5b9a\u3067\u3059\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3067\u7d39\u4ecb\u3057\u3066\u3044\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306f JDK 8 Build b118 \u3067\u5275\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>JDK \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u4e0a\u304c\u308b\u3068\u73fe\u5728\u306e\u4ed5\u69d8\u3067\u306f\u52d5\u4f5c\u3057\u306a\u304f\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u306e\u3067\u3054\u5bb9\u8d66\u304f\u3060\u3055\u3044\u307e\u305b\u3002<\/p>\n<p>\u306a\u305c 3D \u306a\u306e\u304b\uff1f\u3000\u4eca\u5e74\u306e JavaOne \u3067\u30c1\u30a7\u30b9\u30dc\u30fc\u30c9\u306e\u4e0a\u3092\u6b69\u304f Duke \u306b\u611f\u52d5\u3057\u3066\u81ea\u5206\u3067\u3082\u5275\u308c\u306a\u3044\u304b\u306a\u3068\u601d\u3044\u30c1\u30e3\u30ec\u30f3\u30b8\u3057\u3066\u304d\u307e\u3057\u305f\u3002<\/p>\n<p><iframe loading=\"lazy\" height=\"480\" src=\"\/\/www.youtube.com\/embed\/EewNJI3IiII?rel=0\" frameborder=\"0\" width=\"640\" allowfullscreen><\/iframe> <\/p>\n<p>&nbsp;<\/p>\n<p>\u305d\u306e\u7d50\u679c\u304c\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p><iframe loading=\"lazy\" height=\"480\" src=\"\/\/www.youtube.com\/embed\/yee3TeM-CjM\" frameborder=\"0\" width=\"853\" allowfullscreen><\/iframe> <\/p>\n<p>&nbsp;<\/p>\n<p>JavaOne \u306e\u3088\u3046\u306b\u306a\u3081\u3089\u304b\u306b\u7dba\u9e97\u306b\u81ea\u7531\u81ea\u5728\u306b\u52d5\u3044\u3066\u3044\u308b\u308f\u3051\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u304c\u76ee\u7684\u306f\u9054\u6210\u3057\u307e\u3057\u305f\u3002Complete Success!! (^_^)<\/p>\n<p>\u3054\u304f\u4e00\u90e8\u306e\u65b9\u306b\u559c\u3093\u3067\u3044\u305f\u3060\u3051\u305f\u3088\u3046\u306a\u306e\u3067\u3001JavaFX Advent Calendar \u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u306b 3D \u30cd\u30bf\u3092\u6301\u3063\u3066\u304d\u305f\u308f\u3051\u3067\u3059\u3002<\/p>\n<p>\u73fe\u5728\u3067\u306f\u30cd\u30c3\u30c8\u4e0a\u3067 Shape3D \u3092\u5229\u7528\u3057\u305f\u30b5\u30f3\u30d7\u30eb\u3082\u3051\u3063\u3053\u3046\u51fa\u3066\u307e\u3059\u3002<\/p>\n<p>\u3054\u89a7\u306b\u306a\u3089\u308c\u305f\u65b9\u3082\u3051\u3063\u3053\u3046\u3044\u3089\u3063\u3057\u3083\u308b\u3068\u601d\u3046\u306e\u3067\u3059\u304c\u3001\u305d\u308c\u3067\u306f\u9650\u754c\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u3084\u3063\u3071\u308a\u30e2\u30c7\u30ea\u30f3\u30b0\u30c4\u30fc\u30eb\u3067\u4f5c\u3063\u305f\u30e2\u30c7\u30eb\u3092\u8aad\u307f\u8fbc\u307e\u305b\u52d5\u304b\u3057\u305f\u3044\uff01<\/p>\n<p>\u305d\u3053\u3067\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3067\u306f\u30e2\u30c7\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u3068\u4f4d\u7f6e\u60c5\u5831\u306e\u53d6\u5f97\u306b\u7126\u70b9\u3092\u3042\u3066\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p>\u30e2\u30c7\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u306b\u306f 3DViewer \u3063\u3066\u306e\u304c\u3042\u308b\u305d\u3046\u3067\u3059\u304c\u52d5\u304b\u306a\u3044\u3088\u3046\u3067\u3059\u3002\uff08\u73fe\u5728\u306f\u4e0d\u660e\u3067\u3059\u3002<\/p>\n<p>\u3061\u3087\u3063\u3068\u30b0\u30b0\u3063\u3066\u307f\u3066\u3082\u4f7f\u3044\u65b9\u3084\u30b5\u30f3\u30d7\u30eb\u3082\u30d2\u30c3\u30c8\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u3002\uff08\u30b0\u30b0\u308a\u65b9\u304c\u7518\u3044\u304b\u3082<\/p>\n<p>\u305d\u3046\u3044\u3046\u8a33\u3067\u79c1\u306f Jim \u3055\u3093\u304c\u4f5c\u3089\u308c\u305f <a href=\"http:\/\/www.interactivemesh.org\/models\/jfx3dimporter.html\" target=\"_blank\">JFX3DModelImporters<\/a> \u3092\u4f7f\u308f\u305b\u3066\u3044\u305f\u3060\u3044\u3066\u307e\u3059\u3002<\/p>\n<p>\/\/ Thanks a million!<br \/>IntStream.rangeClosed(1, 1_000_000).forEach(i -&gt; {<br \/>&nbsp;&nbsp;&nbsp; System.out.println(\u201cThanks!\u201d);<br \/>});<\/p>\n<p>\u305d\u308c\u3067\u306f\u30e1\u30bf\u30bb\u30b3\u30a4\u30a2\u3067\u4f5c\u3063\u305f Duke \u306e\u30e2\u30c7\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/12\/a1.png\"><img loading=\"lazy\" decoding=\"async\" title=\"a1\" 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=\"a1\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2013\/12\/a1_thumb.png\" width=\"831\" height=\"575\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\" start-line=\"241\" mark=\"258,262\">\r\n        \/\/ 3D \u30e2\u30c7\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\r\n        \/\/ Duke\r\n        ObjModelImporter dukeImporter = new ObjModelImporter();\r\n        \r\n        try {\r\n            URL objUrl = this.getClass().getResource(\"Duke\/duke.obj\");\r\n            dukeImporter.read(objUrl);\r\n        } catch (ImportException e) {\r\n            \/\/ G'catch! :p\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n\r\n        MeshView[] dukeMesh = dukeImporter.getImport();\r\n\r\n        dukeImporter.close();\r\n\r\n        Group dukeGroup = new Group();\r\n        for (MeshView _dukeMesh : dukeMesh) {\r\n            dukeGroup.getChildren().addAll(_dukeMesh);\r\n            _dukeMesh.drawModeProperty().bind(new When(showWireframe).then(DrawMode.LINE).otherwise(DrawMode.FILL));\r\n        }\r\n\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>obj \u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u307e\u3059\u3002<\/p>\n<p>mtl \u30d5\u30a1\u30a4\u30eb\u3084\u30c6\u30af\u30b9\u30c1\u30e3\u30d5\u30a1\u30a4\u30eb\u3092\u5fd8\u308c\u305a\u306b\u30ea\u30bd\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b obj \u30d5\u30a1\u30a4\u30eb\u3068\u4e00\u7dd2\u306b\u3044\u308c\u3068\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u4ed6\u306e\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u3082\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u306e\u304c\u3042\u308b\u3088\u3046\u3067\u3059\u304c\u8a66\u3057\u3066\u3044\u306a\u3044\u306e\u3067\u8ab0\u304b\u8a66\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u8aad\u307f\u8fbc\u307f\u3060\u3051\u3060\u3068\u554f\u984c\u306f\u306a\u3055\u305d\u3046\u3067\u3059\u304c\u305d\u306e\u5f8c\u306b\u4e00\u5de5\u592b\u3044\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>MeshView[] \u306b\u305d\u308c\u305e\u308c\u306e\u30d1\u30fc\u30c4\u304c\u683c\u7d0d\u3055\u308c\u3066\u3057\u307e\u3046\u306e\u3067\u305d\u308c\u3092\u6271\u3044\u3084\u3059\u304f\u3059\u308b\u305f\u3081\u306b Group \u3068\u3057\u3066\u7ba1\u7406\u3057\u307e\u3059\u3002<\/p>\n<p>258 \u884c\u76ee\u304b\u3089 262 \u884c\u76ee\u306e\u51e6\u7406\u3067\u3059\u3002<\/p>\n<p>261 \u884c\u76ee\u306f\u30c9\u30ed\u30fc\u30e2\u30fc\u30c9\u3092\u30ef\u30a4\u30e4\u30fc\u30d5\u30ec\u30fc\u30e0\u306b\u5909\u66f4\u3059\u308b\u3068\u304d\u306b\u307e\u3068\u3081\u3066\u5909\u66f4\u3067\u304d\u308b\u3088\u3046\u306b\u82e6\u8089\u306e\u7b56\u3068\u3057\u3066\u3064\u3044\u3067\u306b\u3084\u3063\u3066\u307e\u3059\u3002<\/p>\n<p>\u3055\u3041\u3001\u3053\u308c\u3067\u3042\u306a\u305f\u306e\u30ad\u30e5\u30fc\u30c8\u306a 3D \u30e2\u30c7\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3057\u305f\uff01<\/p>\n<p>\u79c1\u306f\u30e2\u30c7\u30eb\u304c\u7ba1\u7406\u3057\u3084\u3059\u3044\u3088\u3046\u306b\u30e2\u30c7\u30eb\u3092\u8907\u6570\u306b\u5206\u3051\u3066\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>Duke\u3001\u30dc\u30fc\u30c9\u3001\u30bf\u30a4\u30c8\u30eb\u6587\u5b57\u3001GAMEOVER \u6587\u5b57\u3001\u30d6\u30ed\u30c3\u30af\u3068\u3044\u3063\u305f\u5177\u5408\u306b\u3002<\/p>\n<p>\u3053\u306e\u3084\u308a\u65b9\u304c\u6b63\u3057\u3044\u304b\u3069\u3046\u304b\u306f\u89e3\u308a\u307e\u305b\u3093\u304c\u4e00\u5ea6\u306b\u305f\u304f\u3055\u3093\u306e\u30e2\u30c7\u30eb\u3092\u542b\u3093\u3060\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u3057\u307e\u3046\u3068\u7ba1\u7406\u4e0d\u80fd\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u305d\u3046\u3060\u304b\u3089\u3002<\/p>\n<p>\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u305f\u30e2\u30c7\u30eb\u3092\u89e3\u308a\u3084\u3059\u304f\u4f7f\u3044\u3084\u3059\u304f Group \u3068\u3057\u3066\u7ba1\u7406\u3057\u3066\u3057\u307e\u3048\u3070\u697d\u3067\u3059\u3002<\/p>\n<p>\u305f\u3068\u3048\u3070\u3053\u306e\u5834\u9762\u3067\u306f\u3053\u306e Group \u306f\u8868\u793a\u3055\u305b\u305f\u304f\u306a\u3044\u306a\u3041\u3063\u3066\u601d\u3046\u3068\u304d\u306f\u3053\u306e\u3088\u3046\u306b\u7ba1\u7406\u3067\u304d\u308b\u306e\u3067\u3044\u3044\u3067\u3059\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n        \/\/ \u30dc\u30fc\u30c9\u3092\u975e\u8868\u793a\r\n        boadGroup.setVisible(false);\r\n        \/\/ \u6587\u5b57\u3092\u975e\u8868\u793a\r\n        backGroup.setVisible(false);\r\n        \/\/ \u30e9\u30b1\u30c3\u30c8\u3092\u975e\u8868\u793a\r\n        racketGroup.setVisible(false);\r\n        \/\/ GAMEOVER \u975e\u8868\u793a\r\n        game_overGroup.setVisible(false);\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>\u3053\u308c\u3089\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u305f\u30e2\u30c7\u30eb\u3092\u30ce\u30fc\u30c9\u3068\u3057\u3066\u6271\u3048\u308b\u3088\u3046\u306b\u3057\u3066\u3057\u307e\u3048\u3070\u3042\u3068\u306f\u7c21\u5358\u3067\u3059\u3002<\/p>\n<p>\u305d\u308c\u305e\u308c\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u305f\u30e2\u30c7\u30eb\u306e\u4f4d\u7f6e\u60c5\u5831\u3055\u3048\u53d6\u5f97\u3067\u304d\u308c\u3070\u3042\u3068\u306f\u304a\u597d\u304d\u306b\u30b0\u30ea\u30b0\u30ea\u52d5\u304b\u3057\u3066\u3057\u307e\u3048\u3070\u3044\u3044\u306e\u3067\u3059\u3002<\/p>\n<p>\u305f\u3068\u3048\u3070 Duke \u306e\u73fe\u5728\u4f4d\u7f6e\uff08Z \u8ef8\u624b\u524d\u5074\u306e\u4f4d\u7f6e\uff09\u3092\u77e5\u308b\u306b\u306f\u6b21\u306e\u3088\u3046\u306b\u3059\u308c\u3070\u3044\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n        System.out.println(\"getBoundsInParent(): \" + dukeGroup.getBoundsInParent().getMinZ()); \/\/ Duke \u306e\u73fe\u5728\u4f4d\u7f6e\uff08 MinZ \uff09\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>Z \u8ef8\u5965\u5074\u306e\u4f4d\u7f6e\u3092\u77e5\u308a\u305f\u3051\u308c\u3070\u884c\u672b\u306e\u30e1\u30bd\u30c3\u30c9\u3092 getMaxZ() \u306b\u3059\u308c\u3070 OK \u3067\u3059\u3002<\/p>\n<p>\u3082\u3061\u308d\u3093 X \u8ef8\u3001Y \u8ef8\u306e\u4f4d\u7f6e\u60c5\u5831\u3082\u53d6\u5f97\u3059\u308b\u305f\u3081\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u7528\u610f\u3055\u308c\u3066\u307e\u3059\u3002<\/p>\n<p>\u540c\u69d8\u306b\u3057\u3066\u30dc\u30fc\u30c9\u3084\u4ed6\u306e\u30e2\u30c7\u30eb\u306e\u4f4d\u7f6e\u60c5\u5831\u3092\u53d6\u5f97\u3057\u3066\u3001AnimationTimer \u3084 Timeline \u3092\u4f7f\u3044\u3061\u3087\u3063\u3068\u3057\u305f 3D \u30b2\u30fc\u30e0\u306e\u3067\u304d\u3042\u304c\u308a\u3068\u3044\u3046\u308f\u3051\u3067\u3059\uff01<\/p>\n<p>\u3053\u3053\u3067\u6ce8\u610f\u304c\u5fc5\u8981\u306a\u306e\u304c <a href=\"http:\/\/download.java.net\/jdk8\/jfxdocs\/javafx\/scene\/Node.html#getBoundsInParent--\"><code>getBoundsInParent()<\/code><\/a>\u306e\u4ed6\u306b <a href=\"http:\/\/download.java.net\/jdk8\/jfxdocs\/javafx\/scene\/Node.html#getBoundsInLocal--\"><code>getBoundsInLocal()<\/code><\/a> \u30e1\u30bd\u30c3\u30c9\u3068 <a href=\"http:\/\/download.java.net\/jdk8\/jfxdocs\/javafx\/scene\/Node.html#getLayoutBounds--\"><code>getLayoutBounds()<\/code><\/a> \u304c\u3042\u3063\u3066\u3053\u308c\u3089\u306f\u73fe\u5728\u4f4d\u7f6e\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306e\u3082\u306e\u3067\u306f\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u73fe\u5728\u4f4d\u7f6e\u3068\u3044\u3046\u8868\u73fe\u3092\u3055\u3063\u304d\u304b\u3089\u4f7f\u3063\u3066\u3044\u307e\u3059\u304c\u52d5\u304b\u3057\u3066\u66f4\u65b0\u3055\u308c\u305f\u4f4d\u7f6e\u3068\u3044\u3046\u306e\u304c\u9069\u5207\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u3061\u3087\u3063\u3068 JavaDoc \u3092\u898b\u305f\u306e\u306f\u3044\u3044\u3051\u3069\u3001\u82f1\u8a9e\u304c\u96e3\u3057\u304f\u3066\u7ffb\u8a33\u30bd\u30d5\u30c8\u306b\u983c\u3063\u3066\u3082\uff1f\uff1f\uff1f\u3067\u3057\u305f\u3002<\/p>\n<p>1.transforms ObservableList<br \/>2.scaleX, scaleY<br \/>3.rotate<br \/>4.layoutX, layoutY<br \/>5.translateX, translateY<\/p>\n<p>\u3053\u308c\u3089\uff15\u9805\u76ee\u306b\u5bfe\u5fdc\u3057\u3066\u4f4d\u7f6e\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u308b\u306e\u306f getBoundsInParent() \u30e1\u30bd\u30c3\u30c9\u3060\u3051\u306e\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u82f1\u8a9e\u304c\u554f\u984c\u306a\u3044\u65b9\u306f\u3059\u307f\u307e\u305b\u3093\u304c\u3054\u81ea\u5206\u3067\u3054\u78ba\u8a8d\u304f\u3060\u3055\u3044\u307e\u305b\u3002m(_ _)m<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n        System.out.println(\"getBoundsInParent(): \" + dukeGroup.getBoundsInParent().getMinZ()); \/\/ Duke \u306e\u73fe\u5728\u4f4d\u7f6e\uff08 MinZ \uff09\r\n        System.out.println(\"getBoundsInLocal():  \" + dukeGroup.getBoundsInLocal().getMinZ());\r\n        System.out.println(\"getLayoutBounds():   \" + dukeGroup.getLayoutBounds().getMinZ());\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>\u3053\u306e\u3088\u3046\u306b\u3057\u3066\u521d\u671f\u4f4d\u7f6e\u304b\u3089 Z \u8ef8\u30de\u30a4\u30ca\u30b9\u65b9\u5411\uff08\u624b\u524d\uff09\u306b Duke \u3092\u5c11\u3057\u305a\u3064\u79fb\u52d5\u3055\u305b\u308b [ dukeGroup.setTranslateZ(dukeGroup.getTranslateZ() -5); ] \u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u3068\u6b21\u306e\u3088\u3046\u306b\u51fa\u529b\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>getBoundsInParent(): -175.40234375<br \/>getBoundsInLocal():&nbsp; -175.40234375<br \/>getLayoutBounds():&nbsp;&nbsp; -175.40234375<br \/>getBoundsInParent(): -180.40234375<br \/>getBoundsInLocal():&nbsp; -175.40234375<br \/>getLayoutBounds():&nbsp;&nbsp; -175.40234375<br \/>getBoundsInParent(): -185.40234375<br \/>getBoundsInLocal():&nbsp; -175.40234375<br \/>getLayoutBounds():&nbsp;&nbsp; -175.40234375<br \/>getBoundsInParent(): -190.40234375<br \/>getBoundsInLocal():&nbsp; -175.40234375<br \/>getLayoutBounds():&nbsp;&nbsp; -175.40234375<\/p>\n<p>\u4f7f\u3044\u3069\u3053\u308d\u3092\u9593\u9055\u3048\u308b\u3068\u601d\u308f\u306c\u30d0\u30b0\u3092\u4ed5\u8fbc\u3093\u3067\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n<p>IDE \u306e\u304a\u6c17\u697d\u306a\u88dc\u5b8c\u6280\u8853\u306b\u983c\u3063\u3066\u3044\u308b\u3068\u3084\u3063\u3066\u3057\u307e\u3044\u305d\u3046\u306a\u30df\u30b9\u3067\u3059\u306d\u3002\uff08\u7d4c\u9a13\u8005\u8a9e\u308b<\/p>\n<p>\u3055\u3066\u3001\u30e2\u30c7\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u4f4d\u7f6e\u60c5\u5831\u3092\u628a\u63e1\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3068\u306a\u3063\u305f\u4eca\u3001\u30e2\u30c7\u30eb\u3092\u3042\u306a\u305f\u306e\u610f\u306e\u307e\u307e\u306b\u5236\u5fa1\u53ef\u80fd\u306b\u306a\u3063\u305f\u308f\u3051\u3067\u3059\u3002<\/p>\n<p>\u305f\u3068\u3048\u3070 AnimationTimer \u306e handle() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3063\u3066 Duke \u3092\u6b69\u304b\u305b\u3066\u307f\u308b\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n                    \/\/ Duke \u79fb\u52d5\r\n        dukeGroup.setTranslateX(dukeGroup.getTranslateX() + d_vx);\r\n        dukeGroup.setTranslateZ(dukeGroup.getTranslateZ() + d_vz);\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u306f X \u8ef8\u3001Z \u8ef8\u306e\u73fe\u5728\u306e\u4f4d\u7f6e\u306b\u305d\u308c\u305e\u308c d_vx, d_vz \u5206\u3060\u3051\u8db3\u3057\u305f\u4f4d\u7f6e\u306b\u79fb\u52d5\u3055\u305b\u308b\u3002<\/p>\n<p>\u6b21\u306b\u30dc\u30fc\u30c9\u306e\u53f3\u307e\u305f\u306f\u5de6\u306b\u884c\u304d\u5f53\u305f\u3063\u305f\u3089\u843d\u3061\u306a\u3044\u3088\u3046\u306b\u53cd\u8ee2\u3055\u305b\u308b\u51e6\u7406\u306f\u3053\u3046\u306a\u308b\u3002(\u53cd\u8ee2\u30e2\u30fc\u30b7\u30e7\u30f3\u306f turn() \u30e1\u30bd\u30c3\u30c9\u3067 Timeline \u3092\u4f7f\u3063\u3066\u5225\u9014\u51e6\u7406\u3055\u305b\u3066\u307e\u3059\u3002\uff09\n<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n        \/\/ \u5de6\u307e\u305f\u306f\u53f3\u306b\u5f53\u305f\u3063\u305f\u3089x\u65b9\u5411\u901f\u5ea6\u306e\u7b26\u53f7\u3092\u53cd\u8ee2\u3055\u305b\u308b\r\n        if (dukeGroup.getBoundsInParent().getMinX() < bord_left || dukeGroup.getBoundsInParent().getMaxX() > bord_right) {\r\n            d_vx = -d_vx;\r\n            turn();\r\n        }\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>\u3053\u306e\u3088\u3046\u306b\u4f4d\u7f6e\u60c5\u5831\u3055\u3048\u628a\u63e1\u3067\u304d\u3066\u3057\u307e\u3048\u3070\u30e2\u30c7\u30eb\u306e\u79fb\u52d5\u3001\u56de\u8ee2\u3001\u62e1\u5927\u3001\u7e2e\u5c0f\u306a\u3069\u3092 AnimationTimer \u3084 Timeline \u3092\u4f7f\u3063\u3066\u8ab0\u3067\u3082\u7c21\u5358\u306b\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3053\u3053\u3067\u3061\u3087\u3063\u3068\u3057\u305f\u7591\u554f\u304c\u3067\u3066\u304d\u307e\u3059\u3002<\/p>\n<p>Group \u3068\u3057\u3066\u6271\u3063\u3066\u304d\u305f\u306e\u306f\u3044\u3044\u3051\u3069\u500b\u3005\u306e MeshView[] \u3068\u3057\u3066\u6271\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u306e\uff1f\u3000\u305d\u3046\u3067\u3059\u3088\u306d\uff01<\/p>\n<p>Duke \u3092\u6b69\u304b\u305b\u308b\u305f\u3081\u306b\u624b\u8db3\u306e\u30d1\u30fc\u30c4\u3092\u305d\u308c\u305e\u308c\u52d5\u304b\u3057\u305f\u3044\uff01\u305d\u3053\u3067 MeshView[] \u3068\u3057\u3066\u6271\u3063\u3066\u307e\u3059\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n    \/\/ Duke \u30e2\u30c7\u30eb\u624b\u8db3\u52d5\u4f5c\u7528\r\n    Rotate r_legRotate;\r\n    Rotate l_legRotate;\r\n    Rotate r_armRotate;\r\n    Rotate l_armRotate;\r\n\r\n    dukeMesh[2].getTransforms().setAll(\r\n            r_legRotate = new Rotate(0, Rotate.X_AXIS));\r\n    dukeMesh[3].getTransforms().setAll(\r\n            l_legRotate = new Rotate(0, Rotate.X_AXIS));\r\n    dukeMesh[4].getTransforms().setAll(\r\n            r_armRotate = new Rotate(0, Rotate.Z_AXIS));\r\n    dukeMesh[5].getTransforms().setAll(\r\n            l_armRotate = new Rotate(0, Rotate.X_AXIS));\r\n\r\n    r_legRotate.angleProperty().bind(angleWalk_r_X);\r\n    l_legRotate.angleProperty().bind(angleWalk_l_X);\r\n    l_armRotate.angleProperty().bind(angleWalk_l_arm);\r\n    r_armRotate.angleProperty().bind(angleWalk_r_arm);\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>MeshView[] \u304c\u4f55\u304b\u89e3\u3089\u306a\u3044\u5834\u5408\u306f\u6a19\u6e96\u51fa\u529b\u3055\u305b\u3066\u78ba\u8a8d\u3059\u308c\u3070\u3044\u3044\u3067\u3057\u3087\u3046\u3002<\/p>\n<p>\u30e1\u30bf\u30bb\u30b3\u30a4\u30a2\u3067\u306f\u30e2\u30c7\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30d1\u30fc\u30c4\u306e\u9806\u756a\u901a\u308a\u306b\u306a\u3063\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u3057\u305f\u304c\u3063\u3066\u3001obj \u30d5\u30a1\u30a4\u30eb\u306e\u9806\u756a\u901a\u308a\u306b\u306a\u3063\u3066\u3044\u308b\u3068\u601d\u3044\u307e\u3059\u3002\uff08\u3042\u307e\u308a\u81ea\u4fe1\u304c\u306a\u3044<\/p>\n<p>\u6b69\u884c\u30e2\u30fc\u30b7\u30e7\u30f3\u306f\u3053\u308c\u3089\u3092 Timeline \u3092\u4f7f\u3063\u3066\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u3055\u305b\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n    \/\/ \u6b69\u884c\u30e2\u30fc\u30b7\u30e7\u30f3\r\n    dukeAnim_g = new Timeline(\r\n            new KeyFrame(\r\n                    new Duration(300),\r\n                    new KeyValue(angleWalk_r_X, -25),\r\n                    new KeyValue(angleWalk_l_X, 25),\r\n                    new KeyValue(angleWalk_l_arm, -20),\r\n                    new KeyValue(angleWalk_r_arm, 12, Interpolator.EASE_BOTH)\r\n            ),\r\n            new KeyFrame(\r\n                    new Duration(600),\r\n                    new KeyValue(angleWalk_r_X, 0),\r\n                    new KeyValue(angleWalk_l_X, 0),\r\n                    new KeyValue(angleWalk_l_arm, 0),\r\n                    new KeyValue(angleWalk_r_arm, 0, Interpolator.EASE_BOTH)\r\n            ),\r\n            new KeyFrame(\r\n                    new Duration(900),\r\n                    new KeyValue(angleWalk_r_X, 25),\r\n                    new KeyValue(angleWalk_l_X, -25),\r\n                    new KeyValue(angleWalk_l_arm, 20),\r\n                    new KeyValue(angleWalk_r_arm, 12, Interpolator.EASE_BOTH)\r\n            ),\r\n            new KeyFrame(\r\n                    new Duration(1_200),\r\n                    new KeyValue(angleWalk_r_X, 0),\r\n                    new KeyValue(angleWalk_l_X, 0),\r\n                    new KeyValue(angleWalk_l_arm, 0),\r\n                    new KeyValue(angleWalk_r_arm, 0, Interpolator.EASE_BOTH)\r\n            )\r\n    );\r\n\r\n    dukeAnim_g.setCycleCount(Timeline.INDEFINITE);\r\n    dukeAnim_g.play();\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>\u3053\u308c\u3067\u6b69\u304f Duke \u306e\u6b69\u884c\u30e2\u30fc\u30b7\u30e7\u30f3\u306f\u5b8c\u6210\u3067\u3059\u3002<\/p>\n<p>\u3042\u3068\u306f AnimationTimer \u3067\u79fb\u52d5\u3055\u305b\u308c\u3070 OK \u3067\u3059\u3002<\/p>\n<p>\u4f4d\u7f6e\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u308b\u306e\u3067\u304a\u597d\u304d\u306a\u3088\u3046\u306b\u5236\u5fa1\u3092\u3059\u308c\u3070\u9762\u767d\u3044\u3053\u3068\u304c\u3067\u304d\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u306d\uff01<\/p>\n<p>\u3042\u3068 MeshView[] \u3068\u3057\u3066\u4f7f\u3063\u3066\u3044\u308b\u306e\u306f\u97f3\u697d\u306b\u5408\u308f\u305b\u3066\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u3057\u3066\u3044\u308b DUKEWALK \u3068\u3044\u3046\u6587\u5b57\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3002<\/p>\n<p>\u3084\u3063\u3066\u308b\u3053\u3068\u306f\u5358\u7d14\u3060\u3051\u3069\u3051\u3063\u3053\u3046\u30a4\u30f3\u30d1\u30af\u30c8\u3042\u308a\u307e\u3059\u306d\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><pre title=\"DukeWalk.java\">\r\n    @Override\r\n    public void spectrumDataUpdate(double timestamp, double duration, float[] magnitudes, float[] phases) {\r\n        \/\/ \u30d0\u30c3\u30af\u306e\u6587\u5b57\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\r\n        IntStream.range(0, magnitudes.length).forEach(i -> {\r\n            backMesh[i].setScaleX((magnitudes[i] + 60.01) * 0.1 + 1.0);\r\n            backMesh[i].setScaleY((magnitudes[i] + 60.01) * 0.1 + 1.0);\r\n            backMesh[i].setScaleZ((magnitudes[i] + 60.01) * 0.1 + 1.0);\r\n        });\r\n    }\r\n<\/pre>\n<\/p>\n<p>&nbsp;<\/p>\n<p>JavaFX 3D API \u306e\u57fa\u790e\u306f\u306a\u306b\u3082\u8a9e\u3089\u305a\u65ad\u7247\u7684\u306a\u5185\u5bb9\u3068\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u304c\u3044\u304b\u304c\u3067\u3057\u305f\u3067\u3057\u3087\u3046\u304b\uff1f<\/p>\n<p>\u3053\u306e\u5b66\u7fd2\u7528\u306b\u4f5c\u3063\u305f\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0\u306f\u4e0b\u8a18\u30a2\u30c9\u30ec\u30b9\u304b\u3089\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u53ef\u80fd\u3068\u306a\u3063\u3066\u307e\u3059\u3002<\/p>\n<p><a title=\"https:\/\/www.dropbox.com\/sh\/itmywi67zb5i3gq\/zMn5vf5LPm\" href=\"https:\/\/www.dropbox.com\/sh\/itmywi67zb5i3gq\/zMn5vf5LPm\">https:\/\/www.dropbox.com\/sh\/itmywi67zb5i3gq\/zMn5vf5LPm<\/a><\/p>\n<p>\u3053\u3061\u3089\u306f\u3082\u3068\u3082\u3068\u30ab\u30e1\u30e9\u306e\u5b66\u7fd2\u7528\u306b\u79fb\u52d5\u3001\u56de\u8ee2\u3001\u62e1\u5927\u3001\u7e2e\u5c0f\u306e\u5236\u5fa1\u304c\u30b9\u30e9\u30a4\u30c0\u30fc\u3067\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u30ab\u30e1\u30e9\u3068\u8a00\u3048\u3070\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u7d44\u3080\u3068\u304d\u306b\u60a9\u3093\u3067\u3044\u305f\u30ab\u30e1\u30e9\u30ef\u30fc\u30af\u306e\u7b54\u3048\u3092\u51fa\u3057\u3066\u304f\u308c\u305f\u65b9\u304c\u3044\u3089\u3063\u3057\u3083\u3044\u307e\u3059\u3002<\/p>\n<p>\u4e0b\u8a18\u30b5\u30a4\u30c8\u3088\u308a\u7b54\u3048\u3092\u307e\u308b\u3063\u3068\u3044\u305f\u3060\u304d\u307e\u3057\u305f\u3002\uff08\u65e5\u672c\u8a9e\u3067\u3059\uff01\uff09<\/p>\n<p><a href=\"http:\/\/www.torutk.com\/projects\/swe\/wiki\/JavaFX_3D%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B\" target=\"_blank\">JavaFX 3D\u3092\u7406\u89e3\u3059\u308b<\/a><\/p>\n<p>\/\/ Thanks a million!<br \/>IntStream.rangeClosed(1, 1_000_000).forEach(i -&gt; {<br \/>&nbsp;&nbsp;&nbsp; System.out.println(\u201cThanks!\u201d);<br \/>});  <\/p>\n<p>\u3055\u3066\u3001\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30bd\u30fc\u30b9\u306f\u304a\u307e\u3058\u306a\u3044\u3092\u306f\u3058\u3081\u3001\u3050\u3061\u3083\u3050\u3061\u3083\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u3066\u3044\u308b\u306e\u3067\u96a0\u853d\u3057\u3066\u307e\u3059\u3002(\uffe3\u3002\uffe3;)<\/p>\n<p>\u3068\u601d\u3063\u305f\u3051\u3069\u5fc3\u512a\u3057\u3044\u30d7\u30ed\u306e\u65b9\u3082\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u898b\u3089\u308c\u3066\u3044\u308b\u3068\u601d\u3046\u306e\u3067\u6065\u305a\u304b\u3057\u306a\u304c\u3089\u8f09\u305b\u307e\u3059\u3002<\/p>\n<p>\u512a\u3057\u304f\u89e3\u308a\u3084\u3059\u3044\u30a2\u30c9\u30d0\u30a4\u30b9\u306f\u5927\u6b53\u8fce\u3067\u3059\uff01(^_^)<\/p>\n<p><pre title=\"DukeWalk.java\">\r\npackage jp.yucchi.dukewalk;\r\n\r\nimport com.interactivemesh.jfx.importer.ImportException;\r\nimport com.interactivemesh.jfx.importer.obj.ObjModelImporter;\r\nimport java.net.URL;\r\nimport java.util.Random;\r\nimport java.util.stream.IntStream;\r\nimport javafx.animation.AnimationTimer;\r\nimport javafx.animation.Interpolator;\r\nimport javafx.animation.KeyFrame;\r\nimport javafx.animation.KeyValue;\r\nimport javafx.animation.Timeline;\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.SceneAntialiasing;\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.image.Image;\r\nimport javafx.scene.input.KeyCode;\r\nimport javafx.scene.input.KeyEvent;\r\nimport javafx.scene.layout.AnchorPane;\r\nimport javafx.scene.layout.Background;\r\nimport javafx.scene.layout.HBox;\r\nimport javafx.scene.media.AudioSpectrumListener;\r\nimport javafx.scene.media.Media;\r\nimport javafx.scene.media.MediaPlayer;\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\nimport javafx.util.Duration;\r\n\r\npublic class DukeWalk extends Application implements AudioSpectrumListener {\r\n\r\n    \/\/ \u79fb\u52d5\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(-1_000);\r\n    \/\/ \u30b9\u30b1\u30fc\u30eb\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    \/\/ \u56de\u8ee2\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    \/\/ \u8868\u793a\u30e2\u30fc\u30c9\r\n    private final BooleanProperty showWireframe = new SimpleBooleanProperty(false);\r\n    \/\/ \u5ea7\u6a19\r\n    private double anchorAngleX;\r\n    private double anchorAngleY;\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    \/\/ Duke \u53cd\u8ee2\u51e6\u7406\u7528\r\n    private final DoubleProperty turnAngleY = new SimpleDoubleProperty(0);\r\n    \/\/ Duke \u8ee2\u5012\u51e6\u7406\u7528\r\n    private final DoubleProperty turnAngleX = new SimpleDoubleProperty(0);\r\n    \/\/ Duke \u624b\u8db3\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u7528\r\n    DoubleProperty angleWalk_r_X = new SimpleDoubleProperty(0);\r\n    DoubleProperty angleWalk_l_X = new SimpleDoubleProperty(0);\r\n    DoubleProperty angleWalk_l_arm = new SimpleDoubleProperty(0);\r\n    DoubleProperty angleWalk_r_arm = new SimpleDoubleProperty(0);\r\n    \/\/ \u6b69\u884c\u30e2\u30fc\u30b7\u30e7\u30f3\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\r\n    private Timeline dukeAnim;\r\n    \/\/ \u30ab\u30e1\u30e9\u7528\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u30bf\u30a4\u30de\u30fc\r\n    private AnimationTimer walkTimer;\r\n    \/\/ \u65b9\u4f4d\u89d2\r\n    private double azimuth;\r\n    \/\/ \u524d\u56de\u6642\u9593\r\n    private long previousHandledTime;\r\n    \/\/ \u56de\u8ee2\u901f\u5ea6\r\n    private final DoubleProperty azimuthRateProperty = new SimpleDoubleProperty(15);\r\n    \/\/ \u30ab\u30e1\u30e9\u9ad8\u3055\r\n    private final DoubleProperty elevationProperty = new SimpleDoubleProperty(7);\r\n    \/\/ \u534a\u5f84\r\n    private static final double SUBCAMERA_RADIUS = 5_500;\r\n    \/\/ Duke \u53cd\u8ee2\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u7528\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\r\n    private Timeline rightTurn;\r\n    private Timeline leftTurn;\r\n    \/\/ BGM\r\n    private final Media bgm = new Media(getClass().getResource(\"music\/bgm.mp3\").toExternalForm());\r\n    \/\/ \u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\r\n    private MediaPlayer mp_bgm;\r\n    private AudioSpectrumListener audioSpectrumListener;\r\n    \/\/ \u6587\u5b57\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u7528\u30e1\u30c3\u30b7\u30e5\u30d3\u30e5\u30fc\u914d\u5217\r\n    private MeshView[] backMesh;\r\n    \/\/ Game \u7528 Duke \u306e\u79fb\u52d5\u30b9\u30d4\u30fc\u30c9\r\n    private double d_vx = -5.0;\r\n    private double d_vz = -6.0;\r\n    \/\/ Game \u7528\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u30bf\u30a4\u30de\u30fc\r\n    private AnimationTimer walkTimer_g;\r\n    \/\/ Game \u7528 Duke \u30bf\u30fc\u30f3\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u7528\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\r\n    private Timeline turn_g;\r\n    \/\/ Game \u7528 Duke \u8ee2\u5012\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\r\n    private Timeline fall;\r\n    \/\/ GAMEOVER \u7528\u56de\u8ee2\u30a2\u30f3\u30b0\u30eb\r\n    private final DoubleProperty g_turnAngleX = new SimpleDoubleProperty(0);\r\n    \/\/ Score \u30ab\u30a6\u30f3\u30bf\u30fc\r\n    private int score;\r\n    \/\/ \u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc \u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc\r\n    private MediaPlayer mp_o;\r\n    private final Media o_mp = new Media(getClass().getResource(\"sound\/o.mp3\").toExternalForm());\r\n    \/\/ \u30b9\u30b3\u30a2\u5c02\u7528\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\r\n    private Timeline scoreTimeline;\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      \"); \/\/ \u826f\u3044\u5b50\u306f\u3053\u3093\u306a\u3053\u3068\u3057\u3061\u3083\u3060\u3081\u3088\uff01\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    \"); \/\/ \u826f\u3044\u5b50\u306f\u3053\u3093\u306a\u3053\u3068\u3057\u3061\u3083\u3060\u3081\u3088\uff01\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\"); \/\/ \u826f\u3044\u5b50\u306f\u3053\u3093\u306a\u3053\u3068\u3057\u3061\u3083\u3060\u3081\u3088\uff01\r\n        Label walkLabel = new Label(\"   Duke Walk!\"); \/\/ \u826f\u3044\u5b50\u306f\u3053\u3093\u306a\u3053\u3068\u3057\u3061\u3083\u3060\u3081\u3088\uff01\r\n        Label stopLabel = new Label(\"   Duke Stop!\"); \/\/ \u826f\u3044\u5b50\u306f\u3053\u3093\u306a\u3053\u3068\u3057\u3061\u3083\u3060\u3081\u3088\uff01\r\n        Label gameLabel = new Label(\"   Duke Walk Game\"); \/\/ \u826f\u3044\u5b50\u306f\u3053\u3093\u306a\u3053\u3068\u3057\u3061\u3083\u3060\u3081\u3088\uff01\r\n        Label scoreLabel = new Label(\"   L Key < RIGHT >    J Key < LEFT >  Please enjoy!\"); \/\/ \u826f\u3044\u5b50\u306f\u3053\u3093\u306a\u3053\u3068\u3057\u3061\u3083\u3060\u3081\u3088\uff01\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 resetBtn = new Button();\r\n        resetBtn.setText(\"Reset\");\r\n\r\n        Button walkBtn = new Button();\r\n        walkBtn.setText(\"Walk!\");\r\n\r\n        Button stopBtn = new Button();\r\n        stopBtn.setText(\"Stop!\");\r\n\r\n        Button gameBtn = new Button();\r\n        gameBtn.setText(\"Game Start!\");\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 & Duke Walk! & Duke Walk Game\", new HBox(20, drawModeLabel, meshCheckBox, resetLabel, resetBtn, walkLabel, walkBtn, stopLabel, stopBtn, gameLabel, gameBtn, scoreLabel));\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        \/\/ \u30b5\u30d6\u30b7\u30fc\u30f3\u7528\u306e\u30b5\u30d6\u30ab\u30e1\u30e9\r\n        PerspectiveCamera subCam = new PerspectiveCamera(true);\r\n        \/\/ Field of View \r\n        subCam.setFieldOfView(45.5);\r\n        \/\/ Clipping Planes\r\n        subCam.setNearClip(1.0);\r\n        subCam.setFarClip(1_000_000);\r\n\r\n        AnchorPane subRoot = new AnchorPane();\r\n        subRoot.setBackground(Background.EMPTY);\r\n\r\n        Group allGroup = new Group();\r\n\r\n        \/\/ 3D \u30e2\u30c7\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\r\n        \/\/ Duke\r\n        ObjModelImporter dukeImporter = new ObjModelImporter();\r\n        \/\/ Bord\r\n        ObjModelImporter boadImporter = new ObjModelImporter();\r\n        \/\/ \u6587\u5b57\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\r\n        ObjModelImporter backImporter = new ObjModelImporter();\r\n        \/\/ \u30e9\u30b1\u30c3\u30c8\r\n        ObjModelImporter racketImporter = new ObjModelImporter();\r\n        \/\/ \u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc\r\n        ObjModelImporter game_overImporter = new ObjModelImporter();\r\n\r\n        try {\r\n            URL objUrl = this.getClass().getResource(\"Duke\/duke.obj\");\r\n            dukeImporter.read(objUrl);\r\n        } catch (ImportException e) {\r\n            \/\/ G'catch! :p\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n\r\n        MeshView[] dukeMesh = dukeImporter.getImport();\r\n\r\n        dukeImporter.close();\r\n\r\n        Group dukeGroup = new Group();\r\n        for (MeshView _dukeMesh : dukeMesh) {\r\n            dukeGroup.getChildren().addAll(_dukeMesh);\r\n            _dukeMesh.drawModeProperty().bind(new When(showWireframe).then(DrawMode.LINE).otherwise(DrawMode.FILL));\r\n        }\r\n\r\n        try {\r\n            URL objUrl = this.getClass().getResource(\"Duke_base\/base.obj\");\r\n            boadImporter.read(objUrl);\r\n        } catch (ImportException e) {\r\n            \/\/ G'catch! :p\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n\r\n        MeshView[] boadMesh = boadImporter.getImport();\r\n\r\n        boadImporter.close();\r\n\r\n        Group boadGroup = new Group();\r\n        for (MeshView _boadMesh : boadMesh) {\r\n            boadGroup.getChildren().addAll(_boadMesh);\r\n            _boadMesh.drawModeProperty().bind(new When(showWireframe).then(DrawMode.LINE).otherwise(DrawMode.FILL));\r\n        }\r\n\r\n        try {\r\n            URL objUrl = this.getClass().getResource(\"back_duke\/back_duke.obj\");\r\n            backImporter.read(objUrl);\r\n        } catch (ImportException e) {\r\n            \/\/ G'catch! :p\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n\r\n        backMesh = backImporter.getImport();\r\n\r\n        backImporter.close();\r\n\r\n        Group backGroup = new Group();\r\n        for (MeshView _backMesh : backMesh) {\r\n            backGroup.getChildren().addAll(_backMesh);\r\n            _backMesh.drawModeProperty().bind(new When(showWireframe).then(DrawMode.LINE).otherwise(DrawMode.FILL));\r\n        }\r\n\r\n        try {\r\n            URL objUrl = this.getClass().getResource(\"Racket\/racket.obj\");\r\n            racketImporter.read(objUrl);\r\n        } catch (ImportException e) {\r\n            \/\/ G'catch! :p\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n\r\n        MeshView[] racketMesh = racketImporter.getImport();\r\n\r\n        racketImporter.close();\r\n\r\n        Group racketGroup = new Group();\r\n        for (MeshView _racketMesh : racketMesh) {\r\n            racketGroup.getChildren().addAll(_racketMesh);\r\n            _racketMesh.drawModeProperty().bind(new When(showWireframe).then(DrawMode.LINE).otherwise(DrawMode.FILL));\r\n        }\r\n\r\n        try {\r\n            URL objUrl = this.getClass().getResource(\"game_over\/game_over.obj\");\r\n            game_overImporter.read(objUrl);\r\n        } catch (ImportException e) {\r\n            \/\/ G'catch! :p\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n\r\n        MeshView[] game_overMesh = game_overImporter.getImport();\r\n\r\n        game_overImporter.close();\r\n\r\n        Group game_overGroup = new Group();\r\n        for (MeshView _game_overMesh : game_overMesh) {\r\n            game_overGroup.getChildren().addAll(_game_overMesh);\r\n            _game_overMesh.drawModeProperty().bind(new When(showWireframe).then(DrawMode.LINE).otherwise(DrawMode.FILL));\r\n        }\r\n\r\n        allGroup.getChildren().addAll(dukeGroup, boadGroup, backGroup, racketGroup, game_overGroup);\r\n\r\n        \/\/ Duke \u6b69\u884c\u30bf\u30fc\u30cb\u30f3\u30b0\u30dd\u30a4\u30f3\u30c8\r\n        \/\/ \u30aa\u30d5\u30bb\u30c3\u30c8\u30de\u30fc\u30b8\u30f3 \uff08\u9069\u5f53\u306b\u8a2d\u5b9a\uff09\r\n        int offsetMargin = (int) (dukeGroup.getLayoutBounds().getDepth() \/ 6);\r\n        \/\/ \u30bf\u30fc\u30cb\u30f3\u30b0\u30dd\u30a4\u30f3\u30c8 -Z\r\n        int bordTurnPoint = (int) (boadGroup.getLayoutBounds().getMinZ() - dukeGroup.getLayoutBounds().getMinZ());\r\n        \/\/ \u30bf\u30fc\u30cb\u30f3\u30b0\u30dd\u30a4\u30f3\u30c8 +Z\r\n        int bordEndPoint = (int) (boadGroup.getLayoutBounds().getMaxZ() - dukeGroup.getLayoutBounds().getDepth() \/ 2 - offsetMargin);\r\n\r\n        \/\/ \u30dc\u30fc\u30c9\u3092\u975e\u8868\u793a\r\n        boadGroup.setVisible(false);\r\n        \/\/ \u6587\u5b57\u3092\u975e\u8868\u793a\r\n        backGroup.setVisible(false);\r\n        \/\/ \u30e9\u30b1\u30c3\u30c8\u3092\u975e\u8868\u793a\r\n        racketGroup.setVisible(false);\r\n        \/\/ GAMEOVER \u975e\u8868\u793a\r\n        game_overGroup.setVisible(false);\r\n\r\n        \/\/ \u74b0\u5883\u5149\u8a2d\u5b9a\r\n        AmbientLight ambient = new AmbientLight();\r\n        ambient.setColor(Color.rgb(150, 150, 150, 0.6));\r\n        ambient.getScope().addAll(allGroup);\r\n\r\n        \/\/ \u30dd\u30a4\u30f3\u30c8\u30e9\u30a4\u30c8\u8a2d\u5b9a\r\n        PointLight point = new PointLight();\r\n        point.setColor(Color.rgb(255, 255, 255, 1.0));\r\n        point.setLayoutX(-700);\r\n        point.setLayoutY(-1_000);\r\n        point.setTranslateZ(-1_200);\r\n        point.getScope().addAll(allGroup);\r\n\r\n        subRoot.getChildren().addAll(allGroup, subCam, ambient, point);\r\n\r\n        \/\/ SubScene \u4f5c\u6210\r\n        SubScene subScene = new SubScene(subRoot, 1920, 860, true, SceneAntialiasing.BALANCED);\r\n        subScene.setFill(Color.ALICEBLUE);\r\n        subScene.setCamera(subCam);\r\n\r\n        root.getChildren().addAll(subScene);\r\n\r\n        \/\/ \u30de\u30a6\u30b9\u3067 allGroup \u64cd\u4f5c\u7528\r\n        Rotate xRotate;\r\n        Rotate yRotate;\r\n        allGroup.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        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        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        \/\/ \u30b5\u30d6\u30ab\u30e1\u30e9\u64cd\u4f5c\u7528\r\n        \/\/ \u79fb\u52d5\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        \/\/ \u62e1\u5927\u7e2e\u5c0f\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        \/\/ \u56de\u8ee2\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        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        \/\/ Duke \u30e2\u30c7\u30eb\u624b\u8db3\u52d5\u4f5c\u7528\r\n        Rotate r_legRotate;\r\n        Rotate l_legRotate;\r\n        Rotate r_armRotate;\r\n        Rotate l_armRotate;\r\n        dukeMesh[2].getTransforms().setAll(\r\n                r_legRotate = new Rotate(0, Rotate.X_AXIS));\r\n        dukeMesh[3].getTransforms().setAll(\r\n                l_legRotate = new Rotate(0, Rotate.X_AXIS));\r\n        dukeMesh[4].getTransforms().setAll(\r\n                r_armRotate = new Rotate(0, Rotate.Z_AXIS));\r\n        dukeMesh[5].getTransforms().setAll(\r\n                l_armRotate = new Rotate(0, Rotate.X_AXIS));\r\n        r_legRotate.angleProperty().bind(angleWalk_r_X);\r\n        l_legRotate.angleProperty().bind(angleWalk_l_X);\r\n        l_armRotate.angleProperty().bind(angleWalk_l_arm);\r\n        r_armRotate.angleProperty().bind(angleWalk_r_arm);\r\n\r\n        \/\/ Duke \u30bf\u30fc\u30f3\u7528\r\n        Rotate tyRotate;\r\n        Rotate txRotate;\r\n        dukeGroup.getTransforms().setAll(\r\n                tyRotate = new Rotate(0, Rotate.Y_AXIS),\r\n                txRotate = new Rotate(0, Rotate.X_AXIS)\r\n        );\r\n        tyRotate.angleProperty().bind(turnAngleY);\r\n        txRotate.angleProperty().bind(turnAngleX);\r\n\r\n        \/\/ GAMEOVER \u56de\u8ee2\u7528\r\n        Rotate gxRotate;\r\n        game_overGroup.getTransforms().setAll(\r\n                gxRotate = new Rotate(0, Rotate.X_AXIS));\r\n        gxRotate.angleProperty().bind(g_turnAngleX);\r\n\r\n        \/\/ \u8868\u793a\u30e2\u30fc\u30c9\r\n        meshCheckBox.selectedProperty().bindBidirectional(showWireframe);\r\n\r\n        \/\/ \u30e9\u30b1\u30c3\u30c8 \u30ad\u30fc\u64cd\u4f5c\r\n        root.setOnKeyPressed((KeyEvent key) -> {\r\n            if (key.getCode() == KeyCode.L) {\r\n                if (racketGroup.getBoundsInParent().getMaxX() < boadGroup.getBoundsInParent().getMaxX()) {\r\n                    racketGroup.setTranslateX(racketGroup.getTranslateX() + 15);\r\n                }\r\n            }\r\n            if (key.getCode() == KeyCode.J) {\r\n                if (racketGroup.getBoundsInParent().getMinX() > boadGroup.getBoundsInParent().getMinX()) {\r\n                    racketGroup.setTranslateX(racketGroup.getTranslateX() - 15);\r\n                }\r\n            }\r\n        });\r\n\r\n        \/\/ \u30ea\u30bb\u30c3\u30c8\r\n        resetBtn.setOnAction((ActionEvent event) -> {\r\n            \/\/ Icon \u5909\u66f4\r\n            Image myIcon = new Image(this.getClass().getResource(\"icon\/duke_3.png\").toString());\r\n            primaryStage.getIcons().add(myIcon);\r\n\r\n            \/\/ \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3001\u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\u306e\u304a\u307e\u3058\u306a\u3044\r\n            stopLine();\r\n            \/\/ Score \u30e9\u30d9\u30eb\u521d\u671f\u5316\r\n            scoreLabel.setText(\"   L Key < RIGHT >    J Key < LEFT >  Please enjoy!\");\r\n            \/\/ \u30dd\u30a4\u30f3\u30c8\u30e9\u30a4\u30c8\u4f4d\u7f6e\u521d\u671f\u5316\r\n            point.setTranslateZ(-1_200);\r\n            \/\/ \u30dc\u30fc\u30c9\u975e\u8868\u793a\r\n            boadGroup.setVisible(false);\r\n            \/\/ \u6587\u5b57\u3092\u975e\u8868\u793a\r\n            backGroup.setVisible(false);\r\n            \/\/ \u30e9\u30b1\u30c3\u30c8\u3092\u975e\u8868\u793a\r\n            racketGroup.setVisible(false);\r\n            \/\/ GAMEOVER \u975e\u8868\u793a\r\n            game_overGroup.setVisible(false);\r\n            \/\/ Duke \u306e\u4f4d\u7f6e\u3092\u521d\u671f\u5316\r\n            dukeGroup.setTranslateX(0);\r\n            dukeGroup.setTranslateZ(0);\r\n            \/\/ Duke \u306e\u5411\u304d\u3092\u521d\u671f\u5316\r\n            turnAngleY.set(0);\r\n            turnAngleX.set(0);\r\n            \/\/ \u30e9\u30b1\u30c3\u30c8\u306e\u521d\u671f\u5316\r\n            racketGroup.setTranslateX(0);\r\n            \/\/ GAMEOVER \u7528\u56de\u8ee2\u30a2\u30f3\u30b0\u30eb\u521d\u671f\u5316\r\n            g_turnAngleX.set(0);\r\n\r\n            \/\/ \u30b5\u30d6\u30ab\u30e1\u30e9\u4f4d\u7f6e\u521d\u671f\u5316\r\n            xPos.set(0);\r\n            yPos.set(0);\r\n            zPos.set(-1_000);\r\n\r\n            sxPos.set(1.0);\r\n            syPos.set(1.0);\r\n            szPos.set(1.0);\r\n\r\n            rxPos.set(0);\r\n            ryPos.set(0);\r\n            rzPos.set(0);\r\n\r\n            \/\/ Duke \u624b\u8db3\u306e\u521d\u671f\u5316\r\n            angleWalk_r_X.set(0);\r\n            angleWalk_l_X.set(0);\r\n            angleWalk_l_arm.set(0);\r\n            angleWalk_r_arm.set(0);\r\n\r\n            \/\/ allGroup \u521d\u671f\u5316\r\n            anchorAngleX = 0;\r\n            anchorAngleY = 0;\r\n            angleX.set(0);\r\n            angleY.set(0);\r\n        });\r\n\r\n        \/\/ Duke Walk \u958b\u59cb\r\n        walkBtn.setOnAction((ActionEvent event) -> {\r\n            \/\/ Icon \u5909\u66f4\r\n            Image myIcon = new Image(this.getClass().getResource(\"icon\/duke_1.png\").toString());\r\n            primaryStage.getIcons().add(myIcon);\r\n\r\n            \/\/ \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3001\u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\u306e\u304a\u307e\u3058\u306a\u3044\r\n            stopLine();\r\n\r\n            \/\/ \u97f3\u697d\u518d\u751f\u3001\u30b9\u30da\u30af\u30c8\u30e9\u30e0\u30ea\u30b9\u30ca\u30fc\u5b9f\u88c5\r\n            dance();\r\n\r\n            \/\/ Score \u30e9\u30d9\u30eb\u521d\u671f\u5316\r\n            scoreLabel.setText(\"   L Key < RIGHT >    J Key < LEFT >  Please enjoy!\");\r\n            \/\/ \u30dd\u30a4\u30f3\u30c8\u30e9\u30a4\u30c8\u4f4d\u7f6e\u5909\u66f4\r\n            point.setTranslateZ(-2_500);\r\n            \/\/ \u30dc\u30fc\u30c9\u3092\u8868\u793a\r\n            boadGroup.setVisible(true);\r\n            \/\/ \u6587\u5b57\u3092\u8868\u793a\r\n            backGroup.setVisible(true);\r\n            \/\/ \u30e9\u30b1\u30c3\u30c8\u3092\u975e\u8868\u793a\r\n            racketGroup.setVisible(false);\r\n            \/\/ GAMEOVER \u975e\u8868\u793a\r\n            game_overGroup.setVisible(false);\r\n            \/\/ Duke \u306e\u4f4d\u7f6e\u3092\u521d\u671f\u5316\r\n            dukeGroup.setTranslateX(0);\r\n            dukeGroup.setTranslateZ(0);\r\n            \/\/ Duke \u306e\u5411\u304d\u3092\u521d\u671f\u5316\r\n            turnAngleY.set(0);\r\n            turnAngleX.set(0);\r\n            \/\/ \u30e9\u30b1\u30c3\u30c8\u306e\u521d\u671f\u5316\r\n            racketGroup.setTranslateX(0);\r\n            \/\/ GAMEOVER \u7528\u56de\u8ee2\u30a2\u30f3\u30b0\u30eb\u521d\u671f\u5316\r\n            g_turnAngleX.set(0);\r\n\r\n            \/\/ \u8a2d\u5b9a\u521d\u671f\u5316\r\n            azimuth = 0;\r\n            previousHandledTime = 0L;\r\n\r\n            \/\/ allGroup \u521d\u671f\u5316\r\n            anchorAngleX = 0;\r\n            anchorAngleY = 0;\r\n            angleX.set(0);\r\n            angleY.set(0);\r\n\r\n            \/\/ Duke \u624b\u8db3\u306e\u521d\u671f\u5316\r\n            angleWalk_r_X.set(0);\r\n            angleWalk_l_X.set(0);\r\n            angleWalk_l_arm.set(0);\r\n            angleWalk_r_arm.set(0);\r\n\r\n            \/\/ \u30b5\u30d6\u30ab\u30e1\u30e9\u4f4d\u7f6e\u521d\u671f\u5316\r\n            xPos.set(0);\r\n            yPos.set(0);\r\n            zPos.set(-1_200);\r\n\r\n            sxPos.set(1.0);\r\n            syPos.set(1.0);\r\n            szPos.set(1.0);\r\n\r\n            rxPos.set(0);\r\n            ryPos.set(0);\r\n            rzPos.set(0);\r\n\r\n            \/\/ \u6b69\u884c\u30e2\u30fc\u30b7\u30e7\u30f3\r\n            walkMotion();\r\n\r\n            \/\/ \u6b69\u884c\r\n            walkTimer = new AnimationTimer() {\r\n                @Override\r\n                public void handle(long now) {\r\n                    update(now);\r\n                }\r\n\r\n                private void update(long now) {\r\n                    if (previousHandledTime == 0) {\r\n                        previousHandledTime = now;\r\n                        return;\r\n                    }\r\n                    \/\/ \u30b5\u30d6\u30ab\u30e1\u30e9\u3092\u534a\u5f84 SUBCAMERA_RADIUS \u306e\u5186\u306e\u4e2d\u5fc3\u3080\u3051\u3066\u56de\u8ee2\u64ae\u5f71\u3059\u308b\u3002\r\n                    azimuth += azimuthRateProperty.get() * (now - previousHandledTime) \/ 1_000_000_000;\r\n                    previousHandledTime = now;\r\n                    xPos.set(Math.sin(Math.toRadians(azimuth)) * SUBCAMERA_RADIUS);\r\n                    zPos.set(-1 * Math.cos(Math.toRadians(azimuth)) * SUBCAMERA_RADIUS);\r\n                    yPos.set(-1 * Math.sin(Math.toRadians(elevationProperty.getValue())) * SUBCAMERA_RADIUS);\r\n                    ryPos.set(-1 * azimuth);\r\n\r\n                    \/\/ \u6b69\u884c\u5236\u5fa1\r\n                    if (dukeGroup.getTranslateZ() > bordTurnPoint && turnAngleY.get() == 0) {\r\n                        dukeGroup.setTranslateZ(dukeGroup.getTranslateZ() + -5);\r\n                        if (dukeGroup.getTranslateZ() < bordTurnPoint + 1) {\r\n                            rightTurn();\r\n                        }\r\n                    }\r\n\r\n                    \/\/ \u6b69\u884c\u5236\u5fa1\r\n                    if (dukeGroup.getTranslateZ() < bordEndPoint &#038;&#038; turnAngleY.get() == 180) {\r\n                        dukeGroup.setTranslateZ(dukeGroup.getTranslateZ() + 5);\r\n                        if (dukeGroup.getTranslateZ() > bordEndPoint - 1) {\r\n                            leftTurn();\r\n                        }\r\n                    }\r\n\r\n                }\r\n\r\n                \/\/ \u6b69\u884c\u53f3\u53cd\u8ee2\u51e6\u7406\r\n                private void rightTurn() {\r\n                    rightTurn = new Timeline(\r\n                            new KeyFrame(\r\n                                    new Duration(700),\r\n                                    new KeyValue(turnAngleY, 180, Interpolator.EASE_BOTH)\r\n                            ));\r\n                    rightTurn.play();\r\n                }\r\n\r\n                \/\/ \u6b69\u884c\u5de6\u53cd\u8ee2\u51e6\u7406\r\n                private void leftTurn() {\r\n                    leftTurn = new Timeline(\r\n                            new KeyFrame(\r\n                                    new Duration(700),\r\n                                    new KeyValue(turnAngleY, 0, Interpolator.EASE_BOTH)\r\n                            ));\r\n                    leftTurn.play();\r\n                }\r\n\r\n            };\r\n            walkTimer.start();\r\n        });\r\n\r\n        \/\/ \u6b69\u884c\u30b9\u30c8\u30c3\u30d7\r\n        stopBtn.setOnAction((ActionEvent event) -> {\r\n            \/\/ Icon \u5909\u66f4\r\n            Image myIcon = new Image(this.getClass().getResource(\"icon\/duke_2.png\").toString());\r\n            primaryStage.getIcons().add(myIcon);\r\n\r\n            \/\/ \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3001\u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\u306e\u304a\u307e\u3058\u306a\u3044\r\n            stopLine();\r\n        });\r\n\r\n        \/\/ Game \u958b\u59cb\r\n        gameBtn.setOnAction((ActionEvent event) -> {\r\n\r\n            \/\/ Icon \u5909\u66f4\r\n            Image myIcon = new Image(this.getClass().getResource(\"icon\/duke_g.png\").toString());\r\n            primaryStage.getIcons().add(myIcon);\r\n\r\n            \/\/ \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3001\u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\u306e\u304a\u307e\u3058\u306a\u3044\r\n            stopLine();\r\n\r\n            \/\/ \u97f3\u697d\u518d\u751f\u3001\u30b9\u30da\u30af\u30c8\u30e9\u30e0\u30ea\u30b9\u30ca\u30fc\u5b9f\u88c5\r\n            dance();\r\n\r\n            \/\/ Score \u30e9\u30d9\u30eb\u8a2d\u5b9a\r\n            scoreLabel.setText(\"Your Score: \" + score);\r\n            \/\/ \u30dd\u30a4\u30f3\u30c8\u30e9\u30a4\u30c8\u4f4d\u7f6e\u5909\u66f4\r\n            point.setTranslateZ(-2_500);\r\n            \/\/ \u6b69\u884c\u30d9\u30af\u30c8\u30eb\u8a2d\u5b9a\r\n            d_vx = -5.0;\r\n            d_vz = -6.0;\r\n            \/\/ \u30dc\u30fc\u30c9\u3092\u8868\u793a\r\n            boadGroup.setVisible(true);\r\n            \/\/ \u6587\u5b57\u3092\u8868\u793a\r\n            backGroup.setVisible(true);\r\n            \/\/ \u30e9\u30b1\u30c3\u30c8\u3092\u8868\u793a\r\n            racketGroup.setVisible(true);\r\n            \/\/ GAMEOVER \u975e\u8868\u793a\r\n            game_overGroup.setVisible(false);\r\n            \/\/ Duke \u306e\u4f4d\u7f6e\u3092\u521d\u671f\u5316\r\n            dukeGroup.setTranslateX(0);\r\n            Random r = new Random();\r\n            dukeGroup.setTranslateZ(-r.nextInt(700));\r\n            \/\/ Duke \u306e\u5411\u304d\u3092\u521d\u671f\u5316\r\n            turnAngleY.set(0);\r\n            turnAngleX.set(0);\r\n            \/\/ \u30e9\u30b1\u30c3\u30c8\u306e\u521d\u671f\u5316\r\n            racketGroup.setTranslateX(0);\r\n            \/\/ GAMEOVER \u7528\u56de\u8ee2\u30a2\u30f3\u30b0\u30eb\u521d\u671f\u5316\r\n            g_turnAngleX.set(0);\r\n\r\n            \/\/ \u8a2d\u5b9a\u521d\u671f\u5316\r\n            azimuth = 0;\r\n            previousHandledTime = 0L;\r\n\r\n            \/\/ allGroup \u521d\u671f\u5316\r\n            anchorAngleX = 0;\r\n            anchorAngleY = 0;\r\n            angleX.set(0);\r\n            angleY.set(0);\r\n\r\n            \/\/ Duke \u624b\u8db3\u306e\u521d\u671f\u5316\r\n            angleWalk_r_X.set(0);\r\n            angleWalk_l_X.set(0);\r\n            angleWalk_l_arm.set(0);\r\n            angleWalk_r_arm.set(0);\r\n\r\n            \/\/ \u30b5\u30d6\u30ab\u30e1\u30e9\u4f4d\u7f6e\u521d\u671f\u5316\r\n            xPos.set(0);\r\n            yPos.set(0);\r\n            zPos.set(-1_200);\r\n\r\n            sxPos.set(1.0);\r\n            syPos.set(1.0);\r\n            szPos.set(1.0);\r\n\r\n            rxPos.set(0);\r\n            ryPos.set(0);\r\n            rzPos.set(0);\r\n\r\n            \/\/ \u30b5\u30d6\u30ab\u30e1\u30e9\u4f4d\u7f6e\u8a2d\u5b9a\r\n            zPos.set(-1 * Math.cos(Math.toRadians(azimuth)) * SUBCAMERA_RADIUS);\r\n            yPos.set(-1 * Math.sin(Math.toRadians(elevationProperty.getValue())) * SUBCAMERA_RADIUS);\r\n            ryPos.set(-1 * azimuth);\r\n\r\n            \/\/ \u30dc\u30fc\u30c9\u306e\u5927\u304d\u3055\r\n            double bord_left = boadGroup.getLayoutBounds().getMinX();\r\n            double bord_right = boadGroup.getLayoutBounds().getMaxX();\r\n            double bord_front = boadGroup.getLayoutBounds().getMinZ();\r\n            double bord_back = boadGroup.getLayoutBounds().getMaxZ();\r\n\r\n            \/\/ Duke Turn \u30a2\u30f3\u30b0\u30eb\r\n            turnAngleY.set(Math.toDegrees(Math.atan(d_vz \/ d_vx)));\r\n\r\n            \/\/ \u6b69\u884c\u30e2\u30fc\u30b7\u30e7\u30f3\r\n            walkMotion();\r\n\r\n            \/\/ Score \u5c02\u7528\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\r\n            scoreTimeline = new Timeline(\r\n                    new KeyFrame(\r\n                            new Duration(1_000), (ActionEvent e) -> {\r\n                                if (score < Integer.MAX_VALUE) {\r\n                                    score++;\r\n                                    scoreLabel.setText(\"Your Score: \" + score);\r\n                                } else {\r\n                                    scoreLabel.setText(\"\u305d\u308d\u305d\u308d\u7d42\u308f\u308a\u306b\u3057\u305f\u3089\uff1f\");\r\n                                    score = Integer.MAX_VALUE - 1;\r\n                                }\r\n                            }));\r\n            scoreTimeline.setCycleCount(Timeline.INDEFINITE);\r\n            scoreTimeline.play();\r\n\r\n            \/\/ \u6b69\u884c\r\n            walkTimer_g = new AnimationTimer() {\r\n\r\n                @Override\r\n                public void handle(long now) {\r\n                    update(now);\r\n                }\r\n\r\n                private void update(long now) {\r\n                    if (previousHandledTime == 0) {\r\n                        previousHandledTime = now;\r\n                        return;\r\n                    }\r\n\r\n                    \/\/ Duke \u79fb\u52d5\r\n                    dukeGroup.setTranslateX(dukeGroup.getTranslateX() + d_vx);\r\n                    dukeGroup.setTranslateZ(dukeGroup.getTranslateZ() + d_vz);\r\n\r\n                    \/\/ \u5de6\u307e\u305f\u306f\u53f3\u306b\u5f53\u305f\u3063\u305f\u3089x\u65b9\u5411\u901f\u5ea6\u306e\u7b26\u53f7\u3092\u53cd\u8ee2\u3055\u305b\u308b\r\n                    if (dukeGroup.getBoundsInParent().getMinX() < bord_left || dukeGroup.getBoundsInParent().getMaxX() > bord_right) {\r\n                        d_vx = -d_vx;\r\n                        turn();\r\n                    }\r\n\r\n                    \/\/ \u30e9\u30b1\u30c3\u30c8\u306b\u5f53\u305f\u3063\u305f\u3089y\u65b9\u5411\u901f\u5ea6\u306e\u7b26\u53f7\u3092\u53cd\u8ee2\u3055\u305b\u308b\r\n                    if (dukeGroup.getBoundsInParent().getMinZ() < bord_front) {\r\n                        if (dukeGroup.getBoundsInParent().getMaxX() > racketGroup.getBoundsInParent().getMinX() && dukeGroup.getBoundsInParent().getMinX() < racketGroup.getBoundsInParent().getMaxX()) {\r\n                            d_vz = -d_vz;\r\n                            turn();\r\n                        } else {\r\n                            gameOver();\r\n                        }\r\n                    }\r\n\r\n                    \/\/ \u5965\u306b\u5f53\u305f\u3063\u305f\u3089y\u65b9\u5411\u901f\u5ea6\u306e\u7b26\u53f7\u3092\u53cd\u8ee2\u3055\u305b\u308b\r\n                    if (dukeGroup.getBoundsInParent().getMaxZ() > bord_back) {\r\n                        d_vz = -d_vz;\r\n                        turn();\r\n                    }\r\n                }\r\n\r\n                \/\/ \u30bf\u30fc\u30f3\u30e2\u30fc\u30b7\u30e7\u30f3\r\n                private void turn() {\r\n                    double h = 0;\r\n                    if (d_vz > 0) {\r\n                        h = -180;\r\n                    }\r\n\r\n                    turn_g = new Timeline(\r\n                            new KeyFrame(\r\n                                    new Duration(250),\r\n                                    new KeyValue(turnAngleY, h + Math.toDegrees(Math.atan(d_vz \/ d_vx)), Interpolator.EASE_BOTH)\r\n                            ));\r\n                    turn_g.play();\r\n                }\r\n\r\n                \/\/ \u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc\r\n                private void gameOver() {\r\n                    if (scoreTimeline != null) {\r\n                        scoreTimeline.stop();\r\n                    }\r\n                    if (walkTimer_g != null) {\r\n                        walkTimer_g.stop();\r\n                    }\r\n                    if (turn_g != null) {\r\n                        turn_g.stop();\r\n                    }\r\n                    \/\/ \u8ee2\u5012\u4f4d\u7f6e\u8abf\u6574\r\n                    dukeGroup.setTranslateZ(dukeGroup.getBoundsInParent().getMinZ() - 100);\r\n                    fall = new Timeline(\r\n                            new KeyFrame(\r\n                                    new Duration(350),\r\n                                    new KeyValue(turnAngleX, 140, Interpolator.EASE_BOTH)),\r\n                            new KeyFrame(new Duration(1_000),\r\n                                    new KeyValue(game_overGroup.visibleProperty(), true, Interpolator.EASE_BOTH)),\r\n                            new KeyFrame(new Duration(2_000),\r\n                                    new KeyValue(g_turnAngleX, 360, Interpolator.EASE_BOTH)\r\n                            ));\r\n                    fall.play();\r\n\r\n                    \/\/ \u97f3\u697d\u505c\u6b62\r\n                    if (mp_bgm != null) {\r\n                        mp_bgm.stop();\r\n                    }\r\n\r\n                    \/\/ \u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc\u7528\u97f3\u697d\r\n                    mp_o = new MediaPlayer(o_mp);\r\n                    mp_o.play();\r\n                    if (dukeAnim != null) {\r\n                        dukeAnim.stop();\r\n                    }\r\n                }\r\n            };\r\n            walkTimer_g.start();\r\n        });\r\n\r\n        \/\/ Icon \u8a2d\u5b9a\r\n        Image myIcon = new Image(this.getClass().getResource(\"icon\/cludia_icon.png\").toString());\r\n        primaryStage.getIcons().add(myIcon);\r\n\r\n        primaryStage.setTitle(\"Duke Walk +\");\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    \/\/ \u30d0\u30c3\u30af\u306e\u6587\u5b57\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\r\n    @Override\r\n    public void spectrumDataUpdate(double timestamp, double duration, float[] magnitudes, float[] phases) {\r\n        IntStream.range(0, magnitudes.length).forEach(i -> {\r\n            backMesh[i].setScaleX((magnitudes[i] + 60.01) * 0.1 + 1.0);\r\n            backMesh[i].setScaleY((magnitudes[i] + 60.01) * 0.1 + 1.0);\r\n            backMesh[i].setScaleZ((magnitudes[i] + 60.01) * 0.1 + 1.0);\r\n        });\r\n    }\r\n\r\n    \/\/ \u3044\u308d\u3044\u308d\u505c\u6b62\r\n    private void stopLine() {\r\n        if (mp_bgm != null) {\r\n            mp_bgm.stop();\r\n        }\r\n        if (mp_o != null) {\r\n            mp_o.stop();\r\n        }\r\n        if (walkTimer != null) {\r\n            walkTimer.stop();\r\n        }\r\n        if (dukeAnim != null) {\r\n            dukeAnim.stop();\r\n        }\r\n        if (leftTurn != null) {\r\n            leftTurn.stop();\r\n        }\r\n        if (rightTurn != null) {\r\n            rightTurn.stop();\r\n        }\r\n        if (walkTimer_g != null) {\r\n            walkTimer_g.stop();\r\n        }\r\n        if (turn_g != null) {\r\n            turn_g.stop();\r\n        }\r\n        if (fall != null) {\r\n            fall.stop();\r\n        }\r\n        if (scoreTimeline != null) {\r\n            scoreTimeline.stop();\r\n        }\r\n    }\r\n\r\n    \/\/ \u97f3\u697d\u518d\u751f\u3001\u30b9\u30da\u30af\u30c8\u30e9\u30e0\u30ea\u30b9\u30ca\u30fc\u5b9f\u88c5\r\n    private void dance() {\r\n        audioSpectrumListener = this;\r\n        mp_bgm = new MediaPlayer(bgm);\r\n        mp_bgm.setAudioSpectrumListener(audioSpectrumListener);\r\n        mp_bgm.setAudioSpectrumInterval(0.01);\r\n        mp_bgm.setAudioSpectrumNumBands(8);\r\n        mp_bgm.setVolume(0.9);\r\n        mp_bgm.setAutoPlay(true);\r\n        mp_bgm.setCycleCount(MediaPlayer.INDEFINITE);\r\n    }\r\n\r\n    \/\/ \u6b69\u884c\u30e2\u30fc\u30b7\u30e7\u30f3\r\n    private void walkMotion() {\r\n        dukeAnim = new Timeline(\r\n                new KeyFrame(\r\n                        new Duration(300),\r\n                        new KeyValue(angleWalk_r_X, -25),\r\n                        new KeyValue(angleWalk_l_X, 25),\r\n                        new KeyValue(angleWalk_l_arm, -20),\r\n                        new KeyValue(angleWalk_r_arm, 12, Interpolator.EASE_BOTH)\r\n                ),\r\n                new KeyFrame(\r\n                        new Duration(600),\r\n                        new KeyValue(angleWalk_r_X, 0),\r\n                        new KeyValue(angleWalk_l_X, 0),\r\n                        new KeyValue(angleWalk_l_arm, 0),\r\n                        new KeyValue(angleWalk_r_arm, 0, Interpolator.EASE_BOTH)\r\n                ),\r\n                new KeyFrame(\r\n                        new Duration(900),\r\n                        new KeyValue(angleWalk_r_X, 25),\r\n                        new KeyValue(angleWalk_l_X, -25),\r\n                        new KeyValue(angleWalk_l_arm, 20),\r\n                        new KeyValue(angleWalk_r_arm, 12, Interpolator.EASE_BOTH)\r\n                ),\r\n                new KeyFrame(\r\n                        new Duration(1_200),\r\n                        new KeyValue(angleWalk_r_X, 0),\r\n                        new KeyValue(angleWalk_l_X, 0),\r\n                        new KeyValue(angleWalk_l_arm, 0),\r\n                        new KeyValue(angleWalk_r_arm, 0, Interpolator.EASE_BOTH)\r\n                )\r\n        );\r\n        dukeAnim.setCycleCount(Timeline.INDEFINITE);\r\n        dukeAnim.play();\r\n    }\r\n}\r\n\r\n<\/pre>\n<\/p>\n<p>3DViewer \u304c\u52d5\u304d\u3001\u30dc\u30fc\u30f3\u306e\u57cb\u3081\u8fbc\u307e\u308c\u305f\u30e2\u30c7\u30eb\u304c\u81ea\u7531\u81ea\u5728\u306b\u306a\u3081\u3089\u304b\u306b\u52d5\u304b\u305b\u308b\u6642\u4ee3\u304c\u6765\u308c\u3070\u3053\u3093\u306a\u3053\u3068\u306f\u5fc5\u8981\u306a\u304f\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u306d\u3002<\/p>\n<p>JavaOne \u306e Duke \u304c\u3069\u306e\u3088\u3046\u306b\u4f5c\u3089\u308c\u305f\u306e\u304b\uff1f<\/p>\n<p>\u4e00\u822c\u306e\u958b\u767a\u8005\u306b\u3082\u7c21\u5358\u306b\u3067\u304d\u308b\u3053\u3068\u306a\u306e\u304b\uff1f<\/p>\n<p>\u3044\u308d\u3044\u308d\u8b0e\u306f\u3042\u308b\u3051\u3069\u5f85\u3063\u3066\u3044\u308b\u3060\u3051\u3067\u306f\u9762\u767d\u304f\u306a\u3044\u3088\u306d\u3002<\/p>\n<p>\u3061\u3087\u3063\u3068\u53e4\u3044\u3051\u3069\u3000\u300c\u3044\u3064\u3084\u308b\u306e\uff1f\u300d\u3000\u300c\u4eca\u3067\u3057\u3087\uff01\u300d<\/p>\n<p>\u6700\u5f8c\u306b\u4e00\u8a00<\/p>\n<p><font color=\"#ff0000\" size=\"5\"><strong>JavaFX \u697d\u3057\u3044\uff01\u3000(^_^)<\/strong><\/font><\/p>\n<div id=\"scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b192a1cf-0204-464c-a53f-44f9ed9fb35d\" 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%3D1384&title=JavaFX%203D%20%E5%AD%A6%E7%BF%92%E3%81%A4%E3%81%84%E3%81%A7%E3%81%AB%E5%89%B5%E3%81%A3%E3%81%9F%203D%20%E3%82%B2%E3%83%BC%E3%83%A0' 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%3D1384&t=JavaFX%203D%20%E5%AD%A6%E7%BF%92%E3%81%A4%E3%81%84%E3%81%A7%E3%81%AB%E5%89%B5%E3%81%A3%E3%81%9F%203D%20%E3%82%B2%E3%83%BC%E3%83%A0' 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=1384\" ><\/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=1384\" data-text=\"JavaFX 3D \u5b66\u7fd2\u3064\u3044\u3067\u306b\u5275\u3063\u305f 3D \u30b2\u30fc\u30e0\" data-lang=\"ja\">Tweet<\/a><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u306f\u3001JavaFX Advent Calendar 2013, 10\u65e5\u76ee\u3067\u3059\u3002 \u6628\u65e5\u306f @sk44 \u3055\u3093\u306e JavaFX \u3067\u30da\u30fc\u30b8\u3081\u304f\u308a\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u7684\u306a\u306a\u306b\u304b \u3067\u3057\u305f\u3002 \u660e\u65e5\u306f @kis \u3055\u3093\u3067\u3059\u3002 \u4eca\u65e5\u306f\u79c1\u304c\u6700\u8fd1\u30b0\u30ea\u30b0\u30ea\u3057\u3066\u3044\u308b JavaFX 3D \u306b\u3064\u3044\u3066\u65ad\u7247\u7684\u3067\u306f\u3042\u308a\u307e\u3059\u304c\u30cd\u30c3\u30c8\u4e0a\u3067\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u56f0\u96e3\u306a\u3053\u3068\u306b\u3064\u3044\u3066\u66f8\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002 \u3068\u8a00\u3063\u3066\u3082\u79c1\u306f\u7d20\u4eba\u3067\u672c\u6765\u3053\u306e\u3088\u3046\u306a\u30a4\u30d9\u30f3\u30c8\u3067\u71b1\u304f\u8a9e\u308b\u3088\u3046\u306a\u30b9\u30ad\u30eb\u306f\u6301\u3061\u5408\u308f\u305b\u3066\u3044\u307e\u305b\u3093\u3002 \u3088\u3063\u3066\u304a\u304b\u3057\u306a\u3053\u3068\u3084\u9593\u9055\u3063\u305f\u3053\u3068\u3092\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u306f\u6975\u3081\u3066\u5927\u304d\u3044\u306e\u3067\u30b3\u30e1\u30f3\u30c8\u3067\u3054\u6307\u6458\u3044\u305f\u3060\u3051\u308b\u3068\u5e78\u3044\u3067\u3059\u3002 \u305d\u3046\u3044\u3046\u3053\u3068\u3067\u672c\u6765\u30013D \u306e\u57fa\u790e\u3067\u3042\u308b\u30ab\u30e1\u30e9\u3001\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-1384","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\/1384","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=1384"}],"version-history":[{"count":6,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1384\/revisions"}],"predecessor-version":[{"id":1390,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1384\/revisions\/1390"}],"wp:attachment":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1384"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}