forked from: forked from: PV3D でマルチビュー(問題点あり)

by smallflowergame
PV3D でマルチビュー

ということで作ったものの、マルチビューは実現することができたのですが、期待通りの結果になりません。

--- 問題個所 ---
100行目辺り:    colorMaterial.doubleSided = true; // true にすると辺のふちが欠ける

どなたか解決方法を知っている方は教えて頂けないでしょうか?

--- 解決 ---
80行目辺り:  //cameras[ 0 ].z = 1;           // 0 だと表示されない。なぜ?
->PV3D の仕様(バグ?)

--- 検証 ---
forked from: forked from: PV3D でマルチビュー(問題点あり)
http://wonderfl.kayac.com/code/8f3b9cf3f4cc7fab0213362b9ba4346ca452d113)

PV3D でマルチビュー(問題点あり)の問題が起こる過程を再現
http://wonderfl.kayac.com/code/225f3df8bffa868aaad5f127b043dcdee0b75cf8

参考

note.x - [Papervision3D2.0] Viewport3D
http://blog.r3c7.net/?p=130

勉強部屋 - Papervision3Dのカメラ入門
http://www.bushclover-field.jp/papervision_introduction04/

また、この問題を rect さんがとりあげてくれました。

note.x - [PV3D2.x] DisplayObject3D.lookAt problem
http://blog.r3c7.net/?p=394

rect さん、ありがとうございます。

...
@author tkinjo
♥0 | Line 71 | Modified 2010-08-11 17:13:27 | MIT License
play

ActionScript3 source code

/**
 * Copyright smallflowergame ( http://wonderfl.net/user/smallflowergame )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/iGJK
 */

// forked from bobobobobobobobo's forked from: PV3D でマルチビュー(問題点あり)
// forked from tkinjo's PV3D でマルチビュー(問題点あり)
package  
{
    /**
     * PV3D でマルチビュー
     * 
     * ということで作ったものの、マルチビューは実現することができたのですが、期待通りの結果になりません。
     * 
     * 
     * 
     * --- 問題個所 ---
     * 100行目辺り:    colorMaterial.doubleSided = true; // true にすると辺のふちが欠ける
     * 
     * どなたか解決方法を知っている方は教えて頂けないでしょうか?
     * 
     * 
     * 
     * --- 解決 ---
     * 80行目辺り:  //cameras[ 0 ].z = 1;           // 0 だと表示されない。なぜ?
     * ->PV3D の仕様(バグ?)
     * 
     * --- 検証 ---
     * forked from: forked from: PV3D でマルチビュー(問題点あり)
     * http://wonderfl.kayac.com/code/8f3b9cf3f4cc7fab0213362b9ba4346ca452d113)
     * 
     * PV3D でマルチビュー(問題点あり)の問題が起こる過程を再現
     * http://wonderfl.kayac.com/code/225f3df8bffa868aaad5f127b043dcdee0b75cf8
     * 
     * 
     * 
     * 参考
     * 
     * note.x - [Papervision3D2.0] Viewport3D
     * http://blog.r3c7.net/?p=130
     * 
     * 勉強部屋 - Papervision3Dのカメラ入門
     * http://www.bushclover-field.jp/papervision_introduction04/
     * 
     * 
     * 
     * また、この問題を rect さんがとりあげてくれました。
     * 
     * note.x - [PV3D2.x] DisplayObject3D.lookAt problem
     * http://blog.r3c7.net/?p=394
     * 
     * rect さん、ありがとうございます。
     */
    
    import flash.display.Sprite;
    import flash.events.Event;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.core.proto.CameraObject3D;
    import org.papervision3d.core.proto.SceneObject3D;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.view.Viewport3D;
    
    [SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "#ffffff")]
    /**
     * ...
     * @author tkinjo
     */
    public class Main extends Sprite
    {
        /**
         * 
         */
        private var scene:SceneObject3D;
        private var renderer:BasicRenderEngine;
        
        private var viewports:Vector.<Viewport3D>;
        private var cameras:Vector.<CameraObject3D>;
        
        private var cube:Cube;
        
        /**
         * 
         */
        public function Main() 
        {
            scene = new SceneObject3D();
            renderer = new BasicRenderEngine();
            
            viewports = new Vector.<Viewport3D>();
            cameras = new Vector.<CameraObject3D>();
            for ( var i:uint = 0; i < 4; i++ ) {
                
                var viewport:Viewport3D = new Viewport3D( stage.stageWidth / 2, stage.stageHeight/ 2 );
                viewport.x = stage.stageWidth / 2 * ( i % 2 );
                viewport.y = stage.stageHeight / 2 * uint( i / 2 );
                
                var camera:CameraObject3D = new Camera3D();
                camera.target = DisplayObject3D.ZERO;
                camera.z = 0;
                camera.zoom = 115;
                
                viewports.push( viewport );
                cameras.push( camera );
                
                addChild( viewport );
            }
            cameras[ 0 ].y = 1000;
            //cameras[ 0 ].z = 1;    // 0 だと表示されない。なぜ?-> 解決。最上部コメント参照
            cameras[ 1 ].x = 1000;
            cameras[ 1 ].y = 1000;
            cameras[ 2 ].z = 1000;
            cameras[ 3 ].x = 1000;
            
            /**
             * キューブの作成
             * 
             * キューブのコンストラクタ
             * http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/objects/primitives/Cube.html#Cube()
             */
            var cubeMaterialParams:Array = [ 
                    { name:"front", color:0xff0000 }, 
                    { name:"back", color:0xffff00 }, 
                    { name:"right", color:0x00ff00 }, 
                    { name:"left", color:0x00ffff }, 
                    { name:"top", color:0x0000ff },
                    { name:"bottom", color:0xff00ff } 
                ];
            var cubeMaterialsList:MaterialsList = new MaterialsList();
            for ( i = 0; i < 6; i++ ) {
                var colorMaterial:ColorMaterial = new ColorMaterial( cubeMaterialParams[ i ].color );
                //var colorMaterial:ColorMaterial = new ColorMaterial( cubeMaterialParams[ i ].color, 0.5 );
                colorMaterial.doubleSided = false;    // true にすると辺のふちが欠ける
                cubeMaterialsList.addMaterial( colorMaterial, cubeMaterialParams[ i ].name );
            }
            cube = new Cube( cubeMaterialsList, 100, 100, 100 );
            scene.addChild( cube );
            
            /**
             * 
             */
            addEventListener(Event.ENTER_FRAME, enterFrameHandler );
        }
        
        /**
         * 
         * @param    event
         */
        private function enterFrameHandler( event:Event ):void {
            
            cube.rotationY++;
            
            for ( var i:uint = 0; i < 4; i++ ) {
                
                renderer.renderScene( scene, cameras[ i ], viewports[ i ] );
            }
        }
    }
}