forked from: PV3D でマルチビュー(問題点あり)の問題が起こる過程を再現
forked from PV3D でマルチビュー(問題点あり)の問題が起こる過程を再現 (diff: 1)
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/i9wq
*/
// 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 );
}
}
}