PV3Dで画像を繰り返し敷き詰めてテクスチャにする

PV3D で画像を面に貼り付けたら一面に広がってしまった。こんな感じ。

本当は画像を並べてテクスチャにしたかった。これが理想。


twitter にぶつくさつぶやきながら悩んでたら、c0rin さんに tiled を試すべし と教えてもらえたので試してみた。

重要なコードはココ。敷き詰める数を5にしている。

// tiled を true に、maxU, maxV に敷き詰める数を渡す
m.tiled = true;
m.maxU = 5;
m.maxV = 5;

で、試してみた完成品がこちら。

PV3D のバージョンは 2.0.883

本当なら Cube のサイズに応じて画像を敷き詰めてほしいんだけど、そういうことを実現してくれる Material はないようだ(?)。

ソースはこれ。wonderfl にも post してる

// Papervision3d の BitmapMaterial の tiled 機能を利用して
// 画像をテクスチャとして敷き詰めます。
//
// 左上に表示中の画像が利用する素材です。
// これを5×5のサイズで立方体の面に貼り付けています。
// キーワードは tiled, maxU, maxV です。 package {
import flash.display.*;
import flash.events.Event;
import flash.utils.ByteArray;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.view.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.MaterialsList;
import mx.utils.Base64Decoder;

[SWF(backgroundColor="#000000", width="475", height="475")]
public class PV3DTextureTest extends BasicView {
    // 表示する立方体
    private var cube:Cube;

    // 画像を BASE64 エンコードしたもの
    private static var ImageBase64:String = "R0lGODlhEAAQAJkAAOdfEwAAAPDQsAAAACH5BAAAAAAALAAAAAAQABAAAAI2hI4XhgYPXxBxxkqhvTJ33i0fuATm4l1TsnEt8GIymZ5uCiviqFG6ictBEDGhCmeCnZKCZbIAADs=";

    public function PV3DTextureTest(){
        // 画像をロードして BitmapData に変換する
        // 変換後、loadComplete 関数が呼ばれる
        base64ToBitmapData(ImageBase64, loadComplete);
    }

    private function loadComplete(bmd:BitmapData):void{
        // 表示するテクスチャを右上に表示
        addChild(new Bitmap(bmd));

        // BitmapMaterial に BitmapData を渡す
        var m:BitmapMaterial = new BitmapMaterial(bmd, true);

        // tiled を true に、maxU, maxV に敷き詰める数を渡す
        m.tiled = true;
        m.maxU = 5;
        m.maxV = 5;

        // Cube の面に貼り付ける
        cube = new Cube(new MaterialsList({all:m}));
        scene.addChild(cube);

        // 描画を開始する
        startRendering();
    }

    protected override function onRenderTick(e:Event = null):void{
        cube.rotationX += 1;
        cube.rotationY += .8;
        super.onRenderTick(e);
    }

    private function base64ToBitmapData(base64:String, callback:Function):void{
        var decoder:Base64Decoder = new Base64Decoder();
        decoder.decode(base64);

        var bytes:ByteArray = decoder.toByteArray();
        bytes.position = 0;
        var loader:Loader = new Loader();
        loader.loadBytes(bytes);
        var bmd:BitmapData = new BitmapData(16, 16);
        loader.contentLoaderInfo.addEventListener("complete", function(event:Event):void{
            var bmd:BitmapData = new BitmapData(loader.width, loader.height);
            bmd.draw(loader);
            callback(bmd);
        });
    }
}
}