Más contenido relacionado
La actualidad más candente (20)
Similar a 【Unite 2018 Tokyo】AndroidでAR〜ARCoreの導入から応用、使う上での勘所まで (20)
Más de UnityTechnologiesJapan002 (20)
【Unite 2018 Tokyo】AndroidでAR〜ARCoreの導入から応用、使う上での勘所まで
- 11. 1. Motion tracking (モーショントラッキング)
https://developers.google.com/ar/discover/concepts CC BY 3.0
- 25. ビルド環境の設定
推奨されるUnityのバージョン: Unity 2017.4 LTS以降
前提: 新規プロジェクトを作成し、Androidのアプリをビルド可能な状態
ARCore SDK for UnityをダウンロードしてUnityにインポートする
https://github.com/google-ar/arcore-unity-sdk/releases/download/v1.1.0/
arcore-unity-sdk-v1.1.0.unitypackage
- 26. Android Player Settings → Other Settings
• Multithreaded Rendering をオフ
• Minimum API Level を Android 7.0 以上にする
• Target API Level は Automatic
- 32. 認識した平面上の位置の取得
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;
Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit)
画面をタップした位置(touch.position)からレイを延ばした先にぶつかる平面、もしくは
Oriented Pointを検出します
raycastFilterには平面とOriented Pointの両方を検出するための値を設定しています
検出した情報は hit に入ってきます
- 38. void surf (Input IN, inout SurfaceOutput o)の中身-1
if(IN.worldPos.y > _ConstructY + _ConstructGap)
{
discard;
}
描画されないようクリッピングする処理です。
ピクセルのワールド位置のY座標の値が「クリッピングするY座標 + 境界の高さ」より大き
い(クリッピングする位置より高い位置にある)場合、discardして描画しないようにします。
- 39. void surf (Input IN, inout SurfaceOutput o)の中身-2
if(IN.worldPos.y < _ConstructY)
{
fixed4 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座標の値以上の場合、境界部分の描画
対象として境界の色を反映します。
- 41. Start()メソッドの中身-1
Renderer renderer = GetComponent<Renderer> ();
material = renderer.material;
このスクリプトが関連づけられたオブジェクトのマテリアルを複製して保持します
マテリアルに設定したシェーダーのプロパティ(クリッピング位置のY座標)を操作するた
め、そのままでは複数のオブジェクトを表示した場合すべて連動してしまいます(既に表示
済みのオブジェクトに対してもエフェクトがかけられることを防ぐため)
- 42. Start()メソッドの中身-2
var mesh = GetComponent<MeshFilter> ().mesh;
var bounds = mesh.bounds;
clipY = minY = bounds.min.y + transform.position.y;
maxY = bounds.max.y * 1.2f + transform.position.y;
オブジェクトのバウンディングボックスのサイズを取得し、Y座標の変化の範囲として接地
面(最小値)から頭のてっぺん(最大値)までを設定します
注意する必要があるのは、接地面であるARCoreで取得した平面のY座標(高さ方向)です
接地面はのY座標は0の前提で考えることも多いかもしれませんが、ここでは最小値と最大
値にワールド空間でのY方向のオフセット値(transform.position.y、positionはタップし
てオブジェクトが配置される際に与えられます)を加えることで高さを合わせてあります
- 43. Update()メソッドの中身
if (clipY < maxY) {
clipY = Mathf.Lerp (minY, maxY, (Time.time - startTime) / duration);
material.SetFloat ("_ConstructY", clipY);
}
線形補間関数(Mathf.Lerp)を使ってクリッピング位置の最小値から最大値の間の経過
時間に応じた値を求め、シェーダーに渡します
clipY < maxYという条件を入れて、最大値(頭のてっぺん)に到達したらそれ以降クリップ
するY座標値は変化しないようにします
- 46. ARCore 1.2のapkをインストール
Google Play StoreにあるARCoreは
まだ1.2が行き渡っていないため、しばらくは(数日?)
https://developers.google.com/ar/develop/downloads
から ARCore_1_2.apk をダウンロードして手動インストール
する必要があります
$ adb install -r -d ARCore_1_2.apk
- 47. ビルド環境の設定
推奨されるUnityのバージョン: Unity 2017.4 LTS以降
前提: 新規プロジェクトを作成し、Androidのアプリをビルド可能な状態
ARCore SDK for Unityの1.2をダウンロードしてUnityにインポートする
https://github.com/google-ar/arcore-unity-sdk/releases/download/v1.2.0/
arcore-unity-sdk-v1.2.0.unitypackage
- 51. Google I/OのAR&VR関連セッション
AR & VR関連で9つのセッションがあります。
https://events.google.com/io/schedule?
section=may-8&topic=ar%26vr&type=ses
sions
(どれも動画が公開されます)