forked from: PV3D でマルチビュー(問題点あり)の問題が起こる過程を再現

by smallflowergame forked from PV3D でマルチビュー(問題点あり)の問題が起こる過程を再現 (diff: 206)
PV3D でマルチビュー(問題点あり)の問題が起こる過程をマルチビューでみてみる

PV3D でマルチビュー(問題点あり)
http://wonderfl.kayac.com/code/3affbb69d1ad490c7e5ba360ec894be9be251d68

...
@author tkinjo
♥0 | Line 138 | Modified 2010-08-11 18:26:22 | 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/STa8
 */

// forked from tkinjo's PV3D でマルチビュー(問題点あり)の問題が起こる過程を再現
// forked from tkinjo's ターゲットの周りを飛ぶキューブ
package  
{
    /**
     * PV3D でマルチビュー(問題点あり)の問題が起こる過程をマルチビューでみてみる
     * 
     * PV3D でマルチビュー(問題点あり)
     * http://wonderfl.kayac.com/code/3affbb69d1ad490c7e5ba360ec894be9be251d68
     */
    
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.utils.Timer;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.core.geom.Lines3D;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.special.LineMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Cone;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.view.Viewport3D;
    
    [SWF(width=465,height=465,frameRate=60,backgroundColor=0xffffff)]
    /**
     * ...
     * @author tkinjo
     */
    public class Main extends BasicView
    {
        private const radius:Number = -1000;
        private const targetToCubeRadius:Number = - 1000;
        
        private var angleXY:Number = 0;
        private var angleYZ:Number = 0;
        
        private var viewport2:Viewport3D;
        private var camera2:Camera3D;
        
        private var viewport3:Viewport3D;
        private var camera3:Camera3D;
        
        private var textField:TextField;
        private var textField2:TextField;
        private var textField3:TextField;
        
        private var cube:Cube;
        
        public function Main() 
        {
            viewport.viewportWidth = stage.stageWidth / 2;
            viewport.viewportHeight = stage.stageHeight / 2;
            
            var frontCube:Cube = new Cube( new MaterialsList( { all : new ColorMaterial( 0xff0000, 0.5 ) } ), 100, 100, 100 );
            frontCube.z = -200;
            scene.addChild( frontCube );
            
            var backCube:Cube = new Cube( new MaterialsList( { all : new ColorMaterial( 0xffff00, 0.5 ) } ), 100, 100, 100 );
            backCube.z = 200;
            scene.addChild( backCube );
            
            var leftCube:Cube = new Cube( new MaterialsList( { all : new ColorMaterial( 0x00ff00, 0.5 ) } ), 100, 100, 100 );
            leftCube.x = -200;
            scene.addChild( leftCube );
            
            var rightCube:Cube = new Cube( new MaterialsList( { all : new ColorMaterial( 0x00ffff, 0.5 ) } ), 100, 100, 100 );
            rightCube.x = 200;
            scene.addChild( rightCube );
            
            var topCube:Cube = new Cube( new MaterialsList( { all : new ColorMaterial( 0x0000ff, 0.5 ) } ), 100, 100, 100 );
            topCube.y = 200;
            scene.addChild( topCube );
            
            var bottomCube:Cube = new Cube( new MaterialsList( { all : new ColorMaterial( 0xff00ff, 0.5 ) } ), 100, 100, 100 );
            bottomCube.y = -200;
            scene.addChild( bottomCube );
            
            var targetCube:Cube = new Cube( new MaterialsList( { all : new WireframeMaterial( 0 ) } ), 100, 100, 100 );
            scene.addChild( targetCube );
            
            var wireframeMaterial:WireframeMaterial = new WireframeMaterial( 0 );
            wireframeMaterial.doubleSided = true;
            cube = new Cube( new MaterialsList( { all : wireframeMaterial } ), 100, 100, 100 );
            scene.addChild( cube );
            
            /**
             * viewport2 の設定
             */
            viewport2 = new Viewport3D( stage.stageWidth / 2, stage.stageHeight / 2 );
            viewport2.x = stage.stageWidth / 2;
            addChild( viewport2 );
            
            camera2 = new Camera3D();
            camera2.target = DisplayObject3D.ZERO;
            
            /**
             * viewport3 の設定
             */
            viewport3 = new Viewport3D( stage.stageWidth / 2, stage.stageHeight / 2 );
            viewport3.x = stage.stageWidth / 2;
            viewport3.y = stage.stageWidth / 2;
            addChild( viewport3 );
            
            camera3 = new Camera3D();
            camera3.x = 2000;
            camera3.y = 2000;
            camera3.z = -2000;
            camera3.target = DisplayObject3D.ZERO;
            
            /**
             * textField の設定
             */
            textField = new TextField();
            textField.autoSize = TextFieldAutoSize.LEFT;
            textField.text = "問題が起こる過程を再現";
            addChild( textField );
            
            textField2 = new TextField();
            textField2.x = stage.stageWidth / 2;
            textField2.autoSize = TextFieldAutoSize.LEFT;
            addChild( textField2 );
            
            textField3 = new TextField();
            textField3.x = stage.stageWidth / 2;
            textField3.y = stage.stageWidth / 2;
            textField3.autoSize = TextFieldAutoSize.LEFT;
            addChild( textField3 );
            textField3.text = "動いているワイヤーフレームキューブは\nカメラのつもり"
            
            startRendering();
            
            addEventListener( Event.ENTER_FRAME, enterFrameHandler );
        }
        
        /**
         * 
         * @param    event
         */
        private function enterFrameHandler( event:Event ):void {
            
            if ( angleYZ == 90 ) {
                
                if( camera.target )
                    camera.target = null;
                    
                if ( 180 < camera.rotationY ) {
                    
                    camera.target = DisplayObject3D.ZERO;
                    angleYZ++;
                    
                } else 
                    camera.rotationY++;
                
            } else if ( angleYZ == 270 ) {
                
                if( camera.target )
                    camera.target = null;
                    
                if ( 180 < camera.rotationY ) {
                    
                    camera.target = DisplayObject3D.ZERO;
                    angleYZ++;
                    
                } else 
                    camera.rotationY++;
                
            }  else if ( angleYZ == 360 ) {
                
                angleYZ = 1;
                
            } else {
                
                angleYZ++;
            }
            
            var thetaXZ:Number = angleXY * Math.PI / 180;
            var thetaYZ:Number = angleYZ * Math.PI / 180;
            camera.x = radius * Math.cos( thetaYZ ) * Math.sin( thetaXZ );
            camera.y = -radius * Math.sin( thetaYZ );
            camera.z = radius * Math.cos( thetaYZ ) * Math.cos( thetaXZ );
            camera2.x = camera.x;
            camera2.y = camera.y;
            camera2.z = camera.z;
            
            cube.x = targetToCubeRadius * Math.cos( thetaYZ ) * Math.sin( thetaXZ );
            cube.y = - targetToCubeRadius * Math.sin( thetaYZ );
            cube.z = targetToCubeRadius * Math.cos( thetaYZ ) * Math.cos( thetaXZ );
            cube.rotationX = thetaYZ * 180 / Math.PI;
            cube.rotationY = camera.rotationY;
            
            
            textField.text = "問題が起こる過程を再現";
            if ( angleYZ == 90 || angleYZ == 270 ) {
                
                camera2.z = 0;
                textField.appendText( "\nカメラ反転中\n\nこのとき、カメラはワイヤーフレームキューブに\n囲まれているはずなのに\n右のように何も表示しない" );
            }
            textField2.text = "camera2.z = " + int( camera2.z ) + "\nangleYZ = " + angleYZ;
            
            renderer.renderScene( scene, camera2, viewport2 );
            renderer.renderScene( scene, camera3, viewport3 );
        }
    }
    
}