Nreal Lightハンズオン

4.1K Views

August 07, 21

スライド概要

ARコンテンツ作成勉強会の資料

profile-image

可視化技術や人間計測/空間計測技術を活用した問題解決に関する研究開発。 ARコンテンツ作成勉強会(AR_Fukuoka)を主催。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Nreal Lightハンズオン

2.

自己紹介 氏名:吉永崇(Takashi Yoshinaga) 専門:ARを用いた医療支援や運動計測 Volumetric Video (3Dビデオ) コミュニティ:ARコンテンツ作成勉強会 主催

3.

ARコンテンツ作成勉強会の紹介  2013年5月に勉強会をスタート。  ARコンテンツの作り方をハンズオン形式で学ぶ  人数は5~10名程度の少人数で実施  参加条件はAR/VRに興味がある人(知識不要)  各地で開催 (福岡、熊本、宮崎、長崎、大分、 鹿児島、山口、広島、札幌、関東)

4.

Twitterと勉強会ページで情報を発信しています @AR_Fukuoka Googleで「AR勉強会」で検索

5.

ハッシュタグ #AR_Fukuoka #nreal

6.

今日の内容 Nreal Lightを使った開発の基本手順を解説

7.

今日のゴール https://youtu.be/b8HElbrYxPo

8.

演習用素材のダウンロード http://arfukuoka.lolipop.jp/nrea l/Sample.zip

9.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

10.

ハンズオン手順  Unityの使い方の基本 オブジェクト 配置  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加 色の変更

11.

ハンズオン手順  Unityの使い方の基本 壁の生成  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加 カラフルに

12.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

13.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

14.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

15.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

16.

ハンズオンスタート

17.

ハンズオン手順  Unityの使い方の基本 オブジェクト 配置  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加 色の変更

18.

Unity Hub起動 Unity Hub

19.

プロジェクトの作成 (1/6) ①プロジェクト ②新規作成の横の▼

20.

プロジェクトの作成 (2/6) 2019.4.xxf1 この資料は2019.4.xを前提に解説をしています

21.

プロジェクトの作成 (3/6) ①3D ②プロジェクト名

22.

プロジェクトの作成 (4/6) 保存先を選択

23.

プロジェクトの作成 (5/6) 作成

24.

プロジェクトの作成 (6/6) Unity Editorが起動すればOK

25.

Unity Editorの概要 Sceneタブ オブジェクトの一覧 オブジェクトの配置を行う プロジェクト内のフォルダやファイルの一覧

26.

Unityの基本: オブジェクトの追加 (1/4) 空白を右クリック

27.

Unityの基本: オブジェクトの追加 (2/4) 3D Object

28.

Unityの基本: オブジェクトの追加 (3/4) Cube

29.

Unityの基本: オブジェクトの追加 (4/4) 立方体が追加される

30.

Unityの基本: 動作確認 実行

31.

Unityの基本: 動作確認 カメラの視点で表示される

32.

Unityの基本: 動作確認 Playボタンを再度クリックして停止

33.

Unityの基本: 動作確認 青くなければOK

34.

Unityの基本:位置/角度/サイズ変更 Cubeをクリック

35.

Unityの基本: 位置/角度/サイズ変更 移動 回転 拡大・縮小

36.

Unityの基本:位置/角度/サイズ変更 Cubeをクリック

37.

Unityの基本: 位置/角度/サイズ変更 Position: 0 0 0 Rotation:0 0 0 Scaleを 0.2 0.2 0.2 (0.2m 相当)

38.

補足:x,y,z軸について Y X Z この図ではカメラから見て横がX、奥行方向がZ、そして地面に対して垂直がY

39.

Unityの基本: Sceneの視点の調整 Cubeをダブルクリック

40.

Unityの基本: Sceneの視点の調整 Cubeが中心に表示される

41.

Unityの基本: Sceneの視点の調整 [←] [→]で左右移動 [↑][↓]でズームイン/アウト [Alt]+ドラッグで回転 +ドラッグで上下左右

42.

Unityの基本: 色の設定 ①Assets ②右クリック

43.

Unityの基本: 色の設定 ①Create ②Material

44.

Unityの基本: 色の設定 NewMaterialをクリック

45.

Unityの基本: 色の設定 Rendering Mode横の ドロップダウンリストをクリック

46.

Unityの基本: 色の設定 Transparent

47.

Unityの基本: 色の設定 Albedo横の□をクリック

48.

Unityの基本: 色の設定 好きな色を選ぶ 透過度を設定 (128くらい?)

49.

Unityの基本: 色の設定 マテリアルの色が変わっている

50.

Unityの基本: 色の設定 ①Cube ②Materialsを開く ③Element0が表示 されているのを確認

51.

Unityの基本: 色の設定 New Materialを確認 (クリックはしない)

52.

Unityの基本: 色の設定 Element0にドラッグ&ドロップ

53.

Unityの基本: 色の設定 色が反映される

54.

補足: 色を再設定する方法 Cube New Materialを開く

55.

補足: 色を再設定する方法 ここで再度設定可能

56.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加 壁の生成

57.

Nrealを想定したカメラの位置の設定 MainCamera Position 0 0 0

58.

Cubeを並べて壁を作る準備 Cube Assetsにドラッグ&ドロップ

59.

Cubeを並べて壁を作る準備 Cubeが追加される

60.

Cubeを並べて壁を作る準備 Cubeを削除 (右クリック->Delete)

61.

Cubeを並べて壁を作る準備 Cubeがなくなる

62.

Cubeを並べて壁を作る準備 ①空白を右クリック ②Create Emptiy

63.

Cubeを並べて壁を作る準備 ①Game Object

64.

Cubeを並べて壁を作る準備 WallRootにリネーム

65.

Cubeを並べて壁を作る準備 Position を 0 0 2

66.

Cubeを並べて壁を作る Add Component

67.

Cubeを並べて壁を作る 検索欄を空にする New script

68.

Cubeを並べて壁を作る スクリプト名をつける (例: WallScript) Create and Add

69.

Cubeを並べて壁を作る スクリプトが追加される スクリプトファイルはこちら

70.

Cubeを並べて壁を作る スクリプトをダブルクリック

71.

Cubeを並べて壁を作る public class WallScript : MonoBehaviour { // 最初に1回だけ実行される(初期化などに利用) void Start() { } // 毎フレーム実行される (WallScriptでは使用しない) void Update() { } }

72.

Cubeを並べて壁を作る //壁を作るための箱の元データ [SerializeField] GameObject cubePrefab; //壁を構成する箱を全て覚えておく変数 List<GameObject> cubes = new List<GameObject>(); void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { }

73.

Cubeを並べて壁を作る //壁を作るための箱の元データ [SerializeField] GameObject cubePrefab; //壁を構成する箱を全て覚えておく変数 List<GameObject> cubes = new List<GameObject>(); void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { ここにコードを記述 }

74.

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 }

75.

Ctrl + S

76.

Cubeを並べて壁を作る WallRoot CubePrefabが追加される

77.

Cubeを並べて壁を作る Cubeを確認 (クリックはしない)

78.

Cubeを並べて壁を作る CubePrefabにドラッグ&ドロップ

79.

Cubeを並べて壁を作る Cubeに置き換わって いることを確認

80.

動作確認 Play

81.

動作確認 壁が現れる

82.

動作確認 停止

83.

壁の位置を整える WallRoot Position -0.4 -0.2 2

84.

動作確認 Play

85.

動作確認 壁が中央に来る

86.

動作確認 停止

87.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加 カラフルに

88.
[beta]
壁をカラフルにする
//壁を作るための箱の元データ
[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

89.

壁をカラフルにする [SerializeField] GameObject cubePrefab; //壁を構成する箱を全て覚えておく変数 List<GameObject> cubes = new List<GameObject>(); //色のリスト Color[] colors = { /*中略*/}; void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { ここのコードを編集 }

90.

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 }

91.

動作確認

92.

動作確認 停止

93.

壁をリセットする機能を実装 List<GameObject> cubes = new List<GameObject>(); Color[] colors = { /*中略*/}; void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { /*中略*/ } pubic void ResetWall() { }

94.

壁をリセットする機能を実装 List<GameObject> cubes = new List<GameObject>(); Color[] colors = { /*中略*/}; void Start() { InitializeWall(); } //箱を並べて壁を作る void InitializeWall() { /*中略*/ } pubic void ResetWall() { ここのコードを編集 }

95.

壁をリセットする機能を実装 public void ResetWall() { //箱オブジェクトを1つ1つ削除 for (int i = 0; i < cubes.Count; i++) { DestroyImmediate(cubes[i]); } //全箱オブジェクトを覚えるリストを空にする cubes.Clear(); //壁の初期化 InitializeWall(); } ハンズオンの 最後に使います 03.txt

96.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

97.

NRSDKをインストールする準備 File

98.

NRSDKのインストールする準備 Build Settings

99.

NRSDKのインストールする準備 Android

100.

NRSDKのインストールする準備 Switch Platform

101.

NRSDKのインストールする準備 閉じる

102.

NRSDKのインストール ダブルクリック

103.

NRSDKのインストール Import

104.

NRSDKのインストール 全てFix

105.

NRSDKのインストール Close Window

106.

NRSDKのインストール NRSDKが追加されている

107.

Nreal用カメラの設定 Main Cameraを削除

108.

Nreal用カメラの設定 NRSDK → Prefabs

109.

Nreal用カメラの設定 NRCameraRig

110.

Nreal用カメラの設定 Hierarchyにドラッグ&ドロップ

111.

Nreal用カメラの設定 NRCameraRigが追加されている

112.

動作確認 [W][S] : 前後移動 [A][D] : 左右移動 [Space]+ドラッグ:首振り

113.

動作確認 停止

114.

実機インストール File

115.

実機インストール Build Settings

116.

実機インストール Player Settings

117.

実機インストール Other Settings Package Nameが com.会社名.アプリ名 となっていることを確認

118.

実機インストール Write Permissionを External(SDCard)

119.

実機インストール 閉じる

120.

実機インストール Build And Run

121.

実機の動作の様子

122.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

123.

ハンドトラッキング NRSDK → Prefabs

124.

ハンドトラッキング NRInput

125.

ハンドトラッキング Hierarchyにドラッグ&ドロップ

126.

ハンドトラッキング NRInputが追加されている

127.

ハンドトラッキング NRInput Input Source Typeの ドロップダウンメニュー

128.

ハンドトラッキング Handsを選択

129.

ハンドトラッキング NRInputを開く

130.

ハンドトラッキング このあとRight/Leftに手を追加

131.

ハンドトラッキング Handsを開く

132.

ハンドトラッキング NRHand_R

133.

ハンドトラッキング Rightにドラッグ&ドロップ NRHand_R

134.

ハンドトラッキング Rightの子要素として追加される

135.

ハンドトラッキング Leftにドラッグ&ドロップ NRHand_L

136.

ハンドトラッキング Leftの子要素として追加される

137.

動作確認 Play [左Shift]:手を表示 [左クリック]:ピンチ(つまむ) [右クリック]:指差し

138.

動作確認 停止

139.

実機で動作確認 Files Build And Run

140.

実機の動作の様子

141.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

142.

弾を作成 空白を右クリック 3Dオブジェクト Sphere

143.

弾を作成 Sphereをダブルクリック

144.

弾を作成 Bulletにリネーム

145.

弾を作成 Scale 0.2 0.2 0.2

146.

弾を作成 Assets

147.

弾を作成 Bullet Assetsにドラッグ&ドロップ

148.

弾を作成 Bulletが追加される

149.

弾を作成 Bulletを削除

150.

弾を撃つ ①NRHand_R ②AddComponent

151.

弾を撃つ New script

152.

弾を撃つ スクリプト名を設定 (例:TriggerScript) Create and Add

153.

弾を撃つ TriggerScriptが追加される スクリプトのファイルはこちら

154.

弾を撃つ ダブルククリック

155.

弾を撃つ public class TriggerScript : MonoBehaviour { // 最初に1回だけ実行 (TriggerScriptでは不使用) void Start() { } // 毎フレーム実行される void Update() { } }

156.

弾を撃つ public class TriggerScript : MonoBehaviour { // 最初に1回だけ実行 (TriggerScriptでは不使用) void Start() { } // 毎フレーム実行される void Update() { } } 削 除

157.

弾を撃つ using System.Collections; using System.Collections.Generic; using UnityEngine; //NRSDKの読み込み using NRKernal; public class TriggerScript : MonoBehaviour { // 毎フレーム実行される void Update() { } } 04.txt

158.

弾を撃つ //弾の元になる情報 [SerializeField] GameObject bulletPrefab; //右手か左手かを保持 public HandEnum handEnum; //発射許可のOn/Off bool shoot = true; //発射された弾 GameObject bullet; // 毎フレーム実行される void Update() { 05.txt }

159.

弾を撃つ void Update() { UpdateGesture(); } //手の状態を監視して弾を発射 void UpdateGesture() { //手の情報を取得 var handState = NRInput.Hands.GetHandState(handEnum); //手が検出されなければ戻る if (handState == null) return; このあと、ピンチ状態を監視して弾を発射 }

160.

弾を撃つ //親指と人差し指がある程度近づいた場合かつ発射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 }

161.

Ctrl + S

162.

弾を撃つ Bulletを確認 (クリックはしない)

163.

弾を撃つ Bullet Prefabに追加

164.

動作確認 ピンチをした座標に球が配置される

165.

動作確認 停止

166.

弾を撃つ void UpdateGesture() { //手の情報を取得 var handState = NRInput.Hands.GetHandState(handEnum); //手が検出されなければ戻る if (handState == null) return; if (handState.pinchStrength > 0.6 && !shoot) { ここにコードを追加して弾を飛ばす } else if (!handState.isPinching) { shoot = false; } }

167.
[beta]
弾を撃つ
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

168.

Ctrl + S

169.

弾を撃つ ①Bulletをクリック ②Add Component

170.

弾を撃つ ①Rigidbodyで検索 ②Rigidbodyをクリック

171.

弾を撃つ ①Rigidbody ②Use GravityをOFF

172.

動作確認 ピンチをすると球が発射される

173.

動作確認 停止

174.

壁を壊せるようにする Cubeをクリック AddComponent

175.

壁を壊せるようにする Rigidbody

176.

壁を壊せるようにする ①Rigidbody ②Use GravityをOFF

177.

動作確認

178.

ハンズオン手順  Unityの使い方の基本  スクリプトを用いた壁の作成  NRSDKの導入  ハンドトラッキングの設定  弾の発射  リセットボタンの追加

179.

リセットボタン ダブルクリック

180.

リセットボタン Import

181.

リセットボタン Hierarchyに ドラッグ&ドロップ Canvas

182.

リセットボタン Canvasを開く

183.

リセットボタン Buttonをクリック

184.

リセットボタン Buttonを見つける On Clickを見つける

185.

リセットボタン WallRootを見つける (クリックしない)

186.

リセットボタン OnClickにドラッグ&ドロップ

187.

リセットボタン ドロップダウンメニューを開く

188.

リセットボタン ②ResetWall ①WallScript

189.

リセットボタン

190.

リセットボタン NRInput → Right → NRHand_R → LaserRaycaster

191.

リセットボタン Mask Type: Inclusive Mask: UI

192.

完成!

193.

参考 • クイックスタート 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