Archive : 2008 年 11 月

11 月 30 2008

PV3Dでレースゲーム制作 22 - デモ走行追加

Posted by tanjo at 5:18 PM

レースゲームデモ画面

» デモ走行を見る (要:Flash Player 9.0.124.0以降)

デモンストレーションが繰り返し再生されるサンプルです。

デモ走行追加

三人称カメラリプレイ再生車モデルの挙動 と作ってきました。
ということは、走行データを固定の外部ファイルから読み込むようにすれば、市販ゲームなんかによくある「デモ走行映像」が作れるぞ、と。

リプレイの時は操作入力の履歴を順に配列へ保存して、1フレームずつ shift で取り出して再生していました。ですのでデモ走行を作るには、「操作履歴を表す数字ばかりのファイルを用意」→「それを読み込んで配列に変換」→「リプレイ時と同様に再生」という流れでできそうです。

操作履歴ファイルの作成

まあこの辺はてきとうです。区切り文字「,」で数字が羅列したファイルを作ります。
ドライブすると drivingHistory という変数に履歴が記録されるようにしてあるので、実際に走ったあとそれをトレース&コピペしてテキストファイルを作成しました。

//ドライビングヒストリ出力
for (var i:int = 0; i < drivingHistory.length; i++)
{
	trace(drivingHistory[i] + ",");
}

ファイルを読み込み配列に変換

URLLoader.data でテキストファイルの内容をString型で取得できます。String.split() メソッドで文字列を配列に変換し、そして各要素を Number に型変換してやれば、必要な再生用配列の完成です。…もうちょっとスマートなやり方があるのかな。。

var drivingDemoString:String = String(myURLLoader.data);
var drivingDemo:Array = drivingDemoString.split(",");
drivingDemo = strToNumArray(drivingDemo);
function strToNumArray(array:Array):Array
{
	for (var i:int; i < array.length; i++)
	{
		array[i] = parseInt(array[i]);
	}
	return array;
}

配列を元に車の運転を再生するのは、リプレイモード搭載の回と同じやり方です。

11 月 25 2008

YouTubeにループ再生ボタンを追加するスクリプト

Posted by tanjo at 6:58 AM

Loopy for YouTube」というGreaseMonkeyスクリプトを使うと、YouTubeにループ再生ボタンを追加することができます。
ここで紹介されていて知りました。
» Youtubeのビデオを簡単にループ再生するためのGreasemonkeyスクリプト-Loopy for YouTube - 適宜覚書はてな異本

インストールするとYouTubeにアクセスしたとき、こんな感じのループ再生/解除ボタンが表示されるようになります。

loopy

Loopy for YouTubeのインストール

動作させるには、あらかじめFirefoxアドオン Greasemonkey が必要です。
» Mozilla Firefox のアドオンサイト
» 開発・配布元サイト : Greasespot

Loopy for YouTube は以下から入手できます。
インストールするには右上の [Install] ボタンを押すだけ!
» Loopy for YouTube for Greasemonkey - userscripts.org

11 月 23 2008

PV3Dでレースゲーム制作 21 - 車のモーション

Posted by tanjo at 5:04 AM

車のモデルをちゃんと作ります。直方体のままじゃあまりにも…なので。
今回はキャラクターとか乗り物に必要な、「パーツごとの動き」を追加してみました。

モデリング

モデリングは Lightwave 3D Modeler を使いました。

fdmodel

3Dオブジェクトを階層化

車モデルをそのまま1つの COLLADA で読み込むと、タイヤの回転とかが再現できません。
そこで、動かしたいパーツごとにモデルを分割して、ActionScript 側でインスタンスを再構成することで個別のモーションに対応させます。ちょうど Sprite を addChild で階層化して個別2Dアニメーションさせるのと同じようなやり方で、3Dオブジェクトも制御できちゃいます。

具体的にやりたいことは次のとおり。

  • 荷重移動でカウルが動く
  • 車の速度に応じてタイヤが回転する
  • 操作に合わせて前輪が左右に動く
  • 影は固定
  • 車全体がセットで移動する

最低限これくらいやっとけば車っぽく見えるでしょう。テールランプがあってもよかったけど。

というわけでパーツ分割は、カウル・タイヤ・影の3つなりました。
これらを包括した DisplayObject3D を作り、車全体が一緒に移動できるようにします。さらに前輪は、回転しながら左右に動かないといけないので、ここも階層化する必要がありそうです。
*DisplayObject3D は Collada のスーパークラスです。

シーン : Scene3D
+-コース : Collada
+-車 : DisplayObject3D
  +-カウル : Collada
  +-前輪 : DisplayObject3D
    +-タイヤ : Collada
  +-前輪 : DisplayObject3D
    +-タイヤ : Collada
  +-後輪 : DisplayObject3D
    +-タイヤ : Collada
    +-タイヤ : Collada
  +-影 : Collada

ソース。

//宣言---------------------------------------------------------------//
private var _scene:Scene3D;

private var _carObject:DisplayObject3D;
private var _cowl:Collada;
private var _tireFL:DisplayObject3D;
private var _tireFR:DisplayObject3D;
private var _tireR:DisplayObject3D;
private var _tire:Collada;
private var _shadow:Collada;

(略)

//カウル-------------------------------------------------------------//
//マテリアル
var cowlMaterials:Object = new Object();
cowlMaterials = {
	tx_front_jpg:new BitmapMaterial(txCarBitmap1.bitmapData),
	tx_side_jpg:new BitmapMaterial(txCarBitmap2.bitmapData),
	tx_back_jpg:new BitmapMaterial(txCarBitmap3.bitmapData),
	tx_under_png:new BitmapMaterial(txCarBitmap4.bitmapData)
};
//オブジェクト
_cowl = new Collada( cowlXML, new MaterialsList(cowlMaterials) );

//タイヤ-------------------------------------------------------------//
//マテリアル
var tireMaterials:Object = new Object();
tireMaterials = {
	tx_tire_jpg:new BitmapMaterial(txTireBitmap.bitmapData)
};
//オブジェクト
_tireFL = new DisplayObject3D();
_tire = new Collada( tireXML, new MaterialsList(tireMaterials) );
_tireFL.addChild(_tire, "tire");
_tireFL.x = -730;
_tireFL.y = 310;
_tireFL.z = 1280;

_tireFR = new DisplayObject3D();
_tire = new Collada( tireXML, new MaterialsList(tireMaterials) );
_tireFR.addChild(_tire, "tire");
_tireFR.x = 730;
_tireFR.y = 310;
_tireFR.z = 1280;

_tireR = new DisplayObject3D();
_tire = new Collada( tireXML, new MaterialsList(tireMaterials) );
_tire.x = -730;
_tireR.addChild(_tire);
_tire = new Collada( tireXML, new MaterialsList(tireMaterials) );
_tire.x = 730;
_tireR.addChild(_tire);
_tireR.y = 310;
_tireR.z = -1100;

//影-----------------------------------------------------------------//
//マテリアル
var shadowMaterials:Object = new Object();
shadowMaterials = {
	tx_shadow_png:new BitmapMaterial(txShadowBitmap.bitmapData)
};
//オブジェクト
_shadow = new Collada( shadowXML, new MaterialsList(shadowMaterials) );

//車-----------------------------------------------------------------//
_carObject = new DisplayObject3D();
_carObject.addChild(_cowl);
_carObject.addChild(_tireFL);
_carObject.addChild(_tireFR);
_carObject.addChild(_tireR);
_carObject.addChild(_shadow);

//3D登録-------------------------------------------------------------//
_scene.addChild(_carObject);

あとは車の動きに合わせて、各パーツの x, y, z, rotationX, rotationY, rotationZ あたりを操作してやればOK。この辺は理屈よりも「らしく見えるか」というセンスの問題にもなってきますね。微調整には試行錯誤しました。

デモ

レースゲームデモ画面

» ゲームをプレイする (要:Flash Player 9.0.124.0以降)

このゲームのソースファイル Main.as はこちらから参照できます。

1周走るか、ドライブ中に[C]キーを押すと、三人称カメラになって車の挙動を確認できます。

11 月 19 2008

多摩美・芸術祭展示の様子

Posted by tanjo at 3:16 PM

先日の多摩美術大学 芸術祭にて作品展示を行いました。
ホビーショップを模したブースに各々の作品を展示する「リンゴ堂」という団体を主催しました。
私の出展作品はもちろん、このブログで制作中のレースゲームです。

(って、芸術祭は11月1日~3日だぞ、なんと遅い事後報告。)

リンゴ堂ブースの様子。
まわりはグラフィックデザイン科らしいマジメな展示が多くて、良くも悪くも浮いた存在だったかも。

ringo01

ほとんどが手作りの作品です。(フィギュアは市販ものだけどね。)

ringo03

PV3D RACING。テレビとコントローラで遊ぶと臨場感が倍増!いい機会でした。

ringo02

最近ブログ更新が滞ってたのは、芸術祭のせいです(^^;
また制作進捗と制作記が大きくズレてしまった…。