4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity(C#)】ARFoundationで認識した平面をオンオフ、平面認識機能そのものをオンオフする方法

Last updated at Posted at 2021-08-04

#はじめに
ARFoundationで平面を認識してあれこれできるのは知っていたので、
そのあれこれした平面を手軽にオンオフできる機能は無いのか調べました。
加えて、平面認識機能そのものをオンオフする手法が無いかも調べました。

調べる前はARPlaneManagerにRemovePlaneやStopRecognitionなどが
実装されていることをイメージしてましたが見当たりませんでした。

別の手段を取る必要があり、また思い出してたどり着くまでに時間がかかりそうなのでメモします。

#バージョン情報

諸々名前 バージョン
Unity 2019.4.8f1(LTS)
ARFoundation 4.1.1
ARCore XR Plugin 4.1.1
ARCore Kit Plugin 4.1.1
AR Subsystems 4.1.1
XR Plugin Management 3.2.16

#認識した平面をオンオフする

###Sessionをリセット

まず、Sessionそのものをリセットする手法です。

これは非常に簡単で、ARSessionのResetを呼び出すだけです。

 [SerializeField] private ARSession _session;
 
 //既存の平面をリセット
 _session.Reset();

ただし、この手法だと平面認識そのものがやり直しになってしまうので注意が必要です。

###生成したARPlaneをオフにする

ARPlaneManagerのtrackablesからARPlaneを取り出して全て非表示にします。
再利用したいときは逆の処理を行えばOKです。

[SerializeField] private ARPlaneManager _arPlaneManager;
 
foreach (ARPlane plane in _arPlaneManager.trackables)
{
    plane.gameObject.SetActive(false);
}

#平面認識機能そのものをオンオフ

ここまでの処理だけだと、生成されたPlaneを非表示にできても新たにPlaneが生成されます。
下記のようにrequestedDetectionModeを変更することで
平面認識機能のアクティブをモードから切り替えることができます。

[SerializeField] private ARPlaneManager _arPlaneManager;

//平面認識の機能をオフ
_arPlaneManager.requestedDetectionMode = PlaneDetectionMode.None;

//平面認識の機能をオン
_arPlaneManager.requestedDetectionMode = PlaneDetectionMode.Horizontal;

#タップした平面上にオブジェクトを正対して表示させる(おまけ)

タップした平面にオブジェクトを表示し、そのオブジェクトは常にユーザーの正面を向いている、、、
という内容を結構な頻度で実装するので備忘録として書き残しておきます。

[SerializeField] private GameObject _arObject;
[SerializeField] private ARRaycastManager _arRaycastManager;

private readonly List<ARRaycastHit> _hits = new List<ARRaycastHit>();

void Update()
{
	if (Input.touchCount > 0)
	{
		var touch = Input.GetTouch(0);
		    
		if (touch.phase == TouchPhase.Began)
		{
		    if (_arRaycastManager.Raycast(touch.position, _hits, TrackableType.PlaneWithinPolygon))
		    {
		        //RayとARPlaneが衝突したところのPose
		        var hitPose = _hits[0].pose; 
		        //オブジェクトの配置
		        _arObject.transform.position = hitPose.position;
		        var cameraPos = Camera.main.transform.position;
		        cameraPos.y = _arObject.transform.position.y;
		        _arObject.transform.LookAt(cameraPos);
		    }
		}
	}
}

回転より先に座標の移動済ませておかないと望んだ位置に出てこないのでこの手法の場合は順番注意です。

#最後に

調べる前はARPlaneManagerにRemovePlaneやStopRecognitionなどが
実装されていることをイメージしてましたが見当たりませんでした。

冒頭で述べたこの部分ですが、フォーラムで直接言質取ったとかではないので
もしこんなのあるよってご存じの方いらっしゃいましたら教えてください。

#参考リンク
Arfoundation How To Properly Remove Planes And Ref Points
Trackable Managers
AR-Foundation Clean Plane Detection
【Unity】ビルボードで常にカメラの方に向く木を作る
【Unity】ARFoundation入門~機能解説から平面検知の実装まで~

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?