Flash3Dの最近のブログ記事

環境マッピングを使った映り込み表現。
金属っぽい質感を出すときに使いますね。
ライトの位置によって映り込む方向が変わります。

使い方は、下記のようにEnvMapShaderの引数に
ライトと環境用ビットマップデータを渡してやります。

var shader:EnvMapShader = new EnvMapShader(light, env_bmd, env_bmd);
var shadedMaterial:ShadedMaterial =  new ShadedMaterial(bitmapMaterial, shader);
var sphere:Sphere = new Sphere(shadedMaterial);
・サンプルSWF ・ソースファイル

背景(風景)の作り方。
風景のテクスチャを張った巨大なボックスを置いて
中にカメラを置くだけですね。

ポリゴンの裏表をひっくり返すには下記のようにします。
material.opposite = true;

立方体よりも球体のほうが自然な感じになると思うけど
パフォーマンスとのトレードオフですね。

大気のテクスチャはLightwaveのSkyTracerで作りましたが
一般的にはどうしてるんだろう?

・サンプルSWF
・ソースファイル

カメラの視野角が広い(パースがきつい)場合に
テクスチャーの歪みが目立つことがあります。
これを補正するのがマテリアルのpreciseプロパティです。

var material1:BitmapMaterial = new BitmapMaterial(bmd);
material1.precise = true;
var material2:MovieMaterial = new MovieMaterial(clip);
material2.precise = true;

camera.fov=30とか視野角が狭く設定してある場合は
precise=falseのままでも歪みは目立たないです。

・サンプルSWF
・ソースファイル

追記:6月10日21:25
未検証ですがprecise=trueはかなり負荷が高いらしいのでむやみに使わないほうが良いかもしれません。


デフォルトではテクスチャーのジャギーが目立ちますが、
マテリアルのsmoothプロパティをtrueにするとスムージングが掛かって滑らかになります。

var material1:MovieMaterial = new MovieMaterial(clip);
material1.smooth = true;
var material2:BitmapMaterial = new BitmapMaterial(bmd);
material2.smooth = true;
・サンプルSWF ・ソースファイル

1つのオブジェクトを任意の平面で分割して、2つに分ける方法について。

下記のようにMeshUtil.cutTriangleMesh()を使うと
2つに分割されて配列が返ってきます。

//分割実行
var meshes:Array =MeshUtil.cutTriangleMesh(originalMesh, cuttingPlane);
//表示リストに加える
scene.addChild(meshes[0]);
scene.addChild(meshes[1]);
・サンプルSWF ・ソースファイル

Papervision3Dを勉強しなさい、とのお告げを受けたので
主要ポイントを押さえていくことにします。

まずは、QuadrantRenderEngineクラスについて。
これはポリゴン同士が交差したり接近した時に
表示が欠けるというか、前後関係がおかしくなる問題を
解決するためのクラスです。

使い方は下記のようにレンダラとして指定するだけです。

renderer = new QuadrantRenderEngine(QuadrantRenderEngine.ALL_FILTERS);

引数は下記の3種類あります。
・QuadrantRenderEngine.CORRECT_Z_FILTER
 →ポリゴンの前後関係を正しくなるよう並び替える。
  ただし交差し合っているポリゴンは補正できない。

・QuadrantRenderEngine.QUAD_SPLIT_FILTER
 →必要に応じて交差ポリゴンを分割する。

・QuadrantRenderEngine.ALL_FILTERS
 →上記2つを両方実行する。

処理が遅いので、相当ローポリゴンの場合にのみ使うのが
良さそうです。

・サンプルSWF
・ソースファイル

久しぶりにPapervisionでも試してみようと思ったら、DAEクラスがアップデートされてるじゃないですか。
Papervision3D 2.1 - alpha | Floorplanner Tech Blog

念願の複数アニメーションの再生がサポートされています。
下記のようにAnimationClip3Dを使うことでアニメーションを切り分けて再生することができます。

//開始時間0秒~終了時間0.5秒のモーションを"walk"と名づける
var anim1:AnimationClip3D = new AnimationClip3D("walk", 0, 0.5);
//開始時間0.5秒~終了時間1.5秒のモーションは"bow"と名づける
var anim2:AnimationClip3D = new AnimationClip3D("bow", 0.5, 1.5);
//DAEインスタンスにアニメーションクリップを追加
dae.animation.addClip(anim1);
dae.animation.addClip(anim2);
//"walk"モーションをループ再生
dae.play("walk", true);

動作サンプル

Lightwaveからアニメーションつき.daeへのコンバートはUnwap3Dで問題なくできました。

ようやく3Dゲームとか作れる環境が整ってきたかな。

Lightwave9.6のCollada Exporterではボーンモーションをきちんと書きだせないようなので、諦めかけていたんだけど。
詳しい解説がありました!この情報を探してたんですよ、感謝です。
LightwaveからColladaファイルを書き出すよ | Yellow Soup

今からBlenderとかMax覚えるの大変だからUnwrap 3D買いますよ。

そろそろPV3Dの勉強をしようと思い、colladaファイルの読み込みしようとしたら
ムービープレビューで下記のエラーがトレースされ、テクスチャが表示されない...
ERROR: BitmapFileMaterial: Unable to load file
ERROR: MaterialObject3D: transformUV() material.bitmap not found!
ちなみにブラウザで再生すると問題ない。

原因はDAE.asの1443行目にある下記。
material.texture = url + "?nc=" + Math.random();
単純にmaterial.texture = url ;とすれば解決するけど、
上記は同じdaeのインスタンスを複数作った時のためにあえてやってるらしいので
触らないほうがいいのかもね。


Lightwave9.5.1Trial
から直接collada書き出ししてちゃんと表示できた。
が、なぜか2回目以降の書き出しが正しくできないので、毎回Lightwave終了させないといけない。
BasicViewのデフォルトではcamera.z=-1000だが、それだとカメラが遠すぎて見えない。
Lightwave上で数メートルのオブジェクトの場合はcamera.z=-10くらいが適切。

Flex 3D Demo

| コメント(0) | トラックバック(0)

http://labs.getoutsmart.com/archives/2007/05/02/3d-engine-demo/
さすがにアバターはビルボードだけど、壁に2Dのコンポーネントが貼り付けられるのが良いな。

1 2 3