4
3

More than 1 year has passed since last update.

AR.jsを使って恐竜を家に呼んでみた

Last updated at Posted at 2022-12-08

はじめに

こんにちは!今回初参加させていただきます。
CYBIRD Advent Calendar 2022、9日目担当の@ayany0_zzZです!:hugging:
前回は@moffunnyaさんの「Terraformを使った環境構築入門(AWS)」でした。

初めての投稿なので、お手柔らかにお願いいたします…!

自己紹介

私は、2022年にサイバードに新卒入社いたしました。
ドキドキワクワクの研修期間を経て、現在は:rose:イケメン王子~美女と野獣の最後の恋~:rose:のクライアント兼サーバーエンジニアとして開発に携わらせていただいております!
ちいかわとポケモンとゲームが大好きなひよっこエンジニアです:hatching_chick::dizzy:

最近ではポケモン最新作「ポケットモンスターバイオレット」で、色違い集めに励んでいます。
目標は、1BOXを色パチリスで埋めること です! 
どうぞ、よろしくお願いいたします!:pray_tone1:

概要

ポケモンSVに影響されて、"現実世界にはもう存在しない何か" を現実世界に召喚したいと思ってしまいました。

ですので今回は、コライドn 恐竜の皆様を
AR.js」で
現実世界(私の家)に召喚したいと思います!:sparkles:

開発環境

macOS Monterey(バージョン12.1)
Apple M1 Proチップ搭載

必要なもの

  • Blender
  • phpが使えるWebServer

ドキュメントルートのフォルダ構成

  • Index.html
  • AR.php
  • glbフォルダ(3Dモデルを入れるフォルダ)
    • XXX.glb
  • Imagesフォルダ
    • XXX.jpeg
  • pattern-marker.png
  • pattern-marker.patt

Index.htmlで召喚したい恐竜の画像を表示し、選択後にAR.phpが呼ばれてARのメイン処理が走るイメージです。

個体準備編

今回は、みんな大好きティラノサウルスくんを用意したいと思います。

3Dモデルの用意

立体的な子を呼び出したいので3Dモデルでの実装をしたいのですが…
モデリングができないので、以下の無料アセットを使用させていただきました:pray_tone1:

拡張子をglbにしたいので、Blenderを使用して変換していきます。

Blenderで諸々調整

Blenderを開いて、元々置いてあるキューブを削除。
ファイルインポートFBX(.fbx)で先程ダウンロードしたfbx形式のティラノさんをインポートします。
image.png
クリック:zap:
スクリーンショット 2022-12-08 15.29.29.png

わ〜!!出てきた!なんか消しゴムみたいで可愛いですね!:raised_hands_tone1:
色がついていないので、3Dビューのシェーディング(枠内のボタン)を右から2番目のマテリアルプレビューモードに変更します。
ティラノ.png
クリック:zap:
スクリーンショット 2022-12-08 15.34.25.png
テクスチャが反映されると恐竜さが増しますねえ…!
ちなみに、ティラノサウルスさんは声帯がなくて吠えることはないみたいです。

…ジュラシックパークを見たくなってきたところで、しっかりと保存します。
ファイルエクスポートgTF2.0(.glb/gltf)でglb形式で保存し、glbフォルダに格納!
image.png

個体の用意が完了しました〜!


おまけ

【Blenderでjpeg画像を作成する方法】

  1. まず、カメラを選択します。
    スクリーンショット 2022-12-08 15.49.58.png

  2. 左部のツールを使って、画像のように撮影したいオブジェクトを四角の中に収めます。
    スクリーンショット 2022-12-08 17.09.12.png

  3. 枠内をクリックして、カメラビューに切り替えます。
    写真3.png
    クリック:zap:
    image.png

  4. レンダー画像をレンダリングで、Blenderレンダーを開きます。
    スクリーンショット 2022-12-08 17.29.47.png
    クリック:zap:
    スクリーンショット 2022-12-08 17.30.45.png

  5. 画像名前を保存で開かれたウィンドウに、ファイル名を入力して保存します。
    このとき、jepg形式でimagesフォルダに格納しました。
    スクリーンショット 2022-12-08 17.30.59.png

できた画像がこちら!
t_rex.jpg

迫力置いてきちゃった…。:cry:

召喚編

ここからスクリプトを書くなどします!
後少しで "現実世界にはもう存在しないティラノサウルス" がお家に…!ワクワク:relaxed:
それではスタート!

Webサーバーの準備

AR.jsはWebでARを実装できるソフトウェアなので、まずは実装するための環境を整えます。
今回はApacheを使用してサーバーを準備しました!

今まではWeb Server for ChromeでWebサーバーを立てていたのですが、phpに対応していませんでした:cry:
本当はHTMLだけでも実装できるみたいなのですが、なぜphpにこだわるかというと「今後同じページから違う3Dモデルも表示できたらいいな〜」と思ったからです。
初めてのApache、macOSに標準搭載されているなら安心だよね!私にもできるよね!:dash:

httpd.confを編集してドキュメントルートを設定後、以下の起動コマンドをターミナルで打ってみました。

$ sudo apachectl start

結果…
image.png
おっ、表示されました。ヤッター!:raised_hands_tone1:
じゃあ次はphpが本当に動くのか、確認します。
image.png

…え?なんで…?

調べた結果、以下のようなことがわかりました。

macOS Monterey以降はphpがバンドルされなくなった関係で、Homebrewを使ってphpを別途インストールする必要がある

macOS標準のApacheは、Homebrewでインストールしたphpを受け付けない為、Homebrewを使ってhttpdを別途インストールする必要がある

えぇ…そんなことある…?:sob:

Homebrewはインストールしてあったので、上記2点のインストールと諸々の設定をして無事にphpを使用できるようになりました。
この記事ではその経緯は割愛させていただきますが、割と苦労したので後日備忘録として投稿できたらなと思います…。
image.png
この画面が表示されたらOKです。

マーカーの作成

次は、ARを認識させるための画像ファイルとpattファイルを作成します。

こちらのサイトのDOWNLOAD MARKERをクリックしたら、pattファイルが簡単にダウンロードできました:raised_hands_tone1:
あああああ.png

同じようにDOWNLOAD IMAGEをクリックして、画像ファイルもダウンロードします。
あああああ2.png

上記2つをドキュメントルートのフォルダに格納して完了です。
私はデフォルトのマーカーを作成しましたが、オリジナルのマーカーを作成することもできるみたいです!すごい!!

あっ、ここで画像ファイルを印刷しておくといいと思います:ok_hand_tone1:

プログラミング

まずは、Index.htmlからやっていきます:muscle_tone1:

Index.html
<html>
    <head>
    	<meta charset="utf-8">
    	<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
    	<title>AR</title>
    </head>
    <body bgcolor="#464646">
    	<div style="float:left; margin:2px;"><a href="ar.php?id=0"><img src="images/t_rex.jpg" /></a></div>
    </body>
</html>

やっていることとしては、主に以下です。

ティラノサウルスの画像を表示
└画像を表示するために、予めそれぞれの画像をimagesフォルダに格納

画像をクリックしたらARで表示できる ようにしたいので、ar.phpを呼び出せるようにリンクの埋め込み

画面はこのような感じになっています。
ぽつんとティラノになってしまいましたね!:full_moon_with_face:
image.png
次に、AR.phpでメイン処理を書いていきます。

AR.php
<?php
	$glb_list[]=array("path" => "glb/t_rex.glb", "rotation" => "0 0 0", "scale" => "30.0 30.0 30.0");

	$id=0;
	// [ user.php ]
  	if(isset($_GET['id'])) {
		$id = $_GET['id'];
	}

	$glb_path=$glb_list[$id]["path"];
    $glb_rotation=$glb_list[$id]["rotation"];
	$glb_scale=$glb_list[$id]["scale"];
?>

<html>
	<head>
		<meta charset="utf-8">
      	<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
      	<title>AR</title>

		<!-- A-Frame ライブラリの読み込み -->
  		<script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
  		<!-- AR.js ライブラリの読み込み -->
  		<script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar.js"></script>
    </head>
    <body>
		<div>
		<a-scene embedded arjs="debugUIEnabled:false; sourceType: webcam;" vr-mode-ui="enabled: false;" renderer="gammaOutput:true;" >
   			<a-assets>
   				<a-asset-item id="poke" src="<?php echo $glb_path ?>"></a-asset-item>             
   			</a-assets>
            <!-- a-markerのtypeにpatternを設定, 作ったpattファイルのパス指定 -->
      		<a-marker preset='custom' type='pattern' url="pattern-marker.patt">                            
   	    		<a-entity gltf-model="#poke" position="0 0 0" rotation="<?php echo $glb_rotation ?>" scale="<?php echo $glb_scale ?>" ></a-entity>
   	    	</a-marker>
   	    <a-entity camera></a-entity>
		</a-scene>
		</div>
	</body>
</html>

うーん長い!!!!:sweat_drops:
やっていることとしては、主に以下です。

idと表示したい3Dモデルの紐付け
└今後種類が増えるかもしれないので、配列で管理

A -FrameライブラリとAR.jsライブラリの読み込み

カメラの起動

ARマーカーの設定

3Dモデルの表示調整(大きさ、ライティング等)

これで、召喚の準備は整いました。

いざ召喚

私のスマホからティラノサウルスくん登場!
プリンターのインクがなくて、ARマーカーを印刷できなかったのでスマートフォンで表示させてみました。
スクリーンショット 2022-12-08 18.15.11.png
小さいとちょっと可愛いかも…?:flushed:

おわりに

最後まで本記事を読んでいただき、ありがとうございました!
拙い文で大変恐縮ですが、少しでも読んでて楽しい気持ちになっていただけていたら嬉しいです。:relaxed::sweat_drops:
動きのあるARも作れるみたいなので、ぜひ次元の離れた存在を私たちの世界に呼んでみてください!

CYBIRD Advent Calendar 2022 10日目は、@kyukkyu81さんの「クリスマスの夜に向けて密かに歌を練習するアレクサ」です。
アレクサも歌、好きなんですかね〜?タイトルからもう面白いので是非読んでみてください!

4
3
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
3