Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
ARコンテンツ作成勉強会
はじめようARCore
自己紹介
氏名:吉永崇(Takashi Yoshinaga)
所属:九州先端科学技術研究所(ISIT)
専門:ARを用いた医療支援や運動計測
コミュニティ:ARコンテンツ作成勉強会 主催
ARコンテンツ作成勉強会の紹介
 2013年5月に勉強会をスタートし、100回以上開催
 ARコンテンツの作り方をハンズオン形式で学ぶ
 人数は5~10名程度の少人数で実施
 参加条件はAR/VRに興味がある人(知識不要)
 各地で開催 (福岡、熊本、宮崎、長崎、大分、 鹿児島、山口、広島、関東)
Twitterと勉強会ページで情報を発信しています
#AR_Fukuoka Googleで「AR勉強会」で検索
ARCore
Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。
【主要機能】
(1) 自己位置推定 (Motion Tracking)
(2) 平面認識 (Environmental Understanding)
(3) 明るさ推定 (Light Estimation)
(4) マーカー認識 (Augmented Image)
(5) 空間共有 (Cloud Anchor)
(6) 顔認識 (Augmented Faces) ← New!
今日の内容 (1/2)
Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。
【主要機能】
(1) 自己位置推定 (Motion Tracking)
(2) 平面認識 (Environmental Understanding)
(3) 明るさ推定 (Light Estimation)
(4) マーカー認識 (Augmented Image)
(5) 空間共有 (Cloud Anchor)
(6) 顔認識 (Augmented Faces) ← New!
マーカー認識や空間共有についてはこちらをどうぞ
https://www.slideshare.net/ssuserc0d7f
b/arcore-108717431
事前準備
• Unity2017.4.15 or later
• ARCore SDK 1.7
https://github.com/google-ar/arcore-
unity-sdk/releases/tag/v1.7.0
• Sample
http://arfukuoka.lolipop.jp/arcore_pan
asonic/sample.zip
今日の内容 (2/2)
① CGを表示 ② 平面検出とCGの配置
③ 空間にドローイング ④ 顔認識
開発ツール:Unity
Unityとは
 マルチプラットフォーム対応のゲームエンジンおよび開発環境
 GUI上で視覚的にCGを配置したり機能を追加したりできる
 C#によるプログラミングで細かい挙動も記述可能
 アセットストアで高品質なCGやアニメーションを入手できる
Unityのプロジェクトを作成 (1/2)
Unityを起動後、画面右上のNEWをクリック
New
Unityのプロジェクトを作成 (2/2)
プロジェクト名・保存場所・3Dを指定してCreate project
3D
最後にクリック
プロジェクト名
保存場所
まずはUnityの簡単な使い方
Unityの操作画面(概要)
ゲーム空間の設計画面
ゲーム空間にCGを追加しよう
右クリック
3DObject → Cube
実行してみよう
クリックして実行
クリックして終了
カメラから見た空間
オブジェクトの位置・向き・サイズを調整
クリックして選択
移動 回転 拡大・縮小
Scene(設計画面)の視点を変えよう
[←] [→]で左右移動
[↑][↓]でズームイン/アウト
[Alt]+ドラッグで回転
+ドラッグで上下左右
CGの詳細情報の編集:位置の指定
 オブジェクトの詳細の表示・追加・変更
はInspectorで行う
 例えば、TransformのPositionを
変更すると位置が変わる
Positionを0 0 0に変更
CGの詳細情報の編集:色の設定 (1/3)
②右クリック
③Create
マテリアル(色や質感の設定)を作成
④Material
①Assets
CGの詳細情報の編集:色の設定 (2/3)
作成したマテリアルの色(Albedo)を設定
(2) Albedoの右側をクリックし、色を選択
(1)作成したマテリアルをクリック
CGの詳細情報の編集:色の設定 (3/3)
オブジェクト(Cube)のマテリアルを開き、作成したマテリアルを割り当て
(2) Materialsの横の▼
(1)Cube
(3) Element0に
ドラッグ&ドロップ
確認
色が反映されていればOK。あとから色の変更も可能。
CGの詳細情報の編集:挙動の追加
スクリプト(プログラム)を記述することによりオブジェクトの挙動を表現
(2) Add Component
(1)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);
}
}
一旦、現状を保存
①File
②Save Scene as...
一旦、現状を保存
①新規フォルダー
③sample1フォルダを開き
コンテンツ名を入力
(例:sample1)
④保存
以降はCtrl + Sで現状のコンテンツ(Scene)を保存
②新しいフォルダ名をSample1に変更
不要なCGの削除
Delete
Cubeを選択して[Delete]キー
Next: 自己位置推定(Motion Tracking)
ARCoreのインポート
①Assets
②Import Package
→ Custom Package
③arcore-unity-sdk-xxx
④開く
ARCore用のカメラの設定(1/2)
Main Cameraを削除
ARCore用のカメラの設定(2/2)
①GoogleARCore → Prefabs
② ARCore Device
③ドラッグ&ドロップ
表示オブジェクトの追加(1/2)
①GoogleARCore → Examples → Common → Prefabs
② Andy Green Diffuse
③ドラッグ&ドロップ
表示オブジェクトの追加(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※
※
今後はInternalは無くなる
予定。Gradleについても
調査して後日共有します。
ビルドの準備
①Product Nameを入力
② Resolution and Presentation
③ Default OrientationをLandscape Left
※画面を自動で回転させたくない場合のみ向きを固定
ビルドの準備
① Other Settings
② Multithreaded Renderingをオフ※
※最新版ではオフにしなくてもOKのようなので、ビルドエラーにならないならオンのままで問題なし
ビルドの準備
①Package Nameを設定
例) com.arfukuoka.test1
② Minimum API Levelを
Android 7.0に設定
ビルドの準備
①XR Settings
② ARCore Supportedをオン
ビルドと実機インストール
①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/4)
①空白を右クリック
② Create Empty
認識した平面の可視化 (2/4)
①GameObjectの名前を
Controllerに変更
認識した平面の可視化 (3/4)
①Controllerをクリック
②AddComponent
③Detected Plane Generator
認識した平面の可視化 (4/4)
①GoogleARCore → Examples → Common → Prefabs
③DetectedPlaneVisualizer
②Controller
④Detected Plane
Prefabにドラッグ&ドロップ
動作確認
水平面
垂直面
タップした平面にCGを置く
①Controller
②Add Component
タップした平面にCGを置く
①New Script
③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 () {
//タッチしていないならreturn
if (Input.touchCount < 1 ){ return; }
Touch touch = Input.GetTouch(0);
//画面をなぞっていなければreturn
if (touch.phase != TouchPhase.Moved ){ return;}
//タップした座標にAndyを移動。
TrackableHit hit;
TrackableHitFlags filter = TrackableHitFlags.PlaneWithinPolygon;
Frame.Raycast(touch.position.x, touch.position.y, filter, out hit)
}
touch.position
hit
Moved→画面をなぞる
平面を構成するポリゴンの
内側をタップ判定の対象に
スクリプトの記述
void Update () {
//タッチしていないならreturn
if (Input.touchCount < 1 ){ return; }
Touch touch = Input.GetTouch(0);
//画面をなぞっていなければreturn
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;
}
}
※Anchor設定は指を離したときだけで十分。今回はコード量を減らすため同時に行っている
スクリプトとGameObjectのAndyの対応付け
②AndyGreenDiffuse
①Controller
③PutScriptのAndy
にドラッグ&ドロップ
動作確認
Next:空間ドローイング
その前にCtrl+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);
//タッチスタート
if ( Input.GetTouch(0).phase == TouchPhase.Began)
{
drawObj = GameObject.Instantiate(obj, p, Quaternion.identity);
}
//押下中
else if (Input.GetTouch(0).phase == TouchPhase.Stationary){
drawObj.transform.position = p;
}
}
}
変数とCGの対応付け
②Controller
①Sample2
④Objにドラッグ&ドロップ
③GameObject
動作確認
線を消す
List<GameObject> lines = new List<GameObject>();
void Update () {
if (Input.touchCount == 1)
{//カメラ手前10cmの位置を取得
Vector3 p = Camera.main.transform.TransformPoint(0,0,0.1f);//タ
if ( Input.GetTouch(0).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 (Input.GetTouch(0).phase == TouchPhase.Stationary){
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();
}
}
}
Next:顔認識(Augmented Faces)
Next Step
その前にCtrl+Sで現状を保存
下準備 (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 Facingに変更
顔認識を許可
②sample3.asset①sample3
③Augmented Face Mode
顔にメッシュを貼り付ける
②CreateEmpty
①右クリック
顔にメッシュを貼り付ける
GameObjectの名前をFaceMeshに変更
顔にメッシュを貼り付ける
①FaceMesh
②Add Component
顔にメッシュを貼り付ける
①Faceで検索
②ARCore Augmented
Face Mesh Filter
顔にメッシュを貼り付ける
Auto Bindをオン
※検出した顔に自動的にメッシュをアタッチする
メッシュの見た目の設定
①FaceMesh
②Add Coponent
メッシュの見た目の設定
②Mesh
③MeshRenderer
①消す
メッシュの見た目の設定
①Sample3
③Create
②右クリック
④Material
メッシュの見た目の設定
NewMaterialができていればOK
Augmented Faces
②NewMaterial
①FaceMesh
②Materials内のElement0にドラッグ&ドロップ
動作確認
顔メッシュにテクスチャ画像を適用
③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を追加
顔のパーツの位置情報を使用
パーツの位置の調整
① FOREHEAD_LEFT
の子要素のSphereを選択
② PositionのY=-0.04
パーツの位置の調整
① FOREHEAD_RIGHT
の子要素のSphereを選択
② PositionのY=-0.04
はじめようARCore:自己位置推定・平面検出・FaceTracking
今日の内容
Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。
【主要機能】
(1) 自己位置推定 (Motion Tracking)
(2) 平面認識 (Environmental Understanding)
(3) 明るさ推定 (Light Estimation)
(4) マーカー認識 (Augmented Image)
(5) 空間共有 (Cloud Anchor)
(6) 顔認識 (Augmented Faces) ← New!
Fin.

More Related Content

はじめようARCore:自己位置推定・平面検出・FaceTracking