2009年7月16日木曜日

[Pv3D][Flex]Collada(.dae)にお絵かき[AS3.0]

これまた前回の続きです。

こんな感じです。
現時点で不具合は多いですが、基本の動作としてはこんな感じかな~と・・・
右下の「編集する」を選択すると編集モードに入ります。

[PV3D2.0] virtualMouse axis on DAE
Flash Player 10でPV3D上の落書きを保存してみる
↑2つを参考にし、matsu4512さんに助けてもらいながら作りました。

ソースコード
demo.mxml World3D.as

現時点でお絵かきが上手くいってない原因はここらへんが原因かなー。
material = new MovieMaterial(movieClip, false, true, false, new Rectangle(0, 0, bmpData.width, bmpData.height));


---
お絵かきをするにはクリックしたマテリアルの情報を得る必要があるのですが次のように行ってます。

private function modelComplete(e:FileLoadEvent):void {
var dae_rootNode:DisplayObject3D = dae.getChildByName("COLLADA_Scene");
var targetMesh:DisplayObject3D = dae_rootNode.getChildByName("Model").getChildByName("mesh1");
targetMesh.addEventListener(InteractiveScene3DEvent.OBJECT_MOVE, drawModel);
}

private function drawModel(e:InteractiveScene3DEvent):void {
if(isModelOver) {
targetMaterial = int(e.renderHitData.material.name);
}
}

mesh1っていうDisplayObject3Dからマテリアルの名前をどうやって取得するかわからなかったので、Flex Builderの補完機能をつかってそれっぽいのを片っ端から試してたら、
『e.renderHitData.material.name』で取得することができることが判明。
この"renderHitData"って調べてもあまり情報がないんですよね~。
まあ問題なく(?)動いてるので大丈夫かな。

ちなみに、「getChildByName("Model").getChildByName("mesh1")」の"Model"と"mesh1"は

<library_visual_scenes>
<visual_scene id="SketchUpScene" name="SketchUpScene">
<node id="Model" name="Model">
<node id="mesh1" name="mesh1">
<instance_geometry url="#mesh1-geometry">
<bind_material>
<technique_common>
<instance_material symbol="material0" target="#material0ID">
<bind_vertex_input semantic="UVSET0" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
<instance_material symbol="material1" target="#material1ID">
<bind_vertex_input semantic="UVSET0" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
中略
<instance_material symbol="material6" target="#material6ID">
<bind_vertex_input semantic="UVSET0" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
</technique_common>
</bind_material>
</instance_geometry>
</node>
<node id="mesh2" name="mesh2">
<instance_geometry url="#mesh2-geometry">
<bind_material>
<technique_common>
<instance_material symbol="ForegroundColor" target="#ForegroundColorID"/>
</technique_common>
</bind_material>
</instance_geometry>
</node>
中略
</visual_scene>
</library_visual_scenes>

daeファイルのこの部分の『node』の名前からきてます。
mesh1のほかにもmesh2とかがありますが、マテリアルが含まれてるのはmesh1のほうなのでそっちです。
書き出したソフトによって多少違いがあるとは思いますが他も同じようなもののはず。

2009年7月13日月曜日

雑記

ブログを全然更新してないのでたまには更新。
次あたりでプログラムのほう更新する予定。

この夏は福島へ! 福島県と「モンスターハンター3」がタイアップ
なんぞこれw
県知事からのメッセージもあるので結構ちゃんとした企画っぽい。

最後のタブを閉じてもFirefox3.5を開いたままにする方法
個人的に便利なのでメモ。「about:config」でいじります。
普段はOpera使ってるのでこのほうが使いやすいです。

2009年7月5日日曜日

雑記

今日エヴァ破見てきました。車で片道2時間かけて。
これだから田舎は。

プログラムのほうがあまり進んでないので気になった記事でも挙げていきます。
MorphController - Mighty Morphing Papervision3D
Papervision3D | DisplayObject3Dの頂点操作 geometry.vertices
Pv3D 2.0 Morphing geometry trough LERP
まだ詳しくソースコード見てないですが、Papervision3Dでの頂点操作などの記事です。
Papervision tutorials
チュートリアルです。いろいろあります。

[Computer Science] Web上の膨大な画像に基づく自動画像補完技術の威力
画像補完の記事です。

[CSS]テキストだけを使ってぱっと見、画像のようにみえるスタイルシート
すごい。ですけど実際には使えなさそう。

2009年7月3日金曜日

[Pv3D][Flex]Collada(.dae)のマテリアル張り替え

前回の続き?

前回3DギャラリーからとってきたCollada形式のデータはテクスチャの枚数が多かったので今回は自分でGoogle SketchUpを使ってモデルを作ってみました。形はかなり適当ですが・・・

動作サンプル
ソースコードは右クリックで表示できます。

背景が白いところでドラッグ&ドロップで視点移動、マウスホイールでズームイン&アウトします。
ズームは正確にはズームではなく、カメラごと対象に近づく(or遠ざける)ようになってます。
「ロード」ボタンを押してから、「はりかえ」ボタンを押すとテクスチャがランダムに変わります。
エラーが出ると思うので、「ロード」を押す前に「はりかえ」を押さないでください。

DAEに渡すマテリアルリストの作成は次のようにやってます。

var material0:BitmapMaterial = new BitmapFileMaterial("model3/images/texture0.jpg");
var material1:BitmapMaterial = new BitmapFileMaterial("model3/images/texture1.jpg");
var material2:BitmapMaterial = new BitmapFileMaterial("model3/images/texture2.jpg");
var material3:BitmapMaterial = new BitmapFileMaterial("model3/images/texture3.jpg");
var material4:BitmapMaterial = new BitmapFileMaterial("model3/images/texture4.jpg");
var material5:BitmapMaterial = new BitmapFileMaterial("model3/images/texture5.jpg");
var material6:BitmapMaterial = new BitmapFileMaterial("model3/images/texture6.jpg");
var material7:BitmapMaterial = new BitmapFileMaterial("model3/images/texture7.jpg");
var material8:BitmapMaterial = new BitmapFileMaterial("model3/images/texture8.jpg");
var material9:BitmapMaterial = new BitmapFileMaterial("model3/images/texture9.jpg");
var myMaterials:Object = {
material0: material0,
material1: material1,
material2: material2,
material3: material3,
material4: material4,
material5: material5,
material6: material6,
material7: material7,
material8: material8,
material9: material9
}
texture = new MaterialsList(myMaterials);

myMaterialsの中身の『material0: material0』ですが、
これは、『Colladaファイルのマテリアルの名前: 上で宣言しているBitmapMaterial型の変数material0』です。名前同じでわかりづらいですね、すみません。
で、「Colladaファイルのマテリアルの名前」はCollada(DAE)ファイルを調べればわかります。
ColladaってのはXMLで書かれているので、適当なテキストエディタで開くと、次のようになっています。

<library_images>
<image id="material0-image" name="material0-image">
<init_from>../images/texture0.jpg</init_from>
</image>
<image id="material1-image" name="material1-image">
<init_from>../images/texture1.jpg</init_from>
</image>
中略
<image id="material8-image" name="material8-image">
<init_from>../images/texture8.jpg</init_from>
</image>
<image id="material9-image" name="material9-image">
<init_from>../images/texture9.jpg</init_from>
</image>
</library_images>
<library_materials>
<material id="material0ID" name="material0">
<instance_effect url="#material0-effect"/>
</material>
<material id="FrontColorNoCullingID" name="FrontColorNoCulling">
<instance_effect url="#FrontColorNoCulling-effect"/>
</material>
<material id="material1ID" name="material1">
<instance_effect url="#material1-effect"/>
</material>
<material id="material2ID" name="material2">
<instance_effect url="#material2-effect"/>
</material>
中略
<material id="material8ID" name="material8">
<instance_effect url="#material8-effect"/>
</material>
<material id="material9ID" name="material9">
<instance_effect url="#material9-effect"/>
</material>
<material id="ForegroundColorID" name="ForegroundColor">
<instance_effect url="#ForegroundColor-effect"/>
</material>
</library_materials>

書き出したソフトによって記述に多少の違いはありますが、『<material id="material0ID" name="material0">』のnameがマテリアルの名前になります。

あとは、

dae.load("○○.dae", 作成したマテリアルリスト);

と書けばロードされます。
普通はCollada自体でもテクスチャを指定してありますが、これで渡したマテリアルリストのほうが優先されるっぽいです。

マテリアルの張り替えには「replaceMaterialByName」を使ってます。こんな感じで。

var material:BitmapMaterial = new BitmapFileMaterial("model3/images/texture" + Math.round(Math.random()*9) + ".jpg");
dae.replaceMaterialByName(material, "material0");



今回参考にさせてもらったサイト
http://pv3d.org/2008/12/26/switching-a-moviematerial-on-the-face-of-a-cube-replacematerialbyname/
http://d.hatena.ne.jp/matsu4512/20090701