note.x

Away3Dが、2.2.5にマイナーバージョンアップ。svnリポジトリの trunk から落とせる。
最近あまり情報を追いかけてなかったので、細かいバージョンアップ内容はわかんないけど、バグフィックスが主なようですな。

そんな中で追加されたクラスが、RoundedCube 。角丸直方体というか、ベベルをかけたキューブが生成できる。

RoundedCube Test(要:FlashPlayer9)

import away3d.primitives.RoundedCube;

-- 中略 --

var btMat:BitmapFileMaterial = new BitmapFileMaterial("fuga.jpg");
var rcube:RoundedCube = new RoundedCube({width:200, height:200, depth:200, radius:32, subdivision:2, material:btMat });
scene.addChild(rcube);

てな感じで使う模様。radiusで角丸の半径を指定、subdivision で面の分割数を指定。subdivision の数値を高くすれば角丸がなめらかになる反面、ポリゴン数が増えて負荷も上がる。Sphereとかと同じ。

faces プロパティを使って、6面個別のマテリアル指定も可能。

rcube3 = new RoundedCube({
        width:200, height:200, depth:200, radius:32,
        faces:{ left:cMat1, right:cMat2, bottom:cMat3, top:cMat4, front:cMat5, back:cMat6 }
    });

が、front と back が同じマテリアルになってしまうというバグ発覚。
RoundedCube.as の415行目を、

addFace(createFace(v1,v0,v2, (_cubeMaterials.front == null)? _material : _cubeMaterials.front, uv1, uv0, uv2 ));
↓
addFace(createFace(v1,v0,v2, (_cubeMaterials.front == null)? _material : _cubeMaterials.back, uv1, uv0, uv2 ));

に、修正するとよかです。

また、width、height、depth、radius、subdivision 等のプロパティは動的に値を変化させられるんだけども、毎フレーム数値を変えたりすると激重かつ、描画がおかしくなるので、ひとまずは一度定義したら変えない、もしくは頂点動かしたほうが無難っぽい。

あと、「awaybuilder」っていうクラス群が trunk 内に突如出現。よく調べてないけど、ヘルパクラスいっぱーいって感じかなぁ?


フィルタかけたい時に使うプロパティ、DisplayObject3D.useOwnContainer。これを true にすることで、DisplayObject3D にブラーフィルタとか適用できたりするんだけど、引き換えに

  • InteractiveScene3DEvent.OBJECT_CLICK
  • InteractiveScene3DEvent.OBJECT_DOUBLE_CLICK

イベントが発動しなくなるっていう問題があって、これへの対処法を考えてみた。

papervision3d/view/layer/ViewportLayer.as のコンストラクタに「this.mouseChildren = false」を追加すればオケ。オレは下記のようにした。

public function ViewportLayer(viewport:Viewport3D, do3d:DisplayObject3D, isDynamic:Boolean = false)
{
    super();
    this.viewport = viewport;
    this.displayObject3D = do3d;
    this.dynamicLayer = isDynamic;
    this.graphicsChannel = this.graphics;

    if(isDynamic){
        this.filters = do3d.filters;
        this.blendMode = do3d.blendMode;
        this.alpha = do3d.alpha;
    }

    if(do3d){
        addDisplayObject3D(do3d);
        do3d.container = this;
    }

    this.mouseChildren = false;
    init();
}

これで useOwnContainer が true でもOBJECT_CLICKイベント検出可。
PV3Dのコードに手を入れるのに抵抗がある場合は、OBJECT_PRESS や OBJECT_RELEASE で対処するしかないのが切ないところ。どーにもバグだと思うんだけど、一向に直す気配が無いあたり仕様なのかしら?

あんまりちゃんと検証してないので、他の部分で不具合起こすかも。
問題あったら教えていただけると助かります。