Advertisement

More Related Content

Advertisement

Recently uploaded(20)

javafx-mini4wd

  1. Javaプログラマのための ミニ四駆再入門 #yonayonajavafx @kiy0taka
  2. 告知
  3. 富士通乾電池提供 ミニ四駆ジャパンカップ2014 • 10/5(日) 大阪大会2 • 京セラドーム大阪・9Fスカイホール • たぶん8:00から受付開始
  4. 自己紹介 •奥 清隆(おく きよたか) • id:kiy0taka、@kiy0taka •JGGUG関西支部 •関西Javaエンジニアの会 •株式会社ニューキャスト所属
  5. Mr. Java Day Tokyo
  6. ミニ四駆の話をと言われて https://twitter.com/skrb/status/484356816084926465
  7. 富士通乾電池提供 ミニ四駆ジャパンカップ 2014
  8. ジャパンカップ • 2012年にミニ四駆30周年を記念して復活! • 第三次ブームのきっかけになった • 昨年の動員数は2万人。 • 全盛期1996年は30万人超 • 安定の富士通乾電池提供
  9. • 6月22日(日) 東京大会1 品川シーサイドフォレスト・オーバルガーデン(東京都品川区) • 6月29日(日) 大阪大会1 京セラドーム大阪・9Fスカイホール(大阪市西区) • 7月 6日(日) 愛知大会 愛・地球博記念公園 地球市民交流センター(愛知県長久手市) • 7月13日(日) 群馬大会 ニューサンピア高崎・多目的ホール(群馬県高崎市) • 7月20日(日) 静岡大会 ツインメッセ静岡(静岡県静岡市) • 8月 3日(日) 愛媛大会 今治港特設会場(愛媛県今治市) • 8月17日(日) 仙台大会 サンフェスタ・1Fイベントホール(仙台市若林区) • 8月24日(日) 東京大会2 品川シーサイドフォレスト・オーバルガーデン(東京都品川区) • 9月 7日(日) 広島大会 広島マリーナホップ(広島市西区) • 9月14日(日) 北海道大会 新千歳空港 イベントホール翔(北海道千歳市) • 9月21日(日) 福岡大会 かしいかえん シルバニアガーデン 大テント(福岡市東区) • 9月28日(日) 東京大会3 東京ビッグサイト(東京都江東区) • 10月5日(日) 大阪大会2 京セラドーム大阪・9Fスカイホール(大阪市西区) • 10月12日(日) 岡山大会 岡山おもちゃ王国(岡山県玉野市) • 10月19日(日) 東京大会4・チャンピオン決定戦 MEGA WEB(東京都江東区)
  10. 参加方法 • 昔のように事前抽選はない • 当日参加 • でも遅くなると参加できない • 通称:0次予選
  11. クラス • ジュニアクラス(中学生以下) • オープンクラス(誰でも) • チャンピオンズ(公式大会優勝者) • ファミリークラス(小学校3年生まで、または共 同製作した中学3年生までの親子) • ファミリークラスは1次予選のみ
  12. シード代表決定戦 • 全国各地のミニ四駆ステーションで行われる大 会で優勝すると2次予選から参加できる • お近くのミニ四駆ステーションへ • http://www.tamiya.com/japan/mini4wd/ station_race/jcup2014_0603.pdf
  13. ミニ四駆を始めるため に必要な物
  14. はじめるために必要な物 • ミニ四駆 • パーツ • 工具 • コース • 友達
  15. シャーシ • http://www.tamiya.com/japan/cms/ newstopics/2276-mini4chassis.html • 14種類? • タイプ1∼3シャーシは手に入らない • とりあえずMAシャーシから始めればいいと思う
  16. モーター • http://www.tamiya.com/japan/download/ pdf/mini4wd/parts/mini4wd_motor.pdf • たくさんある • ハイパーミニ/ハイパーダッシュなんてもうない • MA/MSシャーシは両軸モーターなので間違えな いように
  17. パーツ • ありすぎる • とりあえずモーター全種類買っとけ • あとファーストトライパーツセットとか
  18. ステー/プレート • 強度を上げたり、ローラーベースを広げたりする • 加工して自作パーツを作る
  19. ブレーキ • レーンチェンジャーやドラゴンバックでコースア ウトしないように減速させる • 最近のモーター/コースでは必須アイテム
  20. ダンパー • ジャンプして着地後に衝撃を吸収させる • ショック吸収タイヤなんて今や夢パーツ扱い
  21. その他のパーツ • パーツについてはきりがないのであとはググれ • ネットで買うならヨドバシ.comが最強 • パーツ1つでも送料無料で翌日配達
  22. 工具 • ドライバー • ボックスドライバー • ニッパー • ペンチ • ヤスリ • ピンセット • デザインカッター • ノギス • ホビールーター
  23. コース • JCJC (安いとこで14Kぐらい) • オーバルホームサーキット (8Kぐらい) • もしくは近くのミニ四駆ステーションへ • レンタルできるが送料考えると割に合わない
  24. #ミニ四駆を走らせたい お客様の中に、会社にコースあるって方はいませんか?
  25. おまけ
  26. JavaFX 3DとJBulletで 物理演算の話 ∼ミニ四駆シミュレータを作りたい∼
  27. ミニ四駆シミュレータ https://www.youtube.com/watch?v=Ag16KQ7YrSg
  28. JavaFX 3D • javafx.scene.shape.Shape3D • Box/Cylinder/Sphere/MeshView
  29. 物理演算エンジン 物理演算エンジン(ぶつりえんざんエンジン、Physics engine)とは、質量・速度・摩擦・風といった、古典力 学的な法則をシミュレーションするコンピュータのソフ トウェアである。多くの場合、ミドルウェアライブラリ を指す。 略して物理演算、物理エンジン、Physicsとも 言う。 http://ja.wikipedia.org/wiki/物理演算エンジン
  30. http://www.nicovideo.jp/tag/物理演算
  31. JBullet • Bullet Physics Library (http://bulletphysics.org/ wordpress/) のJava版 • 本家の最新版は2.83、バージョン3系が開発中らしい • JBulletは本家の2.72がベース • 開発は2010年で止まってるっぽい
  32. ざっくりとした使い方 • DynamicsWorldを作る • 物体をDynamicsWorldに入れる • DynamicsWorldにシミュレートさせる • 描画するのはBulletの仕事ではないので自前で用 意する → JavaFX 3D
  33. JBulletでHelloWorld
  34. HelloWorld.java • JBulletのサンプルについてる • 球体が自由落下して地面に跳ね返る • 画面はないので球体の座標が標準出力に出るだけ
  35. DynamicsWorld // おまじない! CollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration(); CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration);! // 物理世界の大きさ! Vector3f worldAabbMin = new Vector3f(-10000, -10000, -10000);! Vector3f worldAabbMax = new Vector3f(10000, 10000, 10000);! // 物理世界に存在できる物体の数! int maxProxies = 1024;! AxisSweep3 overlappingPairCache = new AxisSweep3(worldAabbMin, worldAabbMax, maxProxies);! // ソルバーなにそれおいしいの! SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver();! // 物理世界! DiscreteDynamicsWorld dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);! // 重力! dynamicsWorld.setGravity(new Vector3f(0, -9.8, 0));
  36. 地面を作る // 地面の形状(Box)! CollisionShape groundShape = new BoxShape(new Vector3f(50.f, 50.f, 50.f));! ! // 地面の位置! Transform groundTransform = new Transform();! groundTransform.setIdentity();! groundTransform.origin.set(new Vector3f(0.f, -56.f, 0.f));! ! // モーションステート(これ重要)! DefaultMotionState myMotionState = new DefaultMotionState(groundTransform);! ! // 質量(単位はKg、0にすると無限大)! float mass = 0f;! // 地面の物理的なあれ! RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, groundShape, localInertia);! RigidBody body = new RigidBody(rbInfo);! ! // 力学世界につっこむ! dynamicsWorld.addRigidBody(body);
  37. 球体を作る // 球体! CollisionShape colShape = new SphereShape(1.f);! collisionShapes.add(colShape);! ! Transform startTransform = new Transform();! startTransform.setIdentity();! ! // 質量1kg! float mass = 1f;! ! // 初期位置設定! startTransform.origin.set(new Vector3f(2, 10, 0));! ! DefaultMotionState myMotionState = new DefaultMotionState(startTransform);! ! RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia);! RigidBody body = new RigidBody(rbInfo);! ! dynamicsWorld.addRigidBody(body);
  38. シミュレートする for (int i=0; i<100; i++) {! dynamicsWorld.stepSimulation(1.f / 60.f, 10);! ...! }!
  39. JBullet HelloWorld + JavaFX 3D
  40. JBullet + JavaFX 3D • 力学世界に入れてる物体をJavaFX 3Dで描画する • JBulletのCollisionShapeと同じ形状/位置/姿勢の ものをJavaFXのShape3Dで作る • シミュレートして、それぞれの物体の位置/姿勢を JavaFXのノードに適用する
  41. Node CollisionShape
  42. 地面を作る(JBullet) // 地面の形状(Box)! CollisionShape groundShape = new BoxShape(new Vector3f(50.f, 50.f, 50.f));! ! // 地面の位置! Transform groundTransform = new Transform();! groundTransform.setIdentity();! groundTransform.origin.set(new Vector3f(0.f, -56.f, 0.f));! ! // モーションステート(これ重要)! DefaultMotionState myMotionState = new DefaultMotionState(groundTransform);! ! // 質量(単位はKg、0にすると無限大)! float mass = 0f;! // 地面の物理的なあれ! RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, groundShape, localInertia);! RigidBody body = new RigidBody(rbInfo);! ! // 力学世界につっこむ! dynamicsWorld.addRigidBody(body);
  43. 地面を作る(JavaFX) // 地面の形状(Box)! Box groundNode = new Box(100, 100, 100);! ! // 地面の位置! boxNode.setTranslateX(0);! boxNode.setTranslateY(-56);! boxNode.setTranslateZ(0);
  44. JavaFXの座標について 3D を行うのに欠かせないのが、座標です。もちろん、JavaFX でも 3 次元の座標 を扱うのですが、ちょっとだけ注意が必要です。 というのも、通常の 3D の CG Tool は y 軸が数学と同じで上方向を向いています。 ところが、JavaFX では 2D と 3D を区別なく使えるように しているためなのか、y 軸が下を向いています。 ツールで作ったモデルをインポートしたら、なぜかモデルが下を向いていたという こともあるので、注意が必要です。 もし、下向きの y 軸がいやなのであれば、z 軸を中心にし て 180 度回転させます。 JavaFX 8 で 3D その 1 - JavaFX in the Box http://skrb.hatenablog.com/entry/2013/12/25/002250
  45. 座標 JavaFX JBullet x軸に180 回転してやる
  46. 地面を作る(JavaFX) // 親ノードをx軸に180°回転! Group root = new Group();! root.setRotationAxis(new Point3D(1, 0, 0));! root.setRotate(180);! ! root.getChildren().add(boxNode);
  47. Nodeの変換 JavaFX JBullet Box BoxShape Cylinder CylinderShape Sphere SphereShape MeshView BvhTriangleMeshShape Group CompoundShape
  48. MotionState
  49. 地面を作る(JBullet) // 地面の形状(Box)! CollisionShape groundShape = new BoxShape(new Vector3f(50.f, 50.f, 50.f));! ! // 地面の位置! Transform groundTransform = new Transform();! groundTransform.setIdentity();! groundTransform.origin.set(new Vector3f(0.f, -56.f, 0.f));! ! // モーションステート(これ重要)! DefaultMotionState myMotionState = new DefaultMotionState(groundTransform);! ! // 質量(単位はKg、0にすると無限大)! float mass = 0f;! // 地面の物理的なあれ! RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, groundShape, localInertia);! RigidBody body = new RigidBody(rbInfo);! ! // 力学世界につっこむ! dynamicsWorld.addRigidBody(body);
  50. MotionState • dynamicsWorld.stepSimulation()を実行すると それぞれの物体の位置とかを計算してくれる • シミュレートごとに各物体の計算結果が MotionStateのsetWorldTransform()で渡され る • DefaultMotionStateクラスを継承してJavaFX 用にあれしてやればいい
  51. JavaFXMotionState @Override! public void setWorldTransform(Transform centerOfMassWorldTrans) {! super.setWorldTransform(centerOfMassWorldTrans);! ! Quat4f rotation = new Quat4f();! centerOfMassWorldTrans.getRotation(rotation);! double rad = 2 * Math.acos(rotation.w);! ! Platform.runLater(() -> {! node.translateXProperty().set(centerOfMassWorldTrans.origin.x);! node.translateYProperty().set(centerOfMassWorldTrans.origin.y);! node.translateZProperty().set(centerOfMassWorldTrans.origin.z);! node.setRotate(rad * 180 / Math.PI);! node.setRotationAxis(new Point3D(! rotation.x / Math.sin(rad / 2),! rotation.y / Math.sin(rad / 2),! rotation.z / Math.sin(rad / 2)! ));! });! }
  52. その他 • 2つの剛体を結合する制約とか • ソフトボディとか • Vehicleとか • いろいろ調べないと分からない
  53. ライブラリ作成中 • JavaFXのノードを作って物理的なパラメータを 渡せばあれしてくれる • GroovyFX用のも作成中 • 公開は未定
  54. サンプル(Java) public class App extends JBulletApp {! ! @Override! protected void create3D() {! Box box = new Box(50, 50, 50);! box.setTranslateY(-25);! box.setScaleX(0.5);! add(box, new BulletOption().restitution(1.0f));! ! Sphere sphere = new Sphere(5);! sphere.setTranslateY(30);! add(sphere, new BulletOption().mass(10).restitution(0.1f));! }! ! ...! }!
  55. サンプル(GroovyFX) start {! stage(title: "Hello World", visible: true, primary: true) {! scene {! perspectiveCamera(true, nearClip:0, farClip:1000)! simulator {! box([50, 50, 50], translateY:-25, mass:0, restitution:1.0)! sphere(5, translateY:20, mass:10, restitution:0.1)! }! }! }! }
  56. まとめ • 大阪大会まで3ヶ月 • 参加される方は @kiy0taka までご連絡を • あと会社にコースあるよって人も
  57. ご清聴ありがとう ございました
Advertisement