PotrAsとPaperVision3Dで立体文字



PotrAs on PaperVision3D
http://www.yomogi.sakura.ne.jp/~si/SoftIllness/potras4pv3d/chimi.html
http://www.yomogi.sakura.ne.jp/~si/SoftIllness/index.html#tpda10
id:nitoyonさんのベクタ変換ライブラリPotrAsPaperVision3Dで表示するライブラリを作りました.
PaperVision3D version1.5用ですが,少し手を加えればver1.7でも動きます.詳細は ReadMe 参照.


PotrAsが出たときからアイディアはあったんだけど,PaperVision3Dの構造上,結構実装がめんどくさそうだったので,メタボールが一段落したところで着手してみました.
で,蓋を開けてみたら,PotrAsの方もTurnPolicyが未実装だったり,3Dに応用するには,多少手を加えないとダメみたいだったので,PotrAsのコードにも手を加えてブランチを作りました.オリジナルの引数は弄ってないので,完全互換で動くはずです.


ところで,ライセンスが少々面倒な事になってます.極力 GNU GPL を回避したかったので,PaperVision3D周辺のコードは単独でも動くようにして,修正BSDライセンスにしてます.結果,参照するクラスによってライセンスが違うという事態に陥ってますが,普通に使う場合は GNU GPL になると思います.


あと,ライブラリ内に含まれてる Light/LightingMaterial は,FlatShading用の MterialObject3D としても機能します.PV3D次期バージョンまでのつなぎ位には使えるかも.


以下サンプルのソースコード

package {
    import flash.display.*;
    import flash.text.*;
    import flash.geom.*;
    import flash.events.*;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.cameras.FreeCamera3D;
    import com.si.potras_pv3d.*;
    
    [SWF(width="320", height="240", backgroundColor="#000000", frameRate=60)]
    public class main extends Sprite
    {
        // papervisoin3D classes
        private var field:Sprite;
        private var camera:FreeCamera3D;
        private var scene:Scene3D;
        
        // PotrAs3D classes
        private var light:Light;
        private var material:LightingMaterial;
        private var letter:PolygonalCylinder;
        
        function main()
        {
            // PotrAs3D operations
            // create light (position)
            light = new Light(1,-1,-1);
            
            // create material (light, color, alpha, ambient, diffusion, specular, power, emmitance, double_sided);
            material = new LightingMaterial(light, 0x40c080, 0.7, 64, 192, 128, 16, 0, false);
            
            // create mesh (string, size, font, thickness, material)
            letter = PotrAsPV3D.traceLetter("魑魅魍魎", 96, "_明朝", 40, material);

            // standard operations for papervisoin3D
            field = new Sprite();
            field.x = 160;
            field.y = 120;
            addChild(field);
            scene = new Scene3D(field);
            camera = new FreeCamera3D(2,100);
            camera.z=-200;
            stage.addEventListener(Event.ENTER_FRAME, _onEnterFrame);
            stage.quality = StageQuality.HIGH;
            
            // add child
            scene.addChild(light);
            scene.addChild(letter);
        }

        private function _onEnterFrame(e:Event) : void
        {
            letter.rotationY = -(mouseX-160);
            letter.rotationX = (mouseY-120);
            scene.renderCamera(camera);
        }
    }
}


基本的な流れは,
光源を作る→マテリアルを作る→メッシュを作る→光源とメッシュをシーンに登録
PaperVision3Dでコーディングの経験があるなら,そんなに難しく無いと思います.