2008.7.9 水曜日
久々のPV3Dネタ。
アクセスログ見てたら、FxUGのフォーラムでオレのエントリが引き合いに出されてたんで、これについて補足してみる。
とりあえず、
var bitmapMaterial:BitmapMaterial = new BitmapFileMaterial("sample.jpg");
は、マズいんじゃないかと。
それはおいといて、上記のトピックは「 MovieMaterial を使えば、precise が有効にできる。」という解釈で終了してる感じだけど、そもそも precise プロパティで制御するパースペクティブコレクトの機能は、BitmapMaterial クラスで提供されてるものなので BitmapMaterial を継承する全マテリアルで指定が可能なハズ。MovieMaterial も、そのひとつっていうだけのハナシ。
というわけで、基本である BitmapMaterial で precise プロパティを使ってみたデモが下記。
material.preciseのテスト(要:FlashPlayer9)
※キューブをクリックすると、preciseプロパティの true / false 切り替え。
そのソース。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| package
{
import flash.display.*;
import flash.events.*;
import org.papervision3d.view.BasicView;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.utils.MaterialsList;
[SWF(backgroundColor=0x000000)]
public class bm_precise extends BasicView
{
private var rootNode: DisplayObject3D;
private var valx : Number = 0;
[Embed(source='texture.jpg')] public var texBitmap:Class;
public function bm_precise()
{
stage.frameRate = 30;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.MEDIUM;
//viewportの定義とカメラタイプ定義
super (0,0,true,true,"CAMERA3D");
init3D();
}
public function init3D():void
{
rootNode = new DisplayObject3D();
scene.addChild(rootNode);
//カメラ設定
camera.z = -400;
camera.y = 200;
camera.focus = 260;
camera.zoom = 2;
//マテリアル設定
var material:BitmapMaterial = new BitmapMaterial( new texBitmap().bitmapData, true );
material.interactive = true;
var materials:MaterialsList = new MaterialsList(
{
all : material
});
//オブジェクト生成
var objCube:Cube = new Cube( materials, 250, 250, 250, 1, 1, 1);
rootNode.addChild(objCube);
objCube.material.tiled = true;
objCube.material.maxU = 2;
objCube.material.maxV = 2;
objCube.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, mouseRelease);
//レンダリング開始
startRendering();
}
override protected function onRenderTick(event:Event=null):void
{
valx += (stage.mouseX - (stage.stageWidth >> 1 ) ) / 50;
rootNode.rotationY = valx;
super.onRenderTick(event);
}
private function mouseRelease(event:InteractiveScene3DEvent):void
{
var targetMat:BitmapMaterial = event.displayObject3D.materials.materialsByName['all'];
targetMat.precise = !targetMat.precise;
}
}
} |
SWFにBitmapを埋め込んじゃうのが一番ラク。
件のトピックで質問者の方が公開してるソースで使ってる BitmapFileMaterial のように、外部ファイルを使ってマテリアルを生成する場合は、ファイルの読み込み完了を待たずに描画を始めるとエラーになる。これは、BitmapMaterial の drawTriangle メソッド内で precise プロパティが false の場合は bitmap の存在をチェックしているのに、trueの場合、bitmap が nullでも描画しようとしてるため。バグか仕様かはともかくとして、要はファイルの読み込み完了を待たないとダメと。
で、どうするかの例が下記のソース。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
| package
{
import flash.display.*;
import flash.events.*;
import org.papervision3d.view.BasicView;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.materials.utils.MaterialsList;
[SWF(backgroundColor=0x000000)]
public class bmf_precise extends BasicView
{
private var rootNode:DisplayObject3D;
private var material:BitmapFileMaterial;
private var valx : Number = 0;
public function bmf_precise()
{
stage.frameRate = 30;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.MEDIUM;
//viewportの定義とカメラタイプ定義
super (0,0,true,true,"CAMERA3D");
loadMaterial();
}
public function loadMaterial():void
{
//ファイル読み込み後のコールバック指定
BitmapFileMaterial.callback = init3D;
material = new BitmapFileMaterial( 'texture.jpg', true );
material.interactive = true;
}
public function init3D():void
{
rootNode = new DisplayObject3D();
scene.addChild(rootNode);
//カメラ設定
camera.z = -400;
camera.y = 200;
camera.focus = 260;
camera.zoom = 2;
//マテリアル設定
var materials:MaterialsList = new MaterialsList(
{
all : material
});
//オブジェクト生成
var objCube:Cube = new Cube( materials, 250, 250, 250, 1, 1, 1);
rootNode.addChild(objCube);
objCube.material.tiled = true;
objCube.material.maxU = 2;
objCube.material.maxV = 2;
objCube.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, mouseRelease);
//レンダリング開始
startRendering();
}
override protected function onRenderTick(event:Event=null):void
{
valx += (stage.mouseX - (stage.stageWidth >> 1 ) ) / 50;
rootNode.rotationY = valx;
super.onRenderTick(event);
}
private function mouseRelease(event:InteractiveScene3DEvent):void
{
var targetMat:BitmapFileMaterial = event.displayObject3D.materials.materialsByName['all'];
targetMat.precise = !targetMat.precise;
}
}
} |
BitmapFileMaterial.callback = init3D;
って感じで、ファイル読み込み後のコールバックが指定できるので、これを使った。PV3Dの仕様に合わせるならこんな感じだけど、実際にはBitmapFileMaterialを使わずに自前で外部ファイル読み込んで、BitmapMaterial使ったほうが自由度高いと思う。MovieMaterialを使う場合でも、外部のSWFを読み込んで使うなら当然同じ事に注意。
あと、オレのようにFlexSDKオンリーで外部ファイルを使うコードは、コンパイル時
mxmlc -use-network=false hoge.as
にしないと、スタンドアローンプレーヤーでローカル再生できない。FlashIDEとかFlexBuilderだったら、この辺は大丈夫なのかな。(Rascutはこういうことから開放されるので、すこぶる便利。)
と、ここまで書いてアレだけど、上記ソースのカメラ設定部分を下記のように書き換えると、案外歪みが目立たなくなる。
//カメラ設定
camera.z = -3500;
camera.y = 1500;
camera.focus = 320;
camera.zoom = 10;
テクスチャの歪みはパースがきつくなると発生するので、視野角が極端に広くならないようにfocusとzoomを調整してやれば、それで済んじゃう場合もある。奥行き感が無くなるのとトレードオフだけど、今回のように「ステージ中心にオブジェクトひとつ」みたいな場合はこれで充分かも。precise 使う場合でも、カメラとの距離に応じて true / false できるようにしておくとか、負荷軽減の工夫は必要かと。
Posted by admin |
papervision3d2.0
|
Comments(0)
2008.7.8 火曜日

FLASH OOP for ActionScript 3.0 / Flash OOP Japan 株式会社クスール (翔泳社)

満を持して発売された「FLASH OOP for ActionScript 3.0」の第9章にて、当blogをご紹介いただきました。感謝感激でございます!
セトウさん、ありがとうございました。
とりあえずゲットしてパラパラ眺めてみましたが、8章あたりまでの内容が、この本の本来のお題目「OOP」にフォーカスしてるのに対して、9章からの実践編がいきなりブッ飛んでて面白かった(笑)13章「サウンド表現」と15章「外部デバイスとの連携」あたりがかなり興味深かったです。
実践編のようなネタだけを一冊にまとめた「.fla」のAS3.0版みたいなの出ないかな。
Posted by admin |
この投稿にタグはありません。 |
Comments(0)
2008.7.5 土曜日
SCRATCHBRAINさんのエントリ「Away3D v2.1.0の使い方(8)- daeファイルのエラー解析中」で、オレがハマったのと全く同じ問題でお悩みのご様子なので支援してみる。
結論から書くと、書き出された.daeファイルにUV定義に関するノードが含まれてないのが原因。…たぶん。
他の問題の可能性もあるけど、SCRATCHBRAINさんが公開して下さった 問題のあるdaeファイル を拝見した感じだとほぼ間違いないかと。
解決するには、以下のような感じで。
1. UVを定義するオブジェクトを選ぶ。
2. Editingパネルの「Mesh」にある、「UV Texture」項目の「New」ボタンを押してUV定義を新規作成しつつ割り当て。オブジェクトが複数ある場合は、全てにこの作業を行う。(Blender2.45までだったら、UV Face Selectモードに一度切り替えることで、自動でUV定義される)

3. Collada Pluginでエクスポート。
キチンと作り込む場合は、UV定義しただけじゃ当然ダメで、UVエディット機能でしっかり指定する必要があるけど、単純にAway3DやPV3Dで読み込み可能なファイルにするだけなら、上記の手順でイケるはずです。(ダメだったら、イケねーぞゴルァ!とかコメントでも)
それから、(ほとんど私信になっちゃうけど)件の.daeファイルにはカメラやライト、Physicsに関するノードが含まれてますが、これ全然いらないです。書き出したいオブジェクトのみを選択した状態で、「Only Export Selection」を有効にしてエクスポートするといいと思います。あと「Disable Physics」を有効にするといいんじゃないかと。これらは、Away3Dで読み込むこととはあんまり関係ないですが、余計なデータは無いに越したことはないので。
Posted by rect |
blender
|
Comments(3)
2008.7.3 木曜日

AS3Exporterのテスト(要:FlashPlayer9)
Blenderから頂点・頂点インデックス・UV座標値を、各種AS3用3Dエンジン(Away3D、PV3D、Sandy)に対応した.asファイルとして吐き出すスクリプトが公開されてたのを最近見つけたんで使ってみた。スクリプト本体のダウンロードや、導入方法、基本的な使い方は、下記配布元で懇切丁寧に解説されてる。
http://rozengain.com/?postid=54
Away3D2.0以降で使う場合は、パッケージ構造の変更に対応するために下記のような修正が必要だった。
AS3Export.py - 186〜199行目
as_output_string = "package "+as_package_name.val+" {n"
as_output_string += "timport away3d.core.*;n"
as_output_string += "timport away3d.core.mesh.*;n"
as_output_string += "timport away3d.core.material.*;n"
as_output_string += "timport away3d.core.utils.*;nn"
as_output_string += "tpublic class "+as_class_name.val+" extends Mesh {n"
as_output_string += "ttprivate var ve:Array;n"
as_output_string += "ttprivate var fa:Array;nn"
as_output_string += "ttpublic function "+as_class_name.val+"(init:Object = null) {n"
as_output_string += "tttsuper( init );n"
as_output_string += "tttinit = Init.parse(init);n"
as_output_string += "tttve = [];n”
を、下記のように変更した。
as_output_string = "package "+as_package_name.val+" {n"
as_output_string += "timport away3d.core.*;n"
as_output_string += "timport away3d.core.base.*;nn"
as_output_string += "tpublic class "+as_class_name.val+" extends Mesh {n"
as_output_string += "ttprivate var ve:Array;n"
as_output_string += "ttprivate var fa:Array;nn"
as_output_string += "ttpublic function "+as_class_name.val+"(init:Object = null) {n"
as_output_string += "tttsuper( init );n"
as_output_string += "tttve = [];n”
それ以外は今のとこ問題なく、最新の2.46でもちゃんと動作した。
忘れがちなので要注意だったのが、Colladaエクスポーターと違って△ポリに自動変換してくれないので、エクスポート前に△ポリに変換しておくべし。
書き出された .as は、普通にMeshを継承したクラスになってるので、プリミティブオブジェクトと同じように扱えばオッケ。
当然ながらアニメーションには対応してないけど、これ結構便利かも。頂点とUV定義だけで充分な場合Collada使う意味無いし、そういうケースのほうが多いし。あと、モデルデータがファイルとして存在しない分コンテンツ保護にも繋がりそう。
Posted by rect |
blender
|
Comments(3)
2008.6.26 木曜日

THE WORLD OF TRADITIONAL COLORS(要:FlashPlayer9)
[Papervision3D2.0] 日本の伝統色をHSV色空間に3Dプロットしてみた
のネタをAway3Dでもやってみる。
けど、単なる移植じゃつまんないし、簡易デモばっかしで殺伐としたこのblogに、色気を添える訓練も兼ねて、ちょっとしたコンテンツっぽく作り込んでみた。キチンと作り込もうとすると、AS3.0はいきなり牙を剥きますな。プリローディングとかハマりにハマった。苦労した分、勉強になったんでヨシとするべ。
各国の首都にポジションを合わせる処理は、
Learn how to geocode with Papervision3D and Adobe Flex
を参考に、Geoコードから割り出したベクトルを元に地球を回転させてます。
上記エントリのサンプルでも使ってるテクスチャは、地球テクスチャのデファクトスタンダードになりつつあるコレ。低解像度版がフリーで使える。
Posted by rect |
away3d
|
Comments(3)
2008.6.6 金曜日

UV_test.swf(要:FlashPlayer9)
PV3Dと同じネタをAway3Dでもやってみた。
今回はflvをテクスチャにしてみた。Away3Dの場合 VideoStreamMaterial が無いんで、初期のPV3Dと同様に BitmapMaterial をマテリアル指定しておいといて、毎フレーム BitmapData.draw(video) で対処した。
UV定義の理屈は [Papervision3D2.0] geometry.faces[n].uv で書いたのと全く一緒。UV定義にアクセスする手段が違うんで一応メモ。
var mat:BitmapMaterial = new BitmapMaterial( BitmapData );
var objPlane:Plane = new Plane({material:mat, width:100, height:100});
scene.addChild(objPlane);
objPlane.faces[0].uv0 = new UV(0.5, 0);
objPlane.faces[0].uv1 = new UV(1, 0);
objPlane.faces[0].uv2 = new UV(0.5, 0.5);
objPlane.faces[1].uv0 = new UV(1, 0.5);
objPlane.faces[1].uv1 = new UV(0.5, 0.5);
objPlane.faces[1].uv2 = new UV(1, 0);
PV3Dは、VerticesとFaceを束ねる Geometry3D オブジェクトを経由するけど、Away3Dだと Geometry3D が排除されてるのでスッキリした印象。Geometry3Dって無駄としか思えんなぁ。
今回のデモとは全く関係ないけど、Away3Dのsvnリポジトリに FlashPlayer10対応版のブランチができてた。
http://away3d.googlecode.com/svn/branches/3.0.0/src/away3d/
Astro版を「Away3D 3.0」と位置づけてるみたいだ。
現状は、新しいビルトインクラスと名称がカブってた Matrix3D とかのクラス名変更のみで、最適化されてたりビルトインクラスへの置き換えがされてるわけじゃなく、FlashPlayer10向け開発環境でもコンパイル出来るようになったっていうだけっぽい。
とはいえAway3Dの開発チームは Astro 時代もライブラリの拡張を進めてくれそうで楽しみ。
Posted by rect |
away3d
|
Comment(1)
2008.6.5 木曜日
Roxik城戸氏入魂の「THE ECO ZOO | ECODA!DOBUTSUEN」ラウンチ。
動作の軽快さが尋常じゃない。未だに使ってるPowerPCのPowerBookG4でもサクサク。
PV3DやAway3Dじゃこうはいかない。とにかく挙動に一切の澱みが無いのがオドロキ&小気味良い!
とかいう技術的側面もさることながら、コンセプトメイキング〜世界観の作り込み〜各種のエレメント作成に至るまで、恐ろしいほど高次元でバランスされてて、ごめんなさいもう許してくださいって感じ。天才ってのはこういう人の事を言うんだろうなぁ。
とりあえずFlashで3Dやるならこの水準を目指して頑張ろう。
Posted by rect |
3d
|
Comments(7)
2008.6.2 月曜日
Platform website and Alternativa3D launch
Alternativa3D .swc公開されましたな。
自由に商用利用できないんでPV3Dほど普及しなそうだけど、非商用で使うなら無料。商用利用の場合のライセンスについては問い合わせしなくちゃならないんで、料金体系とかは不明。
もう一つ気になるエンジンに「electric3d(旧:Perl3D)」ってのもあるけど、こっちはライブラリ配布してないんで、現時点ではAlternativa3Dが最強のAS用3Dエンジンなんじゃないかと。
とりあえずドキュメントがロシア語しか無いし、オレはしばらくAway3Dで遊ぶ。
2008/06/04追記:
とかなんとか言ってるうちに英語ドキュメント公開。仕事早いなぁ。
Posted by rect |
3d
|
Comment(1)
2008.5.21 水曜日

astro_test.swf(要:FlashPlayer10 beta)
Astro触ってみた。好評現実逃避中。
Targeting Flash Player 10 Beta with Flex SDK 3.0.x - Adobe Open Sourceを参照しつつFlashPlayer10向け環境をセットアップ。SDKはBuild 3.0.1.1739 を使った。
Sprite、MovieClipで使える3DEffect(.z とか、rotationX,Y,Z とか)って、flash.geom.Transform 使った変形をお手軽に使えるようにしたものっていう解釈でいいのかな? 簡単だし軽いんで、ちょっと3Dっぽくしたい時はこれで充分かと。
んで、もうちょっとマジメに3Dしたい場合はやっぱり頂点シェーダー的なものを実装しなくちゃならないわけで、その辺に挑戦してみたのが上記のデモ。
キモになる部分をまとめたソースが以下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
| package
{
import flash.display.*;
import flash.events.*;
import flash.geom.*;
[SWF(backgroundColor="#000000")]
public class astro_sample extends Sprite
{
private var view:Sprite;
private var fov:PerspectiveProjection = new PerspectiveProjection();
private var vertex:Vector.<vector3d>;
private var matrix:Matrix3D;
private var deg:Number = 0;
private var dot:Vector.<sprite> = new Vector.<sprite>();
private var pivot:Vector3D = new Vector3D(0,0,0);
private var Yaxis:Vector3D = new Vector3D(0,1,0);
private var wid:Number = 100;
private var hei:Number = 100;
private var dep:Number = 100;
public function astro_sample()
{
stage.frameRate = 60;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.BEST;
init3D();
}
private function init3D():void
{
view = new Sprite();
addChild(view);
view.x = stage.stageWidth >> 1;
view.y = stage.stageHeight >> 1;
view.z = 0;
//視野角の設定
fov.fieldOfView = 55;
//頂点の定義
vertex = Vector.<vector3d>
([
new Vector3D(-wid/2, +hei/2, -dep/2),
new Vector3D(+wid/2, +hei/2, -dep/2),
new Vector3D(+wid/2, -hei/2, -dep/2),
new Vector3D(-wid/2, -hei/2, -dep/2),
new Vector3D(-wid/2, +hei/2, +dep/2),
new Vector3D(+wid/2, +hei/2, +dep/2),
new Vector3D(+wid/2, -hei/2, +dep/2),
new Vector3D(-wid/2, -hei/2, +dep/2)
]);
//表示オブジェクト定義
for (var i:int = 0; i < 8; i++)
{
var s:Sprite = new Sprite();
view.addChild(s);
s.graphics.beginFill(0x0099CC);
s.graphics.drawCircle(0, 0, 5);
s.graphics.endFill();
dot.push(s);
}
stage.addEventListener(Event.RESIZE, onStageResize);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
//Render Loop
private function onEnterFrame(event:Event):void
{
//回転角度を増加
deg++;
matrix = new Matrix3D();
//回転行列生成
matrix.appendRotation(deg, Yaxis, pivot);
//プロジェクション行列と合成
matrix.append(fov.toMatrix3D());
for(var i:int = 0; i < vertex.length; i++ )
{
//座標変換
var v:Vector3D = matrix.transformVector(vertex[i]);
v.w = fov.focalLength / (fov.focalLength + v.z);
v.project();
//表示オブジェクト座標に割り当て
dot[i].x = v.x;
dot[i].y = v.y;
}
}
private function onStageResize(event:Event):void
{
view.x = stage.stageWidth >> 1;
view.y = stage.stageHeight >> 1;
}
}
} |
下記の記事が大いに参考になりました。
地味で実装が辛いコアクラスが一通りビルトインされてるってのはスゲェ。
Vector3DとMatrix3DとPerspectiveProjectionクラスだけでそれっぽいものが出来た。やっててよかったPV3D。
PV3DやSandyをはじめとする既存3Dエンジンは、このへんのコアクラスを全部入れ替えて、Arrayの代わりにVectorは積極的に使いつつ、drawTrianglesで描画するように変更するだけでかなり高速化されるんじゃないのかなぁ。パースペクティブコレクトのおまけ付きだし。
Posted by rect |
astro
|
Comments(0)
2008.5.17 土曜日
出ましたな。
すでに、3D Effectsのデモが。仕事早いなぁ。
ざっくり見た感じ、FIVe3Dがビルトインになったような印象を受けた。
ビルボード表現とか、パーティクルっぽい感じとか、簡易的に3D表現を演出に取り入れるならこれで充分だなぁ。
逆に、モデリングしたデータを読み込んで〜とか言い出し始めると、結局かなり作り込んだラッパークラス群が必要になるんじゃねーかと(そんな需要があるとも思えないけど)。Z-Sortも自前でやらなきゃならないみたいだし、ビルトインのTween機能に対してTweenerがあるように、3D Effectsの使い勝手を向上させるライブラリが登場するんでしょうな。
去年情報公開されてからというもの、3D Effects と Enhanced Drawing APIでPV3D涙目とか囁かれてたけど、むしろこれで既存の3Dライブラリが高速化されたらうれしげ。特にPixel Benderを利用してGPUの恩恵を得られれば相当無茶なことが出来そうな気がするので超楽しみ。
全然関係無いけど、Google Maps API for Flashが公開されたりとか、Flash界隈が面白そうな事でいっぱいなのに、仕事も目一杯でちっとも遊べない。早く終わらせて遊びてぇー!
追記:
alternativaplatform(旧alternativagames)のAnton Volkov氏にいただいたSPコメント(笑)によると、Alternativa3Dが早くもAstro対応したらしい。対応迅速すぎ。んで、対応版を見た感じやっぱ早くなってる。
どっちのデモも始めに低解像度のテクスチャで表示されて、順次高解像度のテクスチャに入れ替わる(かなり時間かかる)のはAstro対応前と同じなんだけど、(全部高解像度テクスチャになった状態はかなりヤバい)Astro版は、これにパースペクティブコレクトが完璧にキまる。重い処理だと思うんだけどパフォーマンスが維持されてるなぁ。この辺がAstro様の御加護なのかしら?さらにチューニングされたらどうなっちゃうんだろ。
早くAlternativa3Dのswc配布を始めて欲しいッス。
Posted by rect |
astro
|
Comments(2)