狠狠撸

狠狠撸Share a Scribd company logo
ARコンテンツ作成勉強会in札幌
はじめようARCore
自己紹介
氏名:吉永崇(Takashi Yoshinaga)
所属:九州先端科学技術研究所(ISIT)
専門:ARを用いた医療支援や運動計測
コミュニティ:ARコンテンツ作成勉強会 主催
ARコンテンツ作成勉強会の紹介
? 2013年5月に勉強会をスタートし
? ARコンテンツの作り方をハンズオン形式で学ぶ
? 人数は5~10名程度の少人数で実施
? 参加条件はAR/VRに興味がある人(知識不要)
? 各地で開催 (福岡、熊本、宮崎、長崎、大分、 鹿児島、山口、広島、関東)
Twitterと勉強会ページで情報を発信しています
#AR_Fukuoka Googleで「AR勉強会」で検索
#DoMCN
または
#AR_Sapporo
今日のハッシュタグ
Special Thanks
@jun_mh4g
(DoMCN)
@gyawan24
(13LABO)
さっそく本题
ARCore
Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。
【主要機能】
(1) 自己位置推定 (Motion Tracking)
(2) 平面認識 (Environmental Understanding)
(3) 明るさ推定 (Light Estimation)
(4) マーカー認識 (Augmented Image)
(5) 空間共有 (Cloud Anchor)
(6) 顔認識 (Augmented Faces)
今日の内容
Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。
【主要機能】
(1) 自己位置推定 (Motion Tracking)
(2) 平面認識 (Environmental Understanding)
(3) 明るさ推定 (Light Estimation)
(4) マーカー認識 (Augmented Image)
(5) 空間共有 (Cloud Anchor)
(6) 顔認識 (Augmented Faces)
開発ツール:Unity
Unityとは
? マルチプラットフォーム対応のゲームエンジンおよび開発環境
? GUI上で視覚的にCGを配置したり機能を追加したりできる
? C#によるプログラミングで細かい挙動も記述可能
? アセットストアで高品質なCGやアニメーションを入手できる
今日の内容
① CGを表示 ② 平面検出とCGの配置
③ 空間にドローイング ④ 顔認識
事前準備
? Unity2017.4.26 or later
https://unity3d.com/jp/unity/qa/lts-
releases
? ARCore SDK 1.7
https://github.com/google-ar/arcore-
unity-sdk/releases/tag/v1.11.0.1
? Sample
http://arfukuoka.lolipop.jp/ARCore_Sa
pporo/sample.zip
Unityのプロジェクトを作成 (1/2)
Unityを起動後、画面右上のNEWをクリック
New
Unityのプロジェクトを作成 (2/2)
プロジェクト名?保存場所?3Dを指定してCreate project
プロジェクト名
保存場所
3D
Create project
まずは鲍苍颈迟测の简単な使い方
Unityの操作画面(概要)
ゲーム空間の設計画面
ゲーム空間にCGを追加しよう
何も選択されていない状態にする
※青くハイライトになっていなければOK
ゲーム空間にCGを追加しよう
空白を右クリック
ゲーム空間にCGを追加しよう
①3DObject
②Cube
実行してみよう
カメラから見た空間
①クリックして実行
②クリックして終了
オブジェクトの位置?向き?サイズを調整
移動 回転 拡大?縮小
クリックして選択
Scene(設計画面)の視点を変えよう
[←] [→]で左右移動
[↑][↓]でズームイン/アウト
[Alt]+ドラッグで回転
+ドラッグで上下左右
ところで
オブジェクトの位置?向き?サイズは
マウス操作で直感的に操作できるけど、
数値を用いた具体的な設定は?
CGの詳細情報の編集:位置の指定
? オブジェクトの詳細の表示?追加?変更はInspectorで行う
? 例えば、TransformのPositionを変更すると位置が変わる
②Inspectorが表示される
①Cube
CGの詳細情報の編集:位置の指定
位置とサイズを変更
Position 0 0 0
Scale 1 1 1
座標系
Y
ZX
Unityでは横はX、奥行方向がZ、そして地面に対して垂直がY
さらに
Inspectorで操作できる詳細情報には
位置?角度?サイズ以外にも見た目(色や質感)
なども含まれる
CGの詳細情報の編集:色の設定 (1/3)
マテリアル(色や質感の設定)を作成
②右クリック
①Assets
CGの詳細情報の編集:色の設定 (1/5)
マテリアル(色や質感の設定)を作成
①Create
②Material
CGの詳細情報の編集:色の設定 (2/5)
作成したマテリアルの色(Albedo)を設定
②Albedoの右側をクリック
①作成したマテリアルをクリック
CGの詳細情報の編集:色の設定 (3/5)
好きな色を選択
CGの詳細情報の編集:色の設定 (4/5)
②Materialsの横の▼
①Cube
②Element0の場所を確認
CGの詳細情報の編集:色の設定 (5/5)
①New Materialに注目
※まだクリックしない
②Element0にドラッグ&ドロップ
確認
色が変わっていればOK
あとでここから変更も可能
さらにさらに
Inspectorで操作できる詳細情報には
位置?角度?サイズ?見た目以外にも
オブジェクトの動きなども含まれる
スクリプトを书こう
CGの詳細情報の編集:挙動の追加
②AddComponent
①Cube
CGの詳細情報の編集:挙動の追加
New Script
スクリプト名
Create and Add
CGの詳細情報の編集:挙動の追加
スクリプトが追加された
CGの詳細情報の編集:挙動の追加
ここをダブルクリック
スクリプトを使って立方体を回転
public class NewBehaviourScript : MonoBehaviour {
// 初期化のために初回に一回だけ実行される
void Start () {
}
// 毎フレーム(数10ミリ秒おきに)実行される
void Update () {
}
}
スクリプトを使って立方体を回転
public class NewBehaviourScript : MonoBehaviour {
// 初期化のために初回に一回だけ実行される
void Start () {
}
// 毎フレーム(数10ミリ秒おきに)実行される
void Update () {
//毎フレームY軸を中心に1度ずつ回転
transform.Rotate(0, 1, 0, Space.Self);
}
}
Selfの場合
一旦、現状を保存
①File
②Save As...
※Unity2017の場合は
Save Scene as
一旦、現状を保存
①新規フォルダー
③sample1フォルダを開き
コンテンツ名を入力
(例:sample1)
④保存
以降はCtrl + Sで現状のコンテンツ(Scene)を保存
②新しいフォルダ名をSample1に変更
不要なCGの削除
Cubeを選択して[Delete]
Next: 自己位置推定(MotionTracking)
ARCoreのインポート
①Assets
②Import Package
→ Custom Package
③arcore-unity-sdk-xxx
④開く
ARCoreのインポート
import
ARCoreのインポート
GoogleARCoreが追加されていればOK
ARCore用のカメラの設定(1/2)
Main Cameraを削除
ARCore用のカメラの設定(2/2)
①GoogleARCore → Prefabs
② ARCoreDevice
③Hierarchyにドラッグ&ドロップ
表示オブジェクトの追加(1/2)
①GoogleARCore → Examples → Common → Prefabs
② AndyGreenDiffuse
③ドラッグ&ドロップ
表示オブジェクトの追加(2/2)
①AndyGreenDiffuse
② Positionの
yを-0.1[m]
zを0.5[m]
③ Scaleを1~3くらいに
(20~60cmくらい)
※ARCoreではアプリ立ち上げ時のスマホの位置が0 0 0となります
実机にインストール
ビルドの準備
①File
② Build Settings
ビルドの準備
②Switch Platform
① Android
ビルドの準備
②Player Settings
① Internal
ビルドの準備
①Product Nameを入力
② Resolution and Presentation
ビルドの準備
DefaultOrientationをLandscape Left
ビルドの準備
Other Settings
ビルドの準備
①Package Nameを設定
例) com.arfukuoka.test1
② Minimum API Levelを
Android 7.0に設定
ビルドの準備
①XR Settings
②ARCoreSupportedをオン
ビルドと実機インストール
①File
② Build & Run
ビルドと実機インストール
①インストーラー(apk)の名前を設定
② 保存
动作确认
Next: 平面検出(Environmental Understanding)
Environmental Understandingを有効化(1/5)
①Sample1
②右クリック
Environmental Understandingを有効化(2/5)
①Create
③GoogleARCore
④SessionConfig
Environmental Understandingを有効化(3/5)
ファイル名を変更(例:sample1)
Environmental Understandingを有効化(4/5)
①sample1.assetをクリック
【Plane Finding Mode】
(1)Disabled:平面認識なし
(2)Horizontal And Vertical:
水平面と垂直面を認識
(3)Horizontal:
水平面のみ認識
(4)Vertical
垂直面のみ認識
今回は(2)~(4)から好きなのを選択
Environmental Understandingを有効化(5/5)
①ARCore Deviceを選択
②Sample1フォルダ
③sample1.assetに注目
※まだクリックしない
④Session Configに
ドラッグ&ドロップ
認識した平面の可視化 (1/6)
空白をクリックして何も
選択されていない状態に
認識した平面の可視化 (2/6)
①空白を右クリック
②Create Empty
認識した平面の可視化 (3/6)
GameObjectの名前を
Controllerに変更
認識した平面の可視化 (4/6)
①Controllerをクリック
②AddComponent
③Detected Plane Generator
認識した平面の可視化 (5/6)
①GoogleARCore → Examples → Common → Prefabs
②DetectedPlaneVisualizer
認識した平面の可視化 (6/6)
②DetectedPlaneVisualizerに注目
①Controller
③Detected Plane
Prefabにドラッグ&ドロップ
現状を保存
ctrl/command + S
动作确认
水平面
垂直面
タップした平面にCGを置く
①Controller
②Add Component
タップした平面にCGを置く
②NewScript
④Create and Add
③PutScript
①検索ワードを削除
タップした平面にCGを置く
①Controller
②PutScriptを
ダブルクリック
スクリプトの記述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
public class PutScript : MonoBehaviour {
public GameObject andy; //CG(Andy)を扱う変数
void Start () {
}
void Update () {
//タップの検出
//タップした画面の座標と3D空間座標の対応付け
//Andyをその位置に置く
}
}
スクリプトの記述
void Update () {
//タッチしていないなら
if (Input.touchCount < 1 ){ return; }
Touch touch = Input.GetTouch(0);
//画面をなぞっていなければ
if (touch.phase != TouchPhase.Moved ){ return;}
//タップした座標にAndyを移動。
TrackableHit hit;
TrackableHitFlags filter = TrackableHitFlags.PlaneWithinPolygon;
if(Frame.Raycast(touch.position.x, touch.position.y, filter, out hit) )
{
//Andyの3D座標を指定するコードを記述(次頁)
}
}
touch.position
hit
Moved→画面をなぞる
平面を構成するポリゴンの
内側をタップ判定の対象に
スクリプトの記述
if (Frame.Raycast(touch.position.x, touch.position.y, filter, out hit))
{
//平面にヒットしたならAndyを置く
if (hit.Trackable is DetectedPlane)
{
//Andyの位置?姿勢を指定
andy.transform.position = hit.Pose.position;
andy.transform.rotation = hit.Pose.rotation;
andy.transform.Rotate(0, 180, 0, Space.Self);
//Anchorを設定
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
andy.transform.parent = anchor.transform;
}
}
スクリプトとGameObjectのAndyの対応付け
②AndyGreenDiffuseに注目
①Controllerをクリック
③PutScriptのAndy
にドラッグ&ドロップ
現状を保存
ctrl/command + S
动作确认
狈别虫迟:空间ドローイング
下準備 (1/6)
Sample1を選択し、Ctrl +D
下準備 (2/6)
②ファイル名をそれぞれsample2に変更①sample2
下準備 (3/6)
①sample2.unityをダブルクリック
②sample2になったことを確認
下準備 (4/6)
①ARCoreDevice
②sample2.asset
③Session Configに
ドラッグ&ドロップ
下準備 (5/6)
Andy Dffuseを削除
下準備 (6/6)
①Controller
②PutScript右の
③Remove Component
トラッキングが安定していることを
目視で確認するため
平面認識機能のみ残しておいた
TrailRendererを用いた線描画
①空白を右クリック
②Create Empty
TrailRendererを用いた線描画
①GameObject
②Add Component
TrailRendererを用いた線描画
Trailと入力
【Trail Renderer】
■Material
前半で作ったマテリアル
をElementに追加
■Time
Infinityに変更
■MinVertexDistance
0.03
■Width
0.01
Trail Rendererを
ダブルクリック
TrailRendererを用いた線描画
ShaderをSprites/Defaultに変更
①GameObject
动作确认
実行
动作确认
①Scene
GameObjectを移動すると軌跡が残る
②GameObject
动作确认
停止
TrailRendererを用いた線描画
②GameObject
①Sample2
③ドラッグ&ドロップ
TrailRendererを用いた線描画
GameObject削除
TrailRendererを用いた線描画
①Controller
②AddComponent
TrailRendererを用いた線描画
①New Script
③Create and Add
②DrawScript
TrailRendererを用いた線描画
①Controller
②DrawScriptを
ダブルクリック
スクリプトの記述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
public class DrawScript : MonoBehaviour {
public GameObject obj; //軌跡を描くオブジェクトの元データ
GameObject drawObj; //実際の軌跡描画に使うオブジェクト
void Start () {
}
void Update () {
//タップの検出
//タップ開始時に線を描くオブジェクトを生成
//その後はスマホの位置にオブジェクトを追従させて線描画
}
}
スクリプトの記述
void Update () {
if (Input.touchCount == 1)
{
//カメラ手前10cmの位置を取得
Vector3 p = Camera.main.transform.TransformPoint(0,0,0.1f);
//タッチスタート
TouchPhase phase = Input.GetTouch(0).phase;
if (phase == TouchPhase.Began)
{
drawObj = GameObject.Instantiate(obj, p, Quaternion.identity);
}
//押下中
else if (phase == TouchPhase.Stationary || phase == TouchPhase.Moved){
drawObj.transform.position = p;
}
}
}
変数とCGの対応付け
②Controller
①Sample2
④Objにドラッグ&ドロップ
③GameObject
現状を保存
ctrl/command + S
动作确认
線を消す
List<GameObject> lines = new List<GameObject>();
void Update () {
if (Input.touchCount == 1)
{//カメラ手前10cmの位置を取得
Vector3 p = Camera.main.transform.TransformPoint(0,0,0.1f);//
TouchPhase phase = Input.GetTouch(0).phase;
if ( phase == TouchPhase.Began)
{
drawObj = GameObject.Instantiate(obj, p, Quaternion.identity);
GameObject tmp
= GameObject.Instantiate(obj, p, Quaternion.identity);
lines.Add(tmp);
drawObj = tmp;
} //押下中
else if (phase == TouchPhase.Stationary || phase == TouchPhase.Moved){
drawObj.transform.position = p;
}
}
}
線を消す
void Update () {
if (Input.touchCount == 1)
{
//線の描画をする/カメラ手前10cmの位置を取得
}
else if (Input.touchCount == 2)
{
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
for(int i = 0; i < lines.Count; i++)
{
Destroy(lines[i]);
lines[i] = null;
}
lines.Clear();
}
}
}
ctrl/command + S
そして动作确认。
指二本でタップすると線が消えます
Next:顔認識(Augmented Faces)
下準備 (1/6)
Sample2を選択し、Ctrl +D
下準備 (2/6)
②ファイル名をそれぞれsample3に変更①sample3
下準備 (3/6)
①sample3.unityをダブルクリック
②sample3になったことを確認
下準備 (4/6)
①ARCoreDevice
②sample3.asset
③Session Configに
ドラッグ&ドロップ
下準備 (5/6)
GameObject削除
下準備 (6/6)
Controllerを削除
フロントカメラを使用
①ARCoreDevice
②Device Camera Direction
をFront 贵补肠颈苍驳に変更
平面認識をOff
②sample3.asset
③PlanbeFindingMode
をDisabledに変更
①sample3
④LightEstimation Mode
をDisabledに変更
顔認識を許可
①sample3.asset
②AugmentedFaceMode
をMeshに変更
顔にメッシュを貼り付ける
②CreateEmpty
①空白を右クリック
顔にメッシュを貼り付ける
GameObjectの名前をFaceMeshに変更
顔にメッシュを貼り付ける
①FaceMesh
②Add Component
顔にメッシュを貼り付ける
①Faceで検索
②ARCore Augmented
Face Mesh Filter
顔にメッシュを貼り付ける
Auto Bindをオン
※検出した顔に自動的にメッシュをアタッチする
メッシュの見た目の設定
①FaceMesh
②Add Coponent
メッシュの見た目の設定
②Mesh
③MeshRenderer
①消す
メッシュの見た目の設定
①Sample3
③Create
②右クリック
④Material
メッシュの見た目の設定
NewMaterialができてるはず
Augmented Faces
②NewMaterialに注目
①FaceMesh
②Materials内のElement0にドラッグ&ドロップ
現状を保存
ctrl/command + S
动作确认
顔メッシュにテクスチャ画像を適用
②NewMaterialをクリック
①Sample3
顔メッシュにテクスチャ画像を適用
③Texture
※Transparentを選べば
透過画像も使用可能
②Unlit
①Shader
顔メッシュにテクスチャ画像を適用
③ドラッグ&ドロップ
①Sampleフォルダ
①Sample3
顔メッシュにテクスチャ画像を適用
①NewMaterial
顔メッシュにテクスチャ画像を適用
②ドラッグ&ドロップ
①meshに注目
动作确认 & Memo
マス目と出力結果を見比べれば顔の中の位置とのおよその対応付けが可能
颜のパーツの位置情报を使用
FOREHEAD_LEFT FOREHEAD_RIGHT
NOSE_TIP
今のところ、取得できるのはFOREHEAD_LEFT/RIGHTとNOSE_TIPの3点
颜のパーツの位置情报を使用
②CreateEmpty
①右クリック
颜のパーツの位置情报を使用
GameObjectの名前をFacePartsに変更
颜のパーツの位置情报を使用
①FaceParts
②Add Compornent
颜のパーツの位置情报を使用
①Faceで検索
②ARCore Augmented
Face Rig
颜のパーツの位置情报を使用
①Auto Bind
颜のパーツの位置情报を使用
①FacePartsを開く
②NOSE_TIP,FOREHEAD_LFT/RIHGT
が追加されていることを確認
颜のパーツの位置情报を使用
①NOSE_TIPを右クリック
②3D Object
③Sphere
颜のパーツの位置情报を使用
①Sphere
②Transformを編集
Position: 全て 0
Scale: 全て 0.04
颜のパーツの位置情报を使用
同じ要領でFOREHEADの
RIGHTとLEFTの子要素にも
Sphereを追加
現状を保存
ctrl/command + S
颜のパーツの位置情报を使用
パーツの位置の調整
① FOREHEAD_LEFT
の子要素のSphereを選択
② PositionのY=-0.04
パーツの位置の調整
① FOREHEAD_RIGHT
の子要素のSphereを選択
② PositionのY=-0.04
はじめようARCore in 札幌
今日の内容
Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。
【主要機能】
(1) 自己位置推定 (Motion Tracking)
(2) 平面認識 (Environmental Understanding)
(3) 明るさ推定 (Light Estimation)
(4) マーカー認識 (Augmented Image)
(5) 空間共有 (Cloud Anchor)
(6) 顔認識 (Augmented Faces)
さらに勉强を続けてできること
ARCoreの機能
Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。
【主要機能】
(1) 自己位置推定 (Motion Tracking)
(2) 平面認識 (Environmental Understanding)
(3) 明るさ推定 (Light Estimation)
(4) マーカー認識 (Augmented Image)
(5) 空間共有 (Cloud Anchor)
(6) 顔認識 (Augmented Faces)
この辺も使えるようになる
ARCore × OpenCV
https://youtu.be/E5Jy4iunpyQ https://youtu.be/MviBGZtiv5A
ARCore × OpenCV
https://youtu.be/a8o1ieL01_w
简易贬惭顿の础谤测锄辞苍
简易贬惭顿の础谤测锄辞苍
https://youtu.be/D1ubI9ye8aU
ARCoreハンズオン資料
? ARCoreハンズオン (自己位置推定/マーカー認識/Cloud Anchor)
/ssuserc0d7fb/arcore-
108717431
? 塗り絵AR
/ssuserc0d7fb/opencvarcore
unityar
? スタンプAR
/ssuserc0d7fb/openar-
152506475
? 簡易HMD Aryzon
/ssuserc0d7fb/aryzonar-
141441121
はじめようARCore in 札幌

More Related Content

はじめようARCore in 札幌