0
Javaプログラマのための
ミニ四駆再入門
#yonayonajavafx
@kiy0taka
告知
富士通乾電池提供
ミニ四駆ジャパンカップ2014
• 10/5(日) 大阪大会2
• 京セラドーム大阪・9Fスカイホール
• たぶん8:00から受付開始
自己紹介
•奥 清隆(おく きよたか)
• id:kiy0taka、@kiy0taka
•JGGUG関西支部
•関西Javaエンジニアの会
•株式会社ニューキャスト所属
Mr. Java Day Tokyo
ミニ四駆の話をと言われて
https://twitter.com/skrb/status/484356816084926465
富士通乾電池提供
ミニ四駆ジャパンカップ
2014
ジャパンカップ
• 2012年にミニ四駆30周年を記念して復活!
• 第三次ブームのきっかけになった
• 昨年の動員数は2万人。
• 全盛期1996年は30万人超
• 安定の富士通乾電池提供
• 6月22日(日) 東京大会1 品川シーサイドフォレスト・オーバルガーデン(東京都品川区)
• 6月29日(日) 大阪大会1 京セラドーム大阪・9Fスカイホール(大阪市西区)
• 7月 6日(日) 愛知大会 愛・地球博記念公園 地球市民交流セ...
参加方法
• 昔のように事前抽選はない
• 当日参加
• でも遅くなると参加できない
• 通称:0次予選
クラス
• ジュニアクラス(中学生以下)
• オープンクラス(誰でも)
• チャンピオンズ(公式大会優勝者)
• ファミリークラス(小学校3年生まで、または共
同製作した中学3年生までの親子)
• ファミリークラスは1次予選のみ
シード代表決定戦
• 全国各地のミニ四駆ステーションで行われる大
会で優勝すると2次予選から参加できる
• お近くのミニ四駆ステーションへ
• http://www.tamiya.com/japan/mini4wd/
station_race/...
ミニ四駆を始めるため
に必要な物
はじめるために必要な物
• ミニ四駆
• パーツ
• 工具
• コース
• 友達
シャーシ
• http://www.tamiya.com/japan/cms/
newstopics/2276-mini4chassis.html
• 14種類?
• タイプ1∼3シャーシは手に入らない
• とりあえずMAシャーシから始めればい...
モーター
• http://www.tamiya.com/japan/download/
pdf/mini4wd/parts/mini4wd_motor.pdf
• たくさんある
• ハイパーミニ/ハイパーダッシュなんてもうない
• MA/MS...
パーツ
• ありすぎる
• とりあえずモーター全種類買っとけ
• あとファーストトライパーツセットとか
ステー/プレート
• 強度を上げたり、ローラーベースを広げたりする
• 加工して自作パーツを作る
ブレーキ
• レーンチェンジャーやドラゴンバックでコースア
ウトしないように減速させる
• 最近のモーター/コースでは必須アイテム
ダンパー
• ジャンプして着地後に衝撃を吸収させる
• ショック吸収タイヤなんて今や夢パーツ扱い
その他のパーツ
• パーツについてはきりがないのであとはググれ
• ネットで買うならヨドバシ.comが最強
• パーツ1つでも送料無料で翌日配達
工具
• ドライバー
• ボックスドライバー
• ニッパー
• ペンチ
• ヤスリ
• ピンセット
• デザインカッター
• ノギス
• ホビールーター
コース
• JCJC (安いとこで14Kぐらい)
• オーバルホームサーキット (8Kぐらい)
• もしくは近くのミニ四駆ステーションへ
• レンタルできるが送料考えると割に合わない
#ミニ四駆を走らせたい
お客様の中に、会社にコースあるって方はいませんか?
おまけ
JavaFX 3DとJBulletで
物理演算の話
∼ミニ四駆シミュレータを作りたい∼
ミニ四駆シミュレータ
https://www.youtube.com/watch?v=Ag16KQ7YrSg
JavaFX 3D
• javafx.scene.shape.Shape3D
• Box/Cylinder/Sphere/MeshView
物理演算エンジン
物理演算エンジン(ぶつりえんざんエンジン、Physics
engine)とは、質量・速度・摩擦・風といった、古典力
学的な法則をシミュレーションするコンピュータのソフ
トウェアである。多くの場合、ミドルウェアライブラリ
を指す...
http://www.nicovideo.jp/tag/物理演算
JBullet
• Bullet Physics Library (http://bulletphysics.org/
wordpress/) のJava版
• 本家の最新版は2.83、バージョン3系が開発中らしい
• JBulletは本家の2...
ざっくりとした使い方
• DynamicsWorldを作る
• 物体をDynamicsWorldに入れる
• DynamicsWorldにシミュレートさせる
• 描画するのはBulletの仕事ではないので自前で用
意する → JavaFX 3D
JBulletでHelloWorld
HelloWorld.java
• JBulletのサンプルについてる
• 球体が自由落下して地面に跳ね返る
• 画面はないので球体の座標が標準出力に出るだけ
DynamicsWorld
// おまじない!
CollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration();
CollisionDisp...
地面を作る
// 地面の形状(Box)!
CollisionShape groundShape = new BoxShape(new Vector3f(50.f, 50.f, 50.f));!
!
// 地面の位置!
Transform gro...
球体を作る
// 球体!
CollisionShape colShape = new SphereShape(1.f);!
collisionShapes.add(colShape);!
!
Transform startTransform =...
シミュレートする
for (int i=0; i<100; i++) {!
dynamicsWorld.stepSimulation(1.f / 60.f, 10);!
...!
}!
JBullet HelloWorld
+
JavaFX 3D
JBullet + JavaFX 3D
• 力学世界に入れてる物体をJavaFX 3Dで描画する
• JBulletのCollisionShapeと同じ形状/位置/姿勢の
ものをJavaFXのShape3Dで作る
• シミュレートして、それぞれ...
Node CollisionShape
地面を作る(JBullet)
// 地面の形状(Box)!
CollisionShape groundShape = new BoxShape(new Vector3f(50.f, 50.f, 50.f));!
!
// 地面の位置!
Tran...
地面を作る(JavaFX)
// 地面の形状(Box)!
Box groundNode = new Box(100, 100, 100);!
!
// 地面の位置!
boxNode.setTranslateX(0);!
boxNode.setT...
JavaFXの座標について
3D を行うのに欠かせないのが、座標です。もちろん、JavaFX でも 3 次元の座標
を扱うのですが、ちょっとだけ注意が必要です。
というのも、通常の 3D の CG Tool は y 軸が数学と同じで上方向を向い...
座標
JavaFX JBullet
x軸に180 回転してやる
地面を作る(JavaFX)
// 親ノードをx軸に180°回転!
Group root = new Group();!
root.setRotationAxis(new Point3D(1, 0, 0));!
root.setRotate(18...
Nodeの変換
JavaFX JBullet
Box BoxShape
Cylinder CylinderShape
Sphere SphereShape
MeshView BvhTriangleMeshShape
Group Compound...
MotionState
地面を作る(JBullet)
// 地面の形状(Box)!
CollisionShape groundShape = new BoxShape(new Vector3f(50.f, 50.f, 50.f));!
!
// 地面の位置!
Tran...
MotionState
• dynamicsWorld.stepSimulation()を実行すると
それぞれの物体の位置とかを計算してくれる
• シミュレートごとに各物体の計算結果が
MotionStateのsetWorldTransform...
JavaFXMotionState
@Override!
public void setWorldTransform(Transform centerOfMassWorldTrans) {!
super.setWorldTransform(ce...
その他
• 2つの剛体を結合する制約とか
• ソフトボディとか
• Vehicleとか
• いろいろ調べないと分からない
ライブラリ作成中
• JavaFXのノードを作って物理的なパラメータを
渡せばあれしてくれる
• GroovyFX用のも作成中
• 公開は未定
サンプル(Java)
public class App extends JBulletApp {!
!
@Override!
protected void create3D() {!
Box box = new Box(50, 50, 50);...
サンプル(GroovyFX)
start {!
stage(title: "Hello World", visible: true, primary: true) {!
scene {!
perspectiveCamera(true, near...
まとめ
• 大阪大会まで3ヶ月
• 参加される方は @kiy0taka までご連絡を
• あと会社にコースあるよって人も
ご清聴ありがとう
ございました
javafx-mini4wd
javafx-mini4wd
javafx-mini4wd
javafx-mini4wd
Upcoming SlideShare
Loading in...5
×

javafx-mini4wd

698

Published on

Published in: Software
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
698
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "javafx-mini4wd"

  1. 1. Javaプログラマのための ミニ四駆再入門 #yonayonajavafx @kiy0taka
  2. 2. 告知
  3. 3. 富士通乾電池提供 ミニ四駆ジャパンカップ2014 • 10/5(日) 大阪大会2 • 京セラドーム大阪・9Fスカイホール • たぶん8:00から受付開始
  4. 4. 自己紹介 •奥 清隆(おく きよたか) • id:kiy0taka、@kiy0taka •JGGUG関西支部 •関西Javaエンジニアの会 •株式会社ニューキャスト所属
  5. 5. Mr. Java Day Tokyo
  6. 6. ミニ四駆の話をと言われて https://twitter.com/skrb/status/484356816084926465
  7. 7. 富士通乾電池提供 ミニ四駆ジャパンカップ 2014
  8. 8. ジャパンカップ • 2012年にミニ四駆30周年を記念して復活! • 第三次ブームのきっかけになった • 昨年の動員数は2万人。 • 全盛期1996年は30万人超 • 安定の富士通乾電池提供
  9. 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. 10. 参加方法 • 昔のように事前抽選はない • 当日参加 • でも遅くなると参加できない • 通称:0次予選
  11. 11. クラス • ジュニアクラス(中学生以下) • オープンクラス(誰でも) • チャンピオンズ(公式大会優勝者) • ファミリークラス(小学校3年生まで、または共 同製作した中学3年生までの親子) • ファミリークラスは1次予選のみ
  12. 12. シード代表決定戦 • 全国各地のミニ四駆ステーションで行われる大 会で優勝すると2次予選から参加できる • お近くのミニ四駆ステーションへ • http://www.tamiya.com/japan/mini4wd/ station_race/jcup2014_0603.pdf
  13. 13. ミニ四駆を始めるため に必要な物
  14. 14. はじめるために必要な物 • ミニ四駆 • パーツ • 工具 • コース • 友達
  15. 15. シャーシ • http://www.tamiya.com/japan/cms/ newstopics/2276-mini4chassis.html • 14種類? • タイプ1∼3シャーシは手に入らない • とりあえずMAシャーシから始めればいいと思う
  16. 16. モーター • http://www.tamiya.com/japan/download/ pdf/mini4wd/parts/mini4wd_motor.pdf • たくさんある • ハイパーミニ/ハイパーダッシュなんてもうない • MA/MSシャーシは両軸モーターなので間違えな いように
  17. 17. パーツ • ありすぎる • とりあえずモーター全種類買っとけ • あとファーストトライパーツセットとか
  18. 18. ステー/プレート • 強度を上げたり、ローラーベースを広げたりする • 加工して自作パーツを作る
  19. 19. ブレーキ • レーンチェンジャーやドラゴンバックでコースア ウトしないように減速させる • 最近のモーター/コースでは必須アイテム
  20. 20. ダンパー • ジャンプして着地後に衝撃を吸収させる • ショック吸収タイヤなんて今や夢パーツ扱い
  21. 21. その他のパーツ • パーツについてはきりがないのであとはググれ • ネットで買うならヨドバシ.comが最強 • パーツ1つでも送料無料で翌日配達
  22. 22. 工具 • ドライバー • ボックスドライバー • ニッパー • ペンチ • ヤスリ • ピンセット • デザインカッター • ノギス • ホビールーター
  23. 23. コース • JCJC (安いとこで14Kぐらい) • オーバルホームサーキット (8Kぐらい) • もしくは近くのミニ四駆ステーションへ • レンタルできるが送料考えると割に合わない
  24. 24. #ミニ四駆を走らせたい お客様の中に、会社にコースあるって方はいませんか?
  25. 25. おまけ
  26. 26. JavaFX 3DとJBulletで 物理演算の話 ∼ミニ四駆シミュレータを作りたい∼
  27. 27. ミニ四駆シミュレータ https://www.youtube.com/watch?v=Ag16KQ7YrSg
  28. 28. JavaFX 3D • javafx.scene.shape.Shape3D • Box/Cylinder/Sphere/MeshView
  29. 29. 物理演算エンジン 物理演算エンジン(ぶつりえんざんエンジン、Physics engine)とは、質量・速度・摩擦・風といった、古典力 学的な法則をシミュレーションするコンピュータのソフ トウェアである。多くの場合、ミドルウェアライブラリ を指す。 略して物理演算、物理エンジン、Physicsとも 言う。 http://ja.wikipedia.org/wiki/物理演算エンジン
  30. 30. http://www.nicovideo.jp/tag/物理演算
  31. 31. JBullet • Bullet Physics Library (http://bulletphysics.org/ wordpress/) のJava版 • 本家の最新版は2.83、バージョン3系が開発中らしい • JBulletは本家の2.72がベース • 開発は2010年で止まってるっぽい
  32. 32. ざっくりとした使い方 • DynamicsWorldを作る • 物体をDynamicsWorldに入れる • DynamicsWorldにシミュレートさせる • 描画するのはBulletの仕事ではないので自前で用 意する → JavaFX 3D
  33. 33. JBulletでHelloWorld
  34. 34. HelloWorld.java • JBulletのサンプルについてる • 球体が自由落下して地面に跳ね返る • 画面はないので球体の座標が標準出力に出るだけ
  35. 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. 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. 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. 38. シミュレートする for (int i=0; i<100; i++) {! dynamicsWorld.stepSimulation(1.f / 60.f, 10);! ...! }!
  39. 39. JBullet HelloWorld + JavaFX 3D
  40. 40. JBullet + JavaFX 3D • 力学世界に入れてる物体をJavaFX 3Dで描画する • JBulletのCollisionShapeと同じ形状/位置/姿勢の ものをJavaFXのShape3Dで作る • シミュレートして、それぞれの物体の位置/姿勢を JavaFXのノードに適用する
  41. 41. Node CollisionShape
  42. 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. 43. 地面を作る(JavaFX) // 地面の形状(Box)! Box groundNode = new Box(100, 100, 100);! ! // 地面の位置! boxNode.setTranslateX(0);! boxNode.setTranslateY(-56);! boxNode.setTranslateZ(0);
  44. 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. 45. 座標 JavaFX JBullet x軸に180 回転してやる
  46. 46. 地面を作る(JavaFX) // 親ノードをx軸に180°回転! Group root = new Group();! root.setRotationAxis(new Point3D(1, 0, 0));! root.setRotate(180);! ! root.getChildren().add(boxNode);
  47. 47. Nodeの変換 JavaFX JBullet Box BoxShape Cylinder CylinderShape Sphere SphereShape MeshView BvhTriangleMeshShape Group CompoundShape
  48. 48. MotionState
  49. 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. 50. MotionState • dynamicsWorld.stepSimulation()を実行すると それぞれの物体の位置とかを計算してくれる • シミュレートごとに各物体の計算結果が MotionStateのsetWorldTransform()で渡され る • DefaultMotionStateクラスを継承してJavaFX 用にあれしてやればいい
  51. 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. 52. その他 • 2つの剛体を結合する制約とか • ソフトボディとか • Vehicleとか • いろいろ調べないと分からない
  53. 53. ライブラリ作成中 • JavaFXのノードを作って物理的なパラメータを 渡せばあれしてくれる • GroovyFX用のも作成中 • 公開は未定
  54. 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. 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. 56. まとめ • 大阪大会まで3ヶ月 • 参加される方は @kiy0taka までご連絡を • あと会社にコースあるよって人も
  57. 57. ご清聴ありがとう ございました
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×