8.5K Views
August 07, 21
スライド概要
ARコンテンツ作成勉強会の資料
可視化技術や人間計測/空間計測技術を活用した問題解決に関する研究開発。 ARコンテンツ作成勉強会(tryAR)を主催。
Nreal Lightハンズオン
自己紹介 氏名:吉永崇(Takashi Yoshinaga) 専門:ARを用いた医療支援や運動計測 Volumetric Video (3Dビデオ) コミュニティ:ARコンテンツ作成勉強会 主催
ARコンテンツ作成勉強会の紹介 2013年5月に勉強会をスタート。 ARコンテンツの作り方をハンズオン形式で学ぶ 人数は5~10名程度の少人数で実施 参加条件はAR/VRに興味がある人(知識不要) 各地で開催 (福岡、熊本、宮崎、長崎、大分、 鹿児島、山口、広島、札幌、関東)
Twitterと勉強会ページで情報を発信しています @AR_Fukuoka Googleで「AR勉強会」で検索
ハッシュタグ #AR_Fukuoka #nreal
今日の内容 Nreal Lightを使った開発の基本手順を解説
今日のゴール https://youtu.be/b8HElbrYxPo
演習用素材のダウンロード http://arfukuoka.lolipop.jp/nrea l/Sample.zip
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
ハンズオン手順 Unityの使い方の基本 オブジェクト 配置 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加 色の変更
ハンズオン手順 Unityの使い方の基本 壁の生成 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加 カラフルに
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
ハンズオンスタート
ハンズオン手順 Unityの使い方の基本 オブジェクト 配置 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加 色の変更
Unity Hub起動 Unity Hub
プロジェクトの作成 (1/6) ①プロジェクト ②新規作成の横の▼
プロジェクトの作成 (2/6) 2019.4.xxf1 この資料は2019.4.xを前提に解説をしています
プロジェクトの作成 (3/6) ①3D ②プロジェクト名
プロジェクトの作成 (4/6) 保存先を選択
プロジェクトの作成 (5/6) 作成
プロジェクトの作成 (6/6) Unity Editorが起動すればOK
Unity Editorの概要 Sceneタブ オブジェクトの一覧 オブジェクトの配置を行う プロジェクト内のフォルダやファイルの一覧
Unityの基本: オブジェクトの追加 (1/4) 空白を右クリック
Unityの基本: オブジェクトの追加 (2/4) 3D Object
Unityの基本: オブジェクトの追加 (3/4) Cube
Unityの基本: オブジェクトの追加 (4/4) 立方体が追加される
Unityの基本: 動作確認 実行
Unityの基本: 動作確認 カメラの視点で表示される
Unityの基本: 動作確認 Playボタンを再度クリックして停止
Unityの基本: 動作確認 青くなければOK
Unityの基本:位置/角度/サイズ変更 Cubeをクリック
Unityの基本: 位置/角度/サイズ変更 移動 回転 拡大・縮小
Unityの基本:位置/角度/サイズ変更 Cubeをクリック
Unityの基本: 位置/角度/サイズ変更 Position: 0 0 0 Rotation:0 0 0 Scaleを 0.2 0.2 0.2 (0.2m 相当)
補足:x,y,z軸について Y X Z この図ではカメラから見て横がX、奥行方向がZ、そして地面に対して垂直がY
Unityの基本: Sceneの視点の調整 Cubeをダブルクリック
Unityの基本: Sceneの視点の調整 Cubeが中心に表示される
Unityの基本: Sceneの視点の調整 [←] [→]で左右移動 [↑][↓]でズームイン/アウト [Alt]+ドラッグで回転 +ドラッグで上下左右
Unityの基本: 色の設定 ①Assets ②右クリック
Unityの基本: 色の設定 ①Create ②Material
Unityの基本: 色の設定 NewMaterialをクリック
Unityの基本: 色の設定 Rendering Mode横の ドロップダウンリストをクリック
Unityの基本: 色の設定 Transparent
Unityの基本: 色の設定 Albedo横の□をクリック
Unityの基本: 色の設定 好きな色を選ぶ 透過度を設定 (128くらい?)
Unityの基本: 色の設定 マテリアルの色が変わっている
Unityの基本: 色の設定 ①Cube ②Materialsを開く ③Element0が表示 されているのを確認
Unityの基本: 色の設定 New Materialを確認 (クリックはしない)
Unityの基本: 色の設定 Element0にドラッグ&ドロップ
Unityの基本: 色の設定 色が反映される
補足: 色を再設定する方法 Cube New Materialを開く
補足: 色を再設定する方法 ここで再度設定可能
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加 壁の生成
Nrealを想定したカメラの位置の設定 MainCamera Position 0 0 0
Cubeを並べて壁を作る準備 Cube Assetsにドラッグ&ドロップ
Cubeを並べて壁を作る準備 Cubeが追加される
Cubeを並べて壁を作る準備 Cubeを削除 (右クリック->Delete)
Cubeを並べて壁を作る準備 Cubeがなくなる
Cubeを並べて壁を作る準備 ①空白を右クリック ②Create Emptiy
Cubeを並べて壁を作る準備 ①Game Object
Cubeを並べて壁を作る準備 WallRootにリネーム
Cubeを並べて壁を作る準備 Position を 0 0 2
Cubeを並べて壁を作る Add Component
Cubeを並べて壁を作る 検索欄を空にする New script
Cubeを並べて壁を作る スクリプト名をつける (例: WallScript) Create and Add
Cubeを並べて壁を作る スクリプトが追加される スクリプトファイルはこちら
Cubeを並べて壁を作る スクリプトをダブルクリック
Cubeを並べて壁を作る public class WallScript : MonoBehaviour { // 最初に1回だけ実行される(初期化などに利用) void Start() { } // 毎フレーム実行される (WallScriptでは使用しない) void Update() { } }
Cubeを並べて壁を作る //壁を作るための箱の元データ [SerializeField] GameObject cubePrefab; //壁を構成する箱を全て覚えておく変数 List<GameObject> cubes = new List<GameObject>(); void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { }
Cubeを並べて壁を作る //壁を作るための箱の元データ [SerializeField] GameObject cubePrefab; //壁を構成する箱を全て覚えておく変数 List<GameObject> cubes = new List<GameObject>(); void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { ここにコードを記述 }
Cubeを並べて壁を作る for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { //箱オブジェクトを3D空間に生成 GameObject cube =GameObject.Instantiate(cubePrefab); //WallRootの子要素にする cube.transform.parent = transform; //箱オブジェクトの位置を指定 cube.transform.localPosition = new Vector3( x * cube.transform.localScale.x, y * cube.transform.localScale.y, 0); cubes.Add(cube); } 01.txt }
Ctrl + S
Cubeを並べて壁を作る WallRoot CubePrefabが追加される
Cubeを並べて壁を作る Cubeを確認 (クリックはしない)
Cubeを並べて壁を作る CubePrefabにドラッグ&ドロップ
Cubeを並べて壁を作る Cubeに置き換わって いることを確認
動作確認 Play
動作確認 壁が現れる
動作確認 停止
壁の位置を整える WallRoot Position -0.4 -0.2 2
動作確認 Play
動作確認 壁が中央に来る
動作確認 停止
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加 カラフルに
壁をカラフルにする
//壁を作るための箱の元データ
[SerializeField]
GameObject cubePrefab;
//壁を構成する箱を全て覚えておく変数
List<GameObject> cubes = new List<GameObject>();
//色のリスト
Color[] colors = { new Color(1.0f, 0.0f, 0.0f, 0.5f),
new Color(0.0f, 1.0f, 0.0f, 0.5f),
new Color(0.0f, 0.0f, 1.0f, 0.5f),
new Color(1.0f, 1.0f, 1.0f, 0.5f) };
void Start()
{
InitializeWall();
}
02.txt
壁をカラフルにする [SerializeField] GameObject cubePrefab; //壁を構成する箱を全て覚えておく変数 List<GameObject> cubes = new List<GameObject>(); //色のリスト Color[] colors = { /*中略*/}; void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { ここのコードを編集 }
Cubeを並べて壁を作る int index = 0; for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { GameObject cube =GameObject.Instantiate(cubePrefab); cube.transform.parent = transform; cube.transform.localPosition = new Vector3(/*中略*/); //Cubeに色をつける cube.GetComponent<Renderer>().material.color = colors[index]; index++; index %= colors.Length; cubes.Add(cube); } 02.txt }
動作確認
動作確認 停止
壁をリセットする機能を実装 List<GameObject> cubes = new List<GameObject>(); Color[] colors = { /*中略*/}; void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { /*中略*/ } pubic void ResetWall() { }
壁をリセットする機能を実装 List<GameObject> cubes = new List<GameObject>(); Color[] colors = { /*中略*/}; void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { /*中略*/ } pubic void ResetWall() { ここのコードを編集 }
壁をリセットする機能を実装 public void ResetWall() { //箱オブジェクトを1つ1つ削除 for (int i = 0; i < cubes.Count; i++) { DestroyImmediate(cubes[i]); } //全箱オブジェクトを覚えるリストを空にする cubes.Clear(); //壁の初期化 InitializeWall(); } ハンズオンの 最後に使います 03.txt
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
NRSDKをインストールする準備 File
NRSDKのインストールする準備 Build Settings
NRSDKのインストールする準備 Android
NRSDKのインストールする準備 Switch Platform
NRSDKのインストールする準備 閉じる
NRSDKのインストール ダブルクリック
NRSDKのインストール Import
NRSDKのインストール 全てFix
NRSDKのインストール Close Window
NRSDKのインストール NRSDKが追加されている
Nreal用カメラの設定 Main Cameraを削除
Nreal用カメラの設定 NRSDK → Prefabs
Nreal用カメラの設定 NRCameraRig
Nreal用カメラの設定 Hierarchyにドラッグ&ドロップ
Nreal用カメラの設定 NRCameraRigが追加されている
動作確認 [W][S] : 前後移動 [A][D] : 左右移動 [Space]+ドラッグ:首振り
動作確認 停止
実機インストール File
実機インストール Build Settings
実機インストール Player Settings
実機インストール Other Settings Package Nameが com.会社名.アプリ名 となっていることを確認
実機インストール Write Permissionを External(SDCard)
実機インストール 閉じる
実機インストール Build And Run
実機の動作の様子
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
ハンドトラッキング NRSDK → Prefabs
ハンドトラッキング NRInput
ハンドトラッキング Hierarchyにドラッグ&ドロップ
ハンドトラッキング NRInputが追加されている
ハンドトラッキング NRInput Input Source Typeの ドロップダウンメニュー
ハンドトラッキング Handsを選択
ハンドトラッキング NRInputを開く
ハンドトラッキング このあとRight/Leftに手を追加
ハンドトラッキング Handsを開く
ハンドトラッキング NRHand_R
ハンドトラッキング Rightにドラッグ&ドロップ NRHand_R
ハンドトラッキング Rightの子要素として追加される
ハンドトラッキング Leftにドラッグ&ドロップ NRHand_L
ハンドトラッキング Leftの子要素として追加される
動作確認 Play [左Shift]:手を表示 [左クリック]:ピンチ(つまむ) [右クリック]:指差し
動作確認 停止
実機で動作確認 Files Build And Run
実機の動作の様子
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
弾を作成 空白を右クリック 3Dオブジェクト Sphere
弾を作成 Sphereをダブルクリック
弾を作成 Bulletにリネーム
弾を作成 Scale 0.2 0.2 0.2
弾を作成 Assets
弾を作成 Bullet Assetsにドラッグ&ドロップ
弾を作成 Bulletが追加される
弾を作成 Bulletを削除
弾を撃つ ①NRHand_R ②AddComponent
弾を撃つ New script
弾を撃つ スクリプト名を設定 (例:TriggerScript) Create and Add
弾を撃つ TriggerScriptが追加される スクリプトのファイルはこちら
弾を撃つ ダブルククリック
弾を撃つ public class TriggerScript : MonoBehaviour { // 最初に1回だけ実行 (TriggerScriptでは不使用) void Start() { } // 毎フレーム実行される void Update() { } }
弾を撃つ public class TriggerScript : MonoBehaviour { // 最初に1回だけ実行 (TriggerScriptでは不使用) void Start() { } // 毎フレーム実行される void Update() { } } 削 除
弾を撃つ using System.Collections; using System.Collections.Generic; using UnityEngine; //NRSDKの読み込み using NRKernal; public class TriggerScript : MonoBehaviour { // 毎フレーム実行される void Update() { } } 04.txt
弾を撃つ //弾の元になる情報 [SerializeField] GameObject bulletPrefab; //右手か左手かを保持 public HandEnum handEnum; //発射許可のOn/Off bool shoot = true; //発射された弾 GameObject bullet; // 毎フレーム実行される void Update() { 05.txt }
弾を撃つ void Update() { UpdateGesture(); } //手の状態を監視して弾を発射 void UpdateGesture() { //手の情報を取得 var handState = NRInput.Hands.GetHandState(handEnum); //手が検出されなければ戻る if (handState == null) return; このあと、ピンチ状態を監視して弾を発射 }
弾を撃つ //親指と人差し指がある程度近づいた場合かつ発射OKの場合 if (handState.pinchStrength > 0.6 && shoot) { //弾発射中のフラグをON shoot = false; //既に発射した弾がある場合は削除 if (bullet != null) DestroyImmediate(bullet); //弾を3D空間に生成 bullet = GameObject.Instantiate(bulletPrefab); //手の位置を弾にセット Pose p = handState.pointerPose; bullet.transform.position = p.position; } else if (!handState.isPinching) { shoot = true; 06.txt }
Ctrl + S
弾を撃つ Bulletを確認 (クリックはしない)
弾を撃つ Bullet Prefabに追加
動作確認 ピンチをした座標に球が配置される
動作確認 停止
弾を撃つ void UpdateGesture() { //手の情報を取得 var handState = NRInput.Hands.GetHandState(handEnum); //手が検出されなければ戻る if (handState == null) return; if (handState.pinchStrength > 0.6 && !shoot) { ここにコードを追加して弾を飛ばす } else if (!handState.isPinching) { shoot = false; } }
弾を撃つ
if (handState.pinchStrength > 0.6 && !shoot)
{
//弾発射中のフラグをON
shoot = true;
//既に発射した弾がある場合は削除
if (bullet != null) DestroyImmediate(bullet);
//弾を3D空間に生成
bullet = GameObject.Instantiate(bulletPrefab);
//手の位置を弾にセット
Pose p = handState.pointerPose;
bullet.transform.position = p.position;
//手から出ているレーザーの方向に力を加える
bullet.GetComponent<Rigidbody>().AddForce(
p.forward * 8, ForceMode.Impulse);
}
07.txt
Ctrl + S
弾を撃つ ①Bulletをクリック ②Add Component
弾を撃つ ①Rigidbodyで検索 ②Rigidbodyをクリック
弾を撃つ ①Rigidbody ②Use GravityをOFF
動作確認 ピンチをすると球が発射される
動作確認 停止
壁を壊せるようにする Cubeをクリック AddComponent
壁を壊せるようにする Rigidbody
壁を壊せるようにする ①Rigidbody ②Use GravityをOFF
動作確認
ハンズオン手順 Unityの使い方の基本 スクリプトを用いた壁の作成 NRSDKの導入 ハンドトラッキングの設定 弾の発射 リセットボタンの追加
リセットボタン ダブルクリック
リセットボタン Import
リセットボタン Hierarchyに ドラッグ&ドロップ Canvas
リセットボタン Canvasを開く
リセットボタン Buttonをクリック
リセットボタン Buttonを見つける On Clickを見つける
リセットボタン WallRootを見つける (クリックしない)
リセットボタン OnClickにドラッグ&ドロップ
リセットボタン ドロップダウンメニューを開く
リセットボタン ②ResetWall ①WallScript
リセットボタン
リセットボタン NRInput → Right → NRHand_R → LaserRaycaster
リセットボタン Mask Type: Inclusive Mask: UI
完成!
参考 • クイックスタート https://nrealsdkdoc.readthedocs.io/en/v1.6.0/Docs/Uni ty_EN/Develop/Quickstart%20for%20Android.html • ハンドトラッキング詳細 https://nrealsdkdoc.readthedocs.io/en/v1.6.0/Docs/Uni ty_EN/Develop/Hand%20Tracking.html • UI https://nrealsdkdoc.readthedocs.io/en/v1.6.0/Docs/Uni ty_EN/Develop/Controller.html#building-a-projectwith-user-input • MRTK拡張 https://github.com/TakashiYoshinaga/MRTK-Profilesfor-NrealLight