狠狠撸

狠狠撸Share a Scribd company logo
AndroidでARの夢を再び
~ARCoreの導入から応用まで
2018/06/09 株式会社カブク 高橋憲一
@ken1_taka ktaka
株式会社カブク / ソフトウェアエンジニア
高橋憲一
? 携帯向け3Dグラフィクスエンジンや、昔あっ
た某ARアプリの開発に携わる
? 現在はカブクで3Dグラフィクスのレンダリン
グおよび解析エンジンの実装を担当
? 個人的活動としてAR&VRの実験をする傍ら翻
訳本を出したり、技術系雑誌への解説記事を寄
稿するなどしている
VR&AR本の翻訳
Daydreamの章を追加 TangoとARKitの章を追加
今日の内容
? 础搁颁辞谤别についておさらい
? 基本機能
? ARCore 1.2の新機能
? 開発方法
? Java (Sceneform)
? Unity
础搁颁辞谤别についておさらい
ARCoreとは
? AndroidでARアプリを実現するためのGoogle純正ライブラリ
? Android スケールで広く普及を目指す
础搁颁辞谤别の基本3机能
1. Motion tracking (モーショントラッキング)
https://developers.google.com/ar/discover/concepts CC BY 3.0
モーショントラッキング
? ARCoreやARKitを使えるよう
になって一番嬉しいのは…こ
んな風に回り込めること
2. Environmental understanding(環境認識)
https://developers.google.com/ar/discover/concepts CC BY 3.0
平面の検出
? 水平と垂直の平面を認識
? 1.2から垂直面も可能に
Oriented Points
(方向を持っている点)
? 平面として検出できるのは水
平および垂直の面
? ただし、特徴点として検出し
た点の方向を取得することは
できる
? (特徴点が密集しているような
場所だと検出しやすい)
3. Light estimation(光源推定)
https://developers.google.com/ar/discover/concepts CC BY 3.0
光源推定
? 周囲の明るさの変化から光
の強さを推定
? 光の当たる方向は取得でき
ない
光源推定
? 周囲の明るさの変化から光
の強さを推定
? 光の当たる方向は取得でき
ない
ARCore 1.2
で追加された機能
Cloud Anchors
? 複数端末で同じAR空間を共有
? 1つの端末からクラウドを通じ
て他の端末に共有
? Anchorオブジェクト
? 周辺の特徴点
? AndroidだけでなくiOSとも共
有
? iOS用のSDKもある
Just a Line
? Google製のAR空間に落書き
できるアプリ
? Android版とiOS版がある
? Nearbyでペアリングして2台
でAR空間を共有
? ソースは公開されている
https://github.com/googlecreativelab/justaline-android
Just a Line
? Google製のAR空間に落書き
できるアプリ
? Android版とiOS版がある
? Nearbyでペアリングして2台
でAR空間を共有
? ソースは公開されている
https://github.com/googlecreativelab/justaline-android
Cloud Anchorsの大事なこと
? 面倒を見てくれるのは位置と向きのみ
? それを元に開発者が機能を実装する必要あり
? 共有するAnchorの情報はFirebaseやNearby等を使っ
て渡す
Augmented Images
? 指定した画像を認識して、位
置と姿勢をトラッキングする
対応端末
? 1.2でだいぶ増えました
? Xperia XZ1
? Galaxy A5, A7, A8, Note8,
S7, S8, S9
? LG G6, Huawei P20...等
https://developers.google.com/ar/discover/supported-devices
開発方法
Java, C++(NDK), Unity, Unreal Engine, Webの何れでも可能
Javaでの開発
Sceneformについて
Sceneformとは
? 3Dモデルのインポートツール、ARシーンへの組み込み
が簡単にできるライブラリ
? Android 厂迟耻诲颈辞で闯补惫补で开発できます
https://developers.google.com/ar/develop/java/sceneform/
Android開発者に3DグラフィクスとOpenGLを
学ぶことなしにARCoreを駆使する力を与える
最も基本的な手顺
Android Studioに
プラグインをインストールする
? Preferences→Plugins
[Browse repositories]を押し
て
? Google Sceneform Tools
(Beta)をインストール
Polyから3Dモデルを
ダウンロードする
? https://poly.google.com/ か
ら3Dモデルをダウンロード
? 主にARとVRでの活用を目的
とした3Dモデル共有サイト
? CC-BYで使用できるものが多
い
3Dモデルをプロジェクトに
インポート-1
? ダウンロードした
? xxx.png
? xxx.mtl
? xxx.obj
? をSampledataにコピー
3Dモデルをプロジェクトに
インポート-2
? xxx.objを右クリック
→New→Sceneform Asset
の順に選択
? 贵颈苍颈蝉丑を押す
3Dモデルをプロジェクトに
インポート-3
? xxx.sfa, xxx.sfb というファイ
ルが作成される
? 3Dモデルのプレビューが表示
される
? sfbの方はassetsの下に置かれ
る
コード上にロードする
ファイルを記述する
? assetsの下の.sfbファイルを
指定する
ビルドして実行
? 平面をタップして3Dモデルを
配置するために必要な機能が
これだけで一通り完成!
Sceneformの構成要素
? ArFragment
? Renderable
? ModelRenderable
? ViewRenderable
ArFragment
? 端末を動かすことを促すUI?
? 認識平面を示すUI?
? 平面をタップした際のlistner?
? 平面に影を落とす?
ModelRenderable
? 3Dモデルを扱う
ViewRenderable
Android開発者にはおなじみのlayoutのxmlをAR空間上に浮かぶView
として作成できる!
ViewRenderable作成手順
ViewRenderable.builder().setView(this,
R.layout.solar_controls).build();
background
(角丸、半透明の青)
layout xml
API
もっと現実を拡張したい…
そんな時に頼りになるのは
Unity
例1:AR空間でペットを飼う
? 必要な要素
? アニメーションする3Dキャ
ラ
? 物理エンジン
? 弾むボール
? ボールを跳ね返す床面
? 注目してほしいものに向ける
アニメーションする3Dキャラ
? Asset StoreからインポートしてAndyと置き換えでOK
物理エンジンの活用
? 物理法則に沿った振る舞いを
するボール
? ボールを跳ね返す平面
物理法則に沿った振る舞いをす
るボール
? Sphere Collider
? Bouncy
? Rigidbody
? Mass
? Use Gravity
ボールを跳ね返す平面
? Mesh Renderer
? MaterialにSDKにある
PlaneGridを設定
ボールを投げるコード -1
オブジェクトをタップした時
ボールを投げるコード -2
オブジェクトをドラッグ(フリック)開始
ボールを投げるコード -3
オブジェクトをドラッグしている間
ボールを投げるコード -4
オブジェクトのドラッグ終了(指を離した)
3Dオブジェクトとカメラ
の位置関係
① 猫の現在位置
② カメラの現在位置
③ 猫のデフォルト方向のベクト
ル(X, Y, Zで表すと 0, 0, -1)
④ 猫からカメラへの方向のベク
トル
⑤ カメラの方に向かせるための
回転
オブジェクトをカメラの方向に
向ける際の回転
Vector3 GetLookVector () {
? ? Vector3 lookVector =
? ? Camera.main.transform.position -
hitTransform.transform.position;
? ? lookVector.y = 0.0f; // Y軸の差分は無視する
? ? lookVector.Normalize ();
? ? return lookVector;
}
hitTransform.transform.rotation =
? ? ? ? ? ? ? ? ? ? Quaternion.LookRotation (GetLookVector());
例2: 3Dプリント風エフェクト
指定したY座標のX-Z平面でクリッピングするシェーダーの記述と、そのY座標の値
をフレームごとに移動させるスクリプトの組み合わせで実現
追加するシェーダーのプロパティ
? _ConstructY
? クリッピングするY座標の値
? _ConstructGap
? 積層していく際に色を変える境
界の高さ
? _ConstructColor
? 積層していく際の境界の色
詳細は https://www.kabuku.co.jp/developers/ar3d_print
シェーダーのコード-1
if(IN.worldPos.y > _ConstructY + _ConstructGap)
{
discard;
}
描画されないようクリッピングする処理です。
ピクセルのワールド位置のY座標の値が「クリッピングするY座標 + 境
界の高さ」より大きい(クリッピングする位置より高い位置にある)場
合、discardして描画しないようにします。
シェーダーのコード-2
if(IN.worldPos.y < _ConstructY)
{
?xed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
} else {
o.Albedo = _ConstructColor.rgb;
o.Alpha = _ConstructColor.a;
}
ピクセルのワールド位置のY座標の値がクリッピングするY座標より小さい場
合、通常描画の対象としてテクスチャからの色を反映します。Y座標の値以上
の場合、境界部分の描画対象として境界の色を反映します。
最後に…
日本語で質問、相談できるフォーラム
http://bit.ly/vrar_ja
ぜひご登録ください!
日本語で気軽に質問、相
談できるように立ててみ
ました
Googleアカウントがあれ
ば何方でも参加可能です

More Related Content

AndroidでARの夢を再び ?ARCoreの導入から応用まで