forked from: Flashで作る3Dのお勉強9
Flashで作る3Dのお勉強9
プレートを敷き詰めてみた。z軸が同じ時、回転した状態の重なり順はどうやって表現するのだろうか?
たぶん僕には無理。
♥0 |
Line 183 |
Modified 2010-10-02 08:52:44 |
MIT License
archived:2017-03-30 05:24:00
ActionScript3 source code
/**
* Copyright fukt ( http://wonderfl.net/user/fukt )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/nbUb
*/
// forked from ta6b's Flashで作る3Dのお勉強9
//Flashで作る3Dのお勉強9
//プレートを敷き詰めてみた。z軸が同じ時、回転した状態の重なり順はどうやって表現するのだろうか?
//たぶん僕には無理。
package
{
import flash.display.*;
import flash.events.Event;
import flash.events.MouseEvent;
[SWF(backgroundColor=0x333333, frameRate=6)]
public class Main extends Sprite
{
private var vpX:Number = stage.stageWidth / 2;
private var vpY:Number = stage.stageHeight / 2
private var squares:Array;
private var numSquares:Number = 25;
function Main() {
init();
}
private function init():void {
squares = new Array();
for (var i:int = 0; i < numSquares; i++){
var square:Lines3D2 = new Lines3D2(vpX, vpY);
addChild(square);
squares.push(square);
if(i<5){
square.y = -200;
square.x = -200 + i * 100;
}else if (i >= 5 && i < 10) {
square.y = -100;
square.x = -200 + (i-5) * 100;
}else if (i >= 10 && i < 15) {
square.y = 0;
square.x = -200 + (i-10) * 100;
}else if (i >= 15 && i < 20) {
square.y = 100;
square.x = -200 + (i-15) * 100;
}else if (i >= 20 && i < 25) {
square.y = 200;
square.x = -200 + (i-20) * 100;
}
square.zpos = i;
square.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
}
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function mouseOverHandler(e:MouseEvent):void {
e.currentTarget.zpos = numSquares;
}
private function enterFrameHandler(e:Event):void {
sortZ();
}
private function sortZ():void {
squares.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
for (var i:int = 0; i < numSquares; i++) {
var square:Lines3D2 = squares[i];
setChildIndex(square, i);
}
}
}
}
import flash.display.Sprite;
import flash.events.*;
class Lines3D2 extends Sprite
{
private var points:Array;
private var numPoints:int = 4;
private var fl:Number = 250;
private var vpX:Number;
private var vpY:Number;
public var zpos:Number;
public function Lines3D2(vpX:Number, vpY:Number) {
this.vpX = vpX;
this.vpY = vpY;
init();
}
private function init():void {
points = new Array();
points[0] = new Point3D( -90, -90, 0);
points[1] = new Point3D( 90, -90, 0);
points[2] = new Point3D( 90, 90, 0);
points[3] = new Point3D( -90, 90, 0);
for (var i:int = 0; i < numPoints; i++) {
points[i].setVanishingPoint(vpX, vpY);
points[i].setCenter(0, 0, 200);
}
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
}
private function enterFrameHandler(e:Event):void {
graphics.clear();
graphics.lineStyle(0);
graphics.beginFill(0xff0000);
graphics.moveTo(points[0].screenX, points[0].screenY);
for (var i:int = 1; i < numPoints; i++) {
graphics.lineTo(points[i].screenX, points[i].screenY);
}
graphics.lineTo(points[0].screenX, points[0].screenY);
graphics.endFill();
}
private function mouseOverHandler(e:MouseEvent):void {
addEventListener(Event.ENTER_FRAME, rotateY1);
}
private function rotateY1(e:Event):void {
var angleY:Number = 5*Math.PI/180;
for (var i:int = 0; i < numPoints; i++) {
var point:Point3D = points[i];
point.rotateY(angleY);
}
if (point.rotationY > Math.PI-angleY) {
var sabun:Number = point.rotationY - Math.PI;
for (i = 0; i < numPoints; i++) {
point = points[i];
point.rotateY(sabun);
}
removeEventListener(Event.ENTER_FRAME, rotateY1);
point.rotationY = 0;
return;
}
//trace(point.rotationY);
}
}
class Point3D
{
public var fl:Number = 250;
public var _rotationY:Number = 0;
private var vpX:Number = 0;
private var vpY:Number = 0;
private var cX:Number = 0;
private var cY:Number = 0;
private var cZ:Number = 0;
private var x:Number = 0;
private var y:Number = 0;
private var z:Number = 0;
public function Point3D(x:Number = 0, y:Number = 0, z:Number = 0) {
this.x = x;
this.y = y;
this.z = z;
}
public function setVanishingPoint(vpX:Number, vpY:Number):void {
this.vpX = vpX;
this.vpY = vpY;
}
public function setCenter(cX:Number, cY:Number, cZ:Number = 0):void {
this.cX = cX;
this.cY = cY;
this.cZ = cZ;
}
public function get screenX():Number {
var scale:Number = fl / (fl + z + cZ);
return vpX + cX + x * scale;
}
public function get screenY():Number {
var scale:Number = fl / (fl + z + cZ);
return vpY + cY + y * scale;
}
public function get rotationY():Number {
return _rotationY;
}
public function set rotationY(angleY:Number):void {
_rotationY = angleY;
}
public function rotateX(angleX:Number):void {
var cosX:Number = Math.cos(angleX);
var sinX:Number = Math.sin(angleX);
var y1:Number = y * cosX - z * sinX;
var z1:Number = z * cosX + y * sinX;
y = y1;
z = z1;
}
public function rotateY(angleY:Number):void {
var cosY:Number = Math.cos(angleY);
var sinY:Number = Math.sin(angleY);
var x1:Number = x * cosY - z * sinY;
var z1:Number = z * cosY + x * sinY;
x = x1;
z = z1;
_rotationY += angleY;
}
public function rotateZ(angleZ:Number):void {
var cosZ:Number = Math.cos(angleZ);
var sinZ:Number = Math.sin(angleZ);
var x1:Number = x * cosZ - y * sinZ;
var y1:Number = y * cosZ + x * sinZ;
x = x1;
y = y1;
}
}