Unityでパーティクルの実験

最近Unityをいじくったりしてます。

Unityの簡単な説明をすると、米Unity Technologies社製のゲームエンジンで、PCやブラウザ、iPhone等で動く3Dアプリケーションを作ることができます。GUI環境に3Dモデル等の素材を放り込んで、JavaScriptやC#でスクリプトを書くだけで(割と)簡単に動かせます。Flashを触っている方は、Flash IDEの3D版だと考えればだいたい感覚的にあってるかも。ブラウザ上でGPUアクセラレーションつきの本格的な3Dが動くこと、iPhoneの3Dゲームが比較的手軽に作れること、開発環境の制限バージョンが無料になったことなどで人気が出ているようです(残念ながらまだ日本語化されていないのですが)。ブラウザのプラグインをインストールして公式のデモを見ると、かなりのものが動くのが分かると思います。

というところで、唐突ですが、ABAさんのパーティクルテストにつられて、似たような、オブジェクトをたくさん出す実験をしてみました。

UnityParticle500

プロジェクトファイルはこちら

おそらく個々のGameObjectがパーティクルを描画するのはGPU的に嫌だろうということで、GameObjectは座標を保持するだけにして、下のようなスクリプトでビルボード群のメッシュを毎フレーム作成してまとめて描画してみました。とりあえずCore 2 Duo/3.16GHz、RADEON 4550で10000個は出ているようです(上限を上げればもっと出るかもしれません)。UnityのJavaScriptは.NET(Mono)ベースで、C++の半分の速度は出るよとのことなんですが、確かに結構な速さはあるようです。

function LateUpdate()
{
	var particles = GameObject.FindGameObjectsWithTag("Particle");
	...

	var i = 0;
	var size = 0.5;
	for (var particle in particles) {
		var position = particle.transform.position;
		vertices[i++] = Vector3(position.x - size, position.y - size, position.z);
		vertices[i++] = Vector3(position.x - size, position.y + size, position.z);
		vertices[i++] = Vector3(position.x + size, position.y + size, position.z);
		vertices[i++] = Vector3(position.x + size, position.y - size, position.z);
	}
	...

	var mesh = GetComponent(MeshFilter).mesh;
	mesh.Clear();
	mesh.vertices = vertices;
	mesh.colors = colors;
	mesh.uv = uv;
	mesh.triangles = triangles;
}

まあ、パーティクルを多数出すだけならUnity組み込みのパーティクルシステムを使えばいいんですが、シューティングの敵弾などで自前でやる必要が出てくることもあるかなと。

ちなみにUnityのいいところは、開発環境がそのまま実行・デバッグ環境になることですね。下の画面のように、実行中に視点を動かして、描画が正しく行われているか確認したりというのが、何の苦労もなくできます。

UnityIDE500

Unityというプラットフォームがどんな感じかについてはまた後ほど(たぶん)。

2010年1月5日

あけおめ

なんだか最近はTwitterにばかり書き込んでいて、久しぶりのブログ更新です。サイト自体を作り直そうかと考えていることもあって、更新しづらくなってた感じ。いずれ移転したりするかもしれませんが、とりあえず書きながら考えようと思います。

今年はいろいろリリースしたいなと思っています(確定的なことは言えないのですが……)。どうぞよろしくお願いします。

2010年1月5日

N700系男子

タイトルに意味はありません(笑)。このところXNAやiPhone周辺をずっと調べてたんですが、だいぶ落ちついてきたので、久しぶりのwonderfl新作です。ぼーっと眺めるのにいいんじゃないでしょうか。

架線柱のティアリングがちょっとひどいです。入れたとたんに一気に作る気をなくしかけたくらい。たぶんワーストケースに近いんじゃないかと……。

2009年9月24日

天満橋の巨大アヒル

見に行ってきました。大阪天満橋で、今月27日までの展示だそうです。詳細は下の公式サイトにて。

先のエントリのようなことをリアルでやっちゃってる感じですねー。せっかくなので頑張って変な絵を撮ろうとしてみたんですが、これが精一杯。

いろんな国を回ってきてるみたいなんですけど、このアヒルの造形ってわりと普遍的なのかな?

duck1
duck2
duck3
duck4
duck5

2009年9月14日

Google MapsにPapervision3Dでオーバーレイ表示

Google Maps API for FlashにMap3Dクラスが新設されて、マップを傾斜・回転できるようになりましたが、Papervision3Dを使用すると簡単に3Dオブジェクトをオーバーレイ表示することができます。サンプルを作ってみました(ソースコードつき)。

pv3doverlay1

通常のマウスドラッグだけでなく、Shift+ドラッグやCtrl+ドラッグで回転操作ができるので試してみてください。Google Earthとだいたい同じ操作になっているようです。

短いコードですが、コアになるのはGoogleMapsCamera3Dクラスで、PV3DのCamera3Dクラスを拡張して、マップに同期する投影行列を与えています。Googleマップのワールド座標系は、東方向がX軸プラスで0?256、南方向がY軸プラスで0?256、上方向がZ軸プラスの左手座標系になっていますが、この座標系上に直接PV3Dのオブジェクトを描画することができます。

せっかくなので、もっと面白いものを表示してみましょう。

pv3doverlay2

東京駅前にワイバーン。3Dモデルは26℃さん制作のをお借りしました。かっこいいですねー。

なにかいる

pv3doverlay3

pv3doverlay4

ズサさんのねぎミクモデルをrectさんのところからお借りしました。ありがとうございます。こんな感じで、小さなものから大きなものまで大丈夫です。ちなみに拙作でも同じ方法で車体を描画しています。

あとは平面投影シャドウあたりが欲しいですね。PV3Dでどうするのがいいのか調査中。

2009年7月31日

トップページ
プロフィール

はてなブックマーク
wonderfl