狠狠撸
Submit Search
础搁コンテンツ作成勉强会:惭测辞を用いた痴搁コンテンツ开発
?
1 like
?
1,913 views
T
Takashi Yoshinaga
Follow
惭测辞を用いたコンテンツ作成に関するハンズオン资料
Read less
Read more
1 of 82
More Related Content
础搁コンテンツ作成勉强会:惭测辞を用いた痴搁コンテンツ开発
1.
ARコンテンツ作成勉強会 ウェアラブルセンサ?Myoを使ってみよう #AR_Fukuoka
2.
本日作成するコンテンツ https://youtu.be/ReQ8FDehXEw
3.
鲍苍颈迟测の基本操作を覚えよう
4.
Unityのプロジェクトを作成 (1/2) Unityを起動後、画面右上のNEW PROJECTをクリック クリック
5.
Unityのプロジェクトを作成 (2/2) プロジェクト名?保存場所?3Dを指定してCreate project 3D
最後にクリック プロジェクト名 保存場所 ※保存場所は全角フォルダやDropbox用フォルダはNG
6.
確認 時々、3Dモードを選択しても2Dモードになることがある その場合は再度、プロジェクトを作成してみてください 2Dモード 3Dモード NG Good
7.
Unityの操作画面(概要) ゲーム空間の設計画面
8.
ゲーム空間にCGを追加しよう 右クリック
9.
実行してみよう クリックして実行 クリックして終了 カメラから見た空間
10.
オブジェクトの位置?向き?サイズを調整 クリックして選択 移動 回転 拡大?縮小
11.
Scene(設計画面)の視点を変えよう [←] [→]で左右移動 [ ↑
] [ ↓ ]で前後移動 [Alt]+ドラッグで回転 +ドラッグで上下左右 他にもいろいろ → http://goo.gl/Lq1ILT
12.
CGの詳細情報の編集:位置の指定 クリック 選択したオブジェクトの 現在の詳細情報→ ? オブジェクトの詳細の 表示?追加?変更は Inspectorで行う ? 例えば、Transformの Positionを変更すると 位置が変わる (x,y,z)を(0,0,0)に(x,y,z)を(0,5,0)に
13.
CGの詳細情報の編集:物理演算の追加 Add Component 選択したオブジェクトに物理法則(重力)を適用 追加される
14.
実行してみよう
15.
少し遊んでみましょう(1/3) ① 右クリック Plane
16.
少し遊んでみましょう(2/3) 少し傾ける Position (0,0,0) Plane
17.
少し游んでみましょう(3/3)
18.
Sceneの保存 Scene名 ? [Ctrl]+[s]でダイアログを開き、好きな名前で保存 ? コンテンツ作成中はこまめに[Ctrl]+[s]すること
19.
不要なCGの削除 Delete 削除したいオブジェクトを選択して[Delete]キー
20.
次の作業内容 今日作成するコンテンツの準備 蝶 フィールド
21.
Asset StoreでCGを入手 [Window] → [Asset
Store]
22.
Asset StoreでButterflyを入手 butterflyで検索 Butterfly with
础苍颈尘补迟颈辞苍を选択
23.
Asset StoreでButterflyを入手 ダウンロード/インポート ? [ダウンロード]または [インポート]をクリック ?
ダウンロード終了を待つ ? Importing package ウィンドウが表示されたら [Import]をクリック Import
24.
Asset StoreでButterflyを入手 GruffysAnimatedButterfly フォルダが追加される
25.
蝶のCGをゲーム空間に追加 ? 3Dモデルがあるフォルダを開く [GruffysAnimated…] →
[Models] ? butterfly2.FBX を Hierarchyに ドラッグ&ドロップ
26.
フィールドを追加しよう 本日ダウンロードしたSampleフォルダの中にある SampleTerrainをダブルクリックしてプロジェクトに取り込む ダブルクリック Import
27.
フィールドを追加しよう Assetsフォルダ内のNew TerrainをHierarchyにドラッグ&ドロップ Assets
28.
確認 追加されたフィールドと蝶の位置関係を確認
29.
フィールドの位置の調節 フィールドの横幅の半分の-250だけx方向に移動 この辺に蝶 500 Positionを -250, 0, -2 -250移動
30.
調整 ? カメラの位置を変更してそれっぽくする ? 蝶のRotationを(0,180,0)にしてカメラと同じ方向を向かせる 180°
31.
蝶を前进させるスクリプトを作成しよう
32.
スクリプト記述用のGameObjectの追加 ①右クリック ②Create Empty
33.
スクリプトの追加 (1/2) ② Add
Component ① GameObject ③ New Script
34.
スクリプトの追加 (2/2) ① スクリプト名 ②
クリック スクリプト(C#)が追加される 【ここまでの操作】 空のGameObjectを作成し,そこにスクリプトファイルを追加 → Unityではオブジェクトの機能の1つとしてスクリプトが働く
35.
スクリプトの記述:エディタの起動 ダブルクリックして開く
36.
public class Controller
: MonoBehaviour { // Start関数は初期化のために一度だけ実行される void Start () { } // Update関数は毎フレーム(○○ミリ秒間隔で)実行される void Update () { } } スクリプトの記述:イメージ このスクリプトで butterfly2を扱うよ ??? フレームごとに少しずつ移動
37.
スクリプトの記述:実装 using UnityEngine; using System.Collections; public
class Controller : MonoBehaviour { GameObject butterfly; //蝶をプログラムで扱うための変数 void Start () { // Hierarchyにある蝶の情報を変数に覚えさせる butterfly = GameObject.Find("butterfly2"); } void Update () { butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } このモデルの場合??? ? 蝶自身の前後方向はz軸で表される。 ? 後ろ方向が+と定義されているため 前に進む場合は-をかける必要がある
38.
蝶の視点で移動しよう Main Cameraをbutterfly2の子要素にする 子要素になった ことを確認 ドラッグ&ドロップ
39.
移動のOn/Offの切り替え (1/2) using UnityEngine; using
System.Collections; public class Controller : MonoBehaviour { GameObject butterfly; //蝶をプログラムで扱うための変数 bool forward = false; //移動のOn/Offを記録する変数 void Start () { butterfly = GameObject.Find("butterfly2"); } void Update () { butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } forwardがtrueの時だけ実行
40.
移動のOn/Offの切り替え (2/2) GameObject butterfly;
//蝶をプログラムで扱うための変数 bool forward = false; //移動のOn/Offを記録する変数 void Start () { butterfly = GameObject.Find("butterfly2"); } void Update () { if (Input.GetMouseButtonUp(0)){ forward = !forward; //trueの時はfalse, falseの時はtrue } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } }
41.
Game画面をマウスクリックですると 移動のOn/Offが切り替えられる このあとMyoを使ってOn/Offを切り替える
42.
惭测辞を接続
43.
初期設定 Myo Connectを起動後, 通知領域の
を 右クリックしてArmband Managerを開く [Windows] [Mac]
44.
初期設定 Connect a Myo
Armbandをクリック クリック
45.
初期設定 Myoをアンテナに近づけて認識させる
46.
初期設定 CALIBRATIONをクリック クリック
47.
初期設定 Create Profileをクリック クリック
48.
初期設定 Myoを利き腕に装着 (勉強会では右を前提に話を進めます) 真ん中より 少し肘より
49.
初期設定 Continueをクリック クリック
50.
初期設定 Myoを装着する腕を選択し, Continueをクリック 右腕/左腕を選択
51.
初期設定 (まだ操作しないでください) 次に行う動作がビデオで示されるので それを確認し,キーボードの[Space]キーを押す.
52.
初期設定 Now recordingと表示されたら動画の動きを真似る
53.
初期設定 動作の記録が終わったらContinueをクリック. ※やり直す場合は Do it
againをクリック クリック
54.
初期設定 (まだ操作しないでください) 引き続き, 次に行う動作のビデオを確認したら キーボードの[Space]キーを押す.
55.
初期設定 Now recordingと表示されたら動画の動きを真似る
56.
初期設定 動作の記録が終わったらContinueをクリック クリック
57.
初期設定 同様の操作を以下のジェスチャに対して行う 内側(屈曲) 外側(伸展) リラックス
58.
初期設定 設定の成否を確認するため動画の動きを真似る
59.
初期設定 他のジェスチャについても確認。 問題なければComplete Profileをクリック
60.
Myo SDKのインポート 事前にダウンロード?解凍したMyo SDKフォルダ内の MyoUnity.unitypackageをダブルクリック ダブルクリック
61.
Myo SDKのインポート Import Unity
Package内の[Import]をクリック. API Update Requiredが出た場合には [I Made a Backup. Go Ahead!]をさらにクリック クリック クリック
62.
Myo SDKのインポート MyoとMyo Samples フォルダが追加される
63.
Myoの動きをUnity上でチェック (1/3) ? MyoのPrefabフォルダを開く [Assets]
→ [Myo] → [Prefab] ? Hub-1 Myo を Hierarchyに ドラッグ&ドロップ
64.
Myoの動きをUnity上でチェック (2/3) 手を動かしながら MyoオブジェクトのInspectorで Thalmic Myo(Script)をチェック ①
実行 ② Myo ③ 表示をチェック
65.
Myoの動きをUnity上でチェック (3/3) MyoオブジェクトのThalmic Myoが腕の状態を知っている →
自作スクリプトと连携できればコントローラとして利用可能
66.
Myoのデータ取得: スクリプトの記述 ダブルクリックして開く Assetsフォルダ
67.
Myoのデータ取得: スクリプトの記述 public class
Controller : MonoBehaviour { // Start関数は初期化のために一度だけ実行される void Start () { } // Update関数は毎フレーム(○○ミリ秒間隔で)実行される void Update () { } } このスクリプトで Myoを扱うよ 今何してる? ???
68.
Myoの初期化 using UnityEngine; using System.Collections; using
Thalmic.Myo; public class Controller : MonoBehaviour { GameObject butterfly; bool forward = false; ThalmicMyo myo; //Myoをプログラムで扱うための変数 void Start () { butterfly = GameObject.Find("butterfly2"); // 今接続されているMyoの情報を変数"myo"に覚えさせる myo = GameObject.Find("Myo").GetComponent<ThalmicMyo>(); } /*スペースの都合により以下省略*/
69.
補足 GameObject.Find("Myo") . GetComponent<ThalmicMyo>();
70.
Myoのデータ取得 public class Controller
: MonoBehaviour { // Start関数は初期化のために一度だけ実行される void Start () { butterfly = GameObject.Find("butterfly2"); myo = GameObject.Find("Myo").GetComponent<ThalmicMyo>(); } // Update関数は毎フレーム(○○ミリ秒間隔で)実行される void Update () { } } 今何してる? ???
71.
Myoのデータ取得 ThalmicMyo myo; //Myoをプログラムで扱うための変数 void
Start () { /*スペースの都合により省略*/ } void Update () { myo.pose if (Input.GetMouseButtonUp(0)){ forward = !forward; } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } print(myo.pose); //現在の状態を取得して表示
72.
動作確認 ① 実行 ② Console 筋肉の活動状態(pose)の 情報がリアルタイムに表示
73.
ダブルタップを用いた移動/停止の切り替え void Update ()
{ print(myo.pose); if (Input.GetMouseButtonUp(0)){ forward = !forward; } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } if ( ダブルタップをしたら ){ forward = !forward; } if (myo.pose==Pose.DoubleTap){ forward = !forward; } if文の条件を手の状態を用いたものに書き換える
74.
特定動作のみの利用 void Update ()
{ print(myo.pose); if (myo.pose==Pose.DoubleTap){ print(myo.pose); forward = !forward; } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } 動作確認のためにprint(myo.pose)もif分の中に移動 移動
75.
実験 1回だけダブルタップをしてみよう 1回のダブルタップを 複数回認識してしまう ダブルタップを用いたOn/Offの切り替えには不都合
76.
スイッチとしての利用に関するアイデア Rest 1回のDoubleTap 切り替わり タップ開始のタイミング(状態切り替わり)がわかればOK → つまり、直前の状態と今の状態が異なる時を識別
77.
切り替わりのタイミングの認識 Pose lastPose; //前の状態を覚えておく変数 void
Start () { butterfly = GameObject.Find("butterfly2"); myo = GameObject.Find("Myo").GetComponent<ThalmicMyo>(); } void Update () { if(myo.pose==Pose.DoubleTap){ print(myo.pose); //現在の状態を取得して表示 forward = !forward; } /*スペースの都合により省略*/ } if( 前の状態と異なる場合) { if(myo.pose==Pose.DoubleTap){ print(myo.pose); forward = !forward; } } if(myo.pose != lastPose) { //状態が切り替わったら下記を実行 lastPose=myo.pose; //最新の状態に更新 if(myo.pose==Pose.DoubleTap){ print(myo.pose); forward = !forward; } } Rest Rest DoubleTap DoubleTap DoubleTap Rest Rest ???? → lastPose → lastPose
78.
CGの向きを制御する void Update ()
{ if(myo.pose != lastPose) { //状態が切り替わったら下記を実行 lastPose=myo.pose; //最新の状態に更新 if(myo.pose==Pose.DoubleTap){ print(myo.pose); forward = !forward; } } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } if(myo.pose == Pose.WaveIn){ butterfly.transform.Rotate( 回転角度 ); } } butterfly.transform.Rotate(0,-0.5f,0); x z y
79.
CGの向きを制御する void Update ()
{ if(myo.pose != lastPose) { //状態が切り替わったら下記を実行 lastPose=myo.pose; //最新の状態を記録 if(myo.pose==Pose.DoubleTap){ /*スペースの都合上省略*/ } } if(myo.pose == Pose.WaveIn){ butterfly.transform.Rotate(0,-0.5f,0); } else if(myo.pose == Pose.WaveOut){ butterfly.transform.Rotate(0, 0.5f,0); } }
80.
蝶の高さを制御する void Update ()
{ if(myo.pose != lastPose) { lastPose=myo.pose; /*スペースの都合上省略*/ } if(myo.pose == Pose.WaveIn){ butterfly.transform.Rotate(0,-0.5f,0); } else if(myo.pose == Pose.WaveOut){ butterfly.transform.Rotate(0, 0.5f,0); } if (myo.accelerometer.z > 0.8) { butterfly.transform.Translate(0, 0.02f, 0); } }
81.
蝶の高さを制御する void Update ()
{ /*スペースの都合上省略*/ if(myo.pose == Pose.WaveIn){ butterfly.transform.Rotate(0,-0.5f,0); } else if(myo.pose == Pose.WaveOut){ butterfly.transform.Rotate(0, 0.5f,0); } if (myo.accelerometer.z > 0.8) { butterfly.transform.Translate(0, 0.02f, 0); } else if(myo.accelerometer.z < -0.8) { butterfly.transform.Translate(0, -0.02f, 0); } } z y -z方向に加速
82.
完成