狠狠撸

狠狠撸Share a Scribd company logo
ARコンテンツ作成勉強会
ウェアラブルセンサ?Myoを使ってみよう
#AR_Fukuoka
本日作成するコンテンツ
https://youtu.be/ReQ8FDehXEw
鲍苍颈迟测の基本操作を覚えよう
Unityのプロジェクトを作成 (1/2)
Unityを起動後、画面右上のNEW PROJECTをクリック
クリック
Unityのプロジェクトを作成 (2/2)
プロジェクト名?保存場所?3Dを指定してCreate project
3D 最後にクリック
プロジェクト名
保存場所
※保存場所は全角フォルダやDropbox用フォルダはNG
確認
時々、3Dモードを選択しても2Dモードになることがある
その場合は再度、プロジェクトを作成してみてください
2Dモード 3Dモード
NG Good
Unityの操作画面(概要)
ゲーム空間の設計画面
ゲーム空間にCGを追加しよう
右クリック
実行してみよう
クリックして実行
クリックして終了
カメラから見た空間
オブジェクトの位置?向き?サイズを調整
クリックして選択
移動 回転 拡大?縮小
Scene(設計画面)の視点を変えよう
[←] [→]で左右移動
[ ↑ ] [ ↓ ]で前後移動
[Alt]+ドラッグで回転
+ドラッグで上下左右
他にもいろいろ
→ http://goo.gl/Lq1ILT
CGの詳細情報の編集:位置の指定
クリック
選択したオブジェクトの
現在の詳細情報→
? オブジェクトの詳細の
表示?追加?変更は
Inspectorで行う
? 例えば、Transformの
Positionを変更すると
位置が変わる
(x,y,z)を(0,0,0)に(x,y,z)を(0,5,0)に
CGの詳細情報の編集:物理演算の追加
Add Component
選択したオブジェクトに物理法則(重力)を適用
追加される
実行してみよう
少し遊んでみましょう(1/3)
① 右クリック
Plane
少し遊んでみましょう(2/3)
少し傾ける
Position (0,0,0)
Plane
少し游んでみましょう(3/3)
Sceneの保存
Scene名
? [Ctrl]+[s]でダイアログを開き、好きな名前で保存
? コンテンツ作成中はこまめに[Ctrl]+[s]すること
不要なCGの削除
Delete
削除したいオブジェクトを選択して[Delete]キー
次の作業内容
今日作成するコンテンツの準備
蝶
フィールド
Asset StoreでCGを入手
[Window]
→ [Asset Store]
Asset StoreでButterflyを入手
butterflyで検索
Butterfly with 础苍颈尘补迟颈辞苍を选択
Asset StoreでButterflyを入手
ダウンロード/インポート
? [ダウンロード]または
[インポート]をクリック
? ダウンロード終了を待つ
? Importing package
ウィンドウが表示されたら
[Import]をクリック
Import
Asset StoreでButterflyを入手
GruffysAnimatedButterfly
フォルダが追加される
蝶のCGをゲーム空間に追加
? 3Dモデルがあるフォルダを開く
[GruffysAnimated…] → [Models]
? butterfly2.FBX を Hierarchyに
ドラッグ&ドロップ
フィールドを追加しよう
本日ダウンロードしたSampleフォルダの中にある
SampleTerrainをダブルクリックしてプロジェクトに取り込む
ダブルクリック
Import
フィールドを追加しよう
Assetsフォルダ内のNew TerrainをHierarchyにドラッグ&ドロップ
Assets
確認
追加されたフィールドと蝶の位置関係を確認
フィールドの位置の調節
フィールドの横幅の半分の-250だけx方向に移動
この辺に蝶
500
Positionを
-250, 0, -2
-250移動
調整
? カメラの位置を変更してそれっぽくする
? 蝶のRotationを(0,180,0)にしてカメラと同じ方向を向かせる
180°
蝶を前进させるスクリプトを作成しよう
スクリプト記述用のGameObjectの追加
①右クリック
②Create Empty
スクリプトの追加 (1/2)
② Add Component
① GameObject
③ New Script
スクリプトの追加 (2/2)
① スクリプト名
② クリック
スクリプト(C#)が追加される
【ここまでの操作】
空のGameObjectを作成し,そこにスクリプトファイルを追加
→ Unityではオブジェクトの機能の1つとしてスクリプトが働く
スクリプトの記述:エディタの起動
ダブルクリックして開く
public class Controller : MonoBehaviour {
// Start関数は初期化のために一度だけ実行される
void Start () {
}
// Update関数は毎フレーム(○○ミリ秒間隔で)実行される
void Update () {
}
}
スクリプトの記述:イメージ
このスクリプトで
butterfly2を扱うよ
???
フレームごとに少しずつ移動
スクリプトの記述:実装
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軸で表される。
? 後ろ方向が+と定義されているため
前に進む場合は-をかける必要がある
蝶の視点で移動しよう
Main Cameraをbutterfly2の子要素にする
子要素になった
ことを確認
ドラッグ&ドロップ
移動の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の時だけ実行
移動の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);
}
}
Game画面をマウスクリックですると
移動のOn/Offが切り替えられる
このあとMyoを使ってOn/Offを切り替える
惭测辞を接続
初期設定
Myo Connectを起動後, 通知領域の を
右クリックしてArmband Managerを開く
[Windows]
[Mac]
初期設定
Connect a Myo Armbandをクリック
クリック
初期設定
Myoをアンテナに近づけて認識させる
初期設定
CALIBRATIONをクリック
クリック
初期設定
Create Profileをクリック
クリック
初期設定
Myoを利き腕に装着
(勉強会では右を前提に話を進めます)
真ん中より
少し肘より
初期設定
Continueをクリック
クリック
初期設定
Myoを装着する腕を選択し, Continueをクリック
右腕/左腕を選択
初期設定 (まだ操作しないでください)
次に行う動作がビデオで示されるので
それを確認し,キーボードの[Space]キーを押す.
初期設定
Now recordingと表示されたら動画の動きを真似る
初期設定
動作の記録が終わったらContinueをクリック.
※やり直す場合は Do it againをクリック
クリック
初期設定 (まだ操作しないでください)
引き続き, 次に行う動作のビデオを確認したら
キーボードの[Space]キーを押す.
初期設定
Now recordingと表示されたら動画の動きを真似る
初期設定
動作の記録が終わったらContinueをクリック
クリック
初期設定
同様の操作を以下のジェスチャに対して行う
内側(屈曲) 外側(伸展) リラックス
初期設定
設定の成否を確認するため動画の動きを真似る
初期設定
他のジェスチャについても確認。
問題なければComplete Profileをクリック
Myo SDKのインポート
事前にダウンロード?解凍したMyo SDKフォルダ内の
MyoUnity.unitypackageをダブルクリック
ダブルクリック
Myo SDKのインポート
Import Unity Package内の[Import]をクリック.
API Update Requiredが出た場合には
[I Made a Backup. Go Ahead!]をさらにクリック
クリック
クリック
Myo SDKのインポート
MyoとMyo Samples
フォルダが追加される
Myoの動きをUnity上でチェック (1/3)
? MyoのPrefabフォルダを開く
[Assets] → [Myo] → [Prefab]
? Hub-1 Myo を Hierarchyに
ドラッグ&ドロップ
Myoの動きをUnity上でチェック (2/3)
手を動かしながら
MyoオブジェクトのInspectorで
Thalmic Myo(Script)をチェック
① 実行
② Myo
③ 表示をチェック
Myoの動きをUnity上でチェック (3/3)
MyoオブジェクトのThalmic Myoが腕の状態を知っている
→ 自作スクリプトと连携できればコントローラとして利用可能
Myoのデータ取得: スクリプトの記述
ダブルクリックして開く
Assetsフォルダ
Myoのデータ取得: スクリプトの記述
public class Controller : MonoBehaviour {
// Start関数は初期化のために一度だけ実行される
void Start () {
}
// Update関数は毎フレーム(○○ミリ秒間隔で)実行される
void Update () {
}
}
このスクリプトで
Myoを扱うよ
今何してる?
???
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>();
}
/*スペースの都合により以下省略*/
補足
GameObject.Find("Myo") . GetComponent<ThalmicMyo>();
Myoのデータ取得
public class Controller : MonoBehaviour {
// Start関数は初期化のために一度だけ実行される
void Start () {
butterfly = GameObject.Find("butterfly2");
myo =
GameObject.Find("Myo").GetComponent<ThalmicMyo>();
}
// Update関数は毎フレーム(○○ミリ秒間隔で)実行される
void Update () {
}
}
今何してる?
???
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); //現在の状態を取得して表示
動作確認
① 実行
② Console
筋肉の活動状態(pose)の
情報がリアルタイムに表示
ダブルタップを用いた移動/停止の切り替え
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文の条件を手の状態を用いたものに書き換える
特定動作のみの利用
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分の中に移動
移動
実験
1回だけダブルタップをしてみよう
1回のダブルタップを
複数回認識してしまう
ダブルタップを用いたOn/Offの切り替えには不都合
スイッチとしての利用に関するアイデア
Rest
1回のDoubleTap
切り替わり
タップ開始のタイミング(状態切り替わり)がわかればOK
→ つまり、直前の状態と今の状態が異なる時を識別
切り替わりのタイミングの認識
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
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
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);
}
}
蝶の高さを制御する
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);
}
}
蝶の高さを制御する
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方向に加速
完成

More Related Content

础搁コンテンツ作成勉强会:惭测辞を用いた痴搁コンテンツ开発