Monthly Archives: 12月 2018

第4回UnityでARkit2アプリを作る!~面積測定アプリを作る~

こんにちはイマイです
少し空きましたが前回の続きのARKitで面積の測定するアプリを作っていこうと思います。

最終的にはこんな感じになります


面積を求める

前回は2点の距離を求めましたが今回は面積を求めてみようと思います
三点の面積の求め方は前の記事で書いた通りです。
こちらからご覧ください

Unityで面積を求めたい 3Dの場合

こんにちはイマイです 最近書いてあるARKitのアプリで3次次元空間の3点で作れる面の面積を求めたいなぁと 思ったので実装方法を考えてみました。 調べてみると公式見当たりませんでしたね… (ご存知の方がいましたらご教授ください) 以下のサイトをみると意外と簡単にベクトルを使って計算できるみたいなんで実装してみました。

第二回で作ったコードに少し手を加え、面積を表示するプログラムを追加します
前回からの変更点があるところをピックアップして表示します。

ボタンを押した回数に応じて処理を変更

	public void ClickPlaceButton(){
		switch (Click){
			case 1:
			PlaceMarker();
			break;

			case 2:
			PlaceMarker();
			CalculateDistance();
			break;

			case 3:
			PlaceMarker();
			CalculateArea();
			break;

			case 4:
			Reset();
			break;
		}
	}

ボタンを押した回数に応じて処理を変更しています。
1回目:マーカーをセット
2回目:マーカーをセット 距離を表示
3回目:マーカーをセット 面積を表示
4回目:マーカーを消去

今回は回数が少ないのでcaseを使いましたがもっと多くなる場合には配列とかを使った方がスマートになるかと思います。

面積を計算して表示する

	public void CalculateArea(){
		Vector3 pos1 = list_toggle_[0].transform.position;
		Vector3 pos2 = list_toggle_[1].transform.position;
		Vector3 pos3 = list_toggle_[2].transform.position;
		
		Vector3 D = Vector3.Cross(pos2-pos1,pos3-pos1);
		float S = D.magnitude / 2;

		DisplayText.text = "3点の面積"+(S/2).ToString("f2")+"m^2";
	}

ベクトルで面積を計算後画上に表示しています。

細かな設定などはここで説明すると時間がかかってしまうので
一式をGithubにアップロードしましたので気になる方は各自でダウンロードして動かしてみてください!
こちらから確認できます
(ARKitPlugInを導入していない関係でマーカーのオブジェクトと認識した床はシェーダーで書いてみました。)

実行環境は第一回に書いた通りです
また、Githubに上げているファイルの中身にはARKitPugInが入っていないので自分で入れてくださいね!
うまくやればn角形の面積や、見た目を調整して線を表示したり、面に色を塗れば立派なアプリになるかと思います!

ARKitで距離測定などをするアプリの解説は今回で最後にしたいと思います〜
次回以降はARKitを使った別のアプリを書いていく予定です

それでは今回はここまで
良いハッキングライフを〜

Unityで面積を求めたい 3Dの場合

こんにちはイマイです

最近書いてあるARKitのアプリで3次次元空間の3点で作れる面の面積を求めたいなぁと
思ったので実装方法を考えてみました。

調べてみると公式見当たりませんでしたね…
(ご存知の方がいましたらご教授ください)

以下のサイトをみると意外と簡単にベクトルを使って計算できるみたいなんで実装してみました。

エクセルを用いた3次元空間上の三角形の面積計算

null

public void CalculateArea(){
    //3点の初期化
    Vector3 A = new Vector3(1, 2, 5);
    Vector3 B = new Vector3(3, 1, 5);
    Vector3 C = new Vector3(3, 3, 5); 
    
    //BベクトルとCベクトルの外積を求める
    Vector3 D = Vector3.Cross(B-A,C-A);
    
    //平行四辺形の面積を求めて2で割る
    float S = D.magnitude / 2;
    Debug.Log(S);
}

magnitudeはベクトルの長さを返してくれます

Unity – スクリプティング API: Vector3.magnitude

あなたの作品をどこへでも!Unityはゲームやグラフィカルなアプリケーションを開発するための最高の開発環境です。Unityで作れば、Webブラウザ、Windows, Mac OS X, iOS, Android, PlayStation 4やWii U, Xbox Oneなどのゲーム機、さらに多くの幅広いプラットフォームで展開できます。

普通のゲームで使い道なさそうですね…