Avg. Rating 5.0

Problem

You can't use lineTo and moveTo to draw in 3d natively and you don't have a 3d camera natively.

Solution

make one. Please see the code below.

Detailed explanation

I want to be able to draw in 3d space in Flash that I can move and rotate.  I also want it to be very understandable and easy to use.

In rar files there is all the code of the next example.

drow3D_5.html

  drow3D_5.rar

You can move with the arrows and with Q W E as well as rotate with A and D.

Now lets see the code:

        var DEG_TO_RAD : Number = Math.PI/180;   
function render(mc:MovieClip,model:Array):void{
/*render the movie clip
drow all the 3d point in the array to the movie clip*/
mc.graphics.clear();
mc.graphics.lineStyle(1,0);
var len:int=model.length;
var X:Number;
var Y:Number;
var Z:Number;
var dis:Number;
var RX:Number;

for(var i:int=0;i<len;i++){
X=model[i][1];
Y=model[i][2];
Z=model[i][3];
 RX=X*(200/Z);
dis=Math.sqrt(X*X+Y*Y+Z*Z);
if(Z>0 && dis<1000 &&RX<1000
&&RX>-1000){
if(model[i][0]=="l"){
mc.graphics.lineTo(RX,Y *(200/(Z)));
}else{mc.graphics.moveTo(RX,Y *(200/Z)); }
}else{
if(dis<1000){
Z=1;
mc.graphics.moveTo(X*(200/Z),Y *(200/Z));
}
} 
}
}

function addP3d(model:Array,X:Number=0,Y:Number=0,Z:Number=1):void{
/*add a 3d point to the array*/
model.push(["l",X,Y,Z]);
}
function addMP(model:Array,X:Number=0,Y:Number=0,Z:Number=1):void{
/*add a 3d point of moving to the array*/
model.push(["m",X,Y,Z]);
}

/*all the next function move the 3d camera*/
function moveX(model:Array,speed:Number=10):void{
var len:int=model.length;
for(var i:int=0;i<len;i++){
model[i][1]+=speed;
}
}
function moveY(model:Array,speed:Number=10):void{
var len:int=model.length;
for(var i:int=0;i<len;i++){
model[i][2]+=speed;
}
}
function moveZ(model:Array,speed:Number=10):void{
var len:int=model.length;
for(var i:int=0;i<len;i++){
model[i][3]+=speed;
}
}

/*all the next function rotate the 3d camera*/
function rotY(model:Array,angle:Number=7):void{
/*rotate the 3d camera y in the speed*/
var len:int=model.length;
for(var i:int=0;i<len;i++){
var cosRY:Number = Math.cos(angle * DEG_TO_RAD);
var sinRY:Number = Math.sin(angle * DEG_TO_RAD);    
var tempZ:Number=model[i][3];
var tempY:Number=model[i][2];
  model[i][2] = (tempY*cosRY)-(tempZ*sinRY);
       model[i][3]= (tempY*sinRY)+(tempZ*cosRY);
}
}
function rotZ(model:Array,angle:Number=7):void{
var len:int=model.length;
for(var i:int=0;i<len;i++){
var cosRY:Number = Math.cos(angle * DEG_TO_RAD);
var sinRY:Number = Math.sin(angle * DEG_TO_RAD);    
var tempX:Number=model[i][1];
var tempY:Number=model[i][2];
    model[i][1] = (tempX*cosRY)-(tempY*sinRY);
        model[i][2] = (tempX*sinRY)+(tempY*cosRY);
}
}
function rotX(model:Array,angle:Number=7):void{
var len:int=model.length;
for(var i:int=0;i<len;i++){
var cosRY:Number = Math.cos(angle * DEG_TO_RAD);
var sinRY:Number = Math.sin(angle * DEG_TO_RAD);    
var tempZ:Number=model[i][3];
var tempX:Number=model[i][1];
  model[i][1] = (tempX*cosRY)+(tempZ*sinRY);
       model[i][3]= (tempX*-sinRY)+(tempZ*cosRY);
}
}

/*function
lineTo3d(mc:MovieClip,X:Number=0,Y:Number=0,Z:Number=1):void{
mc.graphics.lineTo(X*(200/(20+Z)),Y *(200/(20+Z)));
}
function
moveTo3d(mc:MovieClip,X:Number=0,Y:Number=0,Z:Number=1):void{
mc.graphics.moveTo(X*(200/(20+Z)),Y *(200/(20+Z)));
}*/
 
 
 
  

The following code handles the key press simply cope it to a new layer.

        var keyArray:Array = new Array();
for(var k:int=0;k<222;k++){
keyArray.push([k,false]);
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown);
stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp);

function checkKeysDown(event:KeyboardEvent):void{
keyArray[event.keyCode][1]=true;
}
function checkKeysUp(event:KeyboardEvent):void{
keyArray[event.keyCode][1]=false;
}
function KeyDown(X){
return keyArray[X][1];
} 
   
 
 
 
  

The code below is what you need to do to work with this engine.

                var env:Array=new Array();//hold the 3d
points
var cam:MovieClip=new MovieClip(); //the mc you draw on
addChild(cam);
addEventListener(Event.ENTER_FRAME,drow);
cam.x=stage.stageWidth*0.5;
cam.y=stage.stageHeight*0.5;
var X2:Number=0;
var Y2:Number=0;

function drow(e):void
{
//render(cam,env);
if(KeyDown(37)){
moveX(env);
render(cam,env);
}

if(KeyDown(39)){
moveX(env,-10);
render(cam,env);
}
if(KeyDown(87)){
moveZ(env,-10);
render(cam,env);
}
if(KeyDown(38)){
moveZ(env,-10);
render(cam,env);
}
if(KeyDown(40)){
moveZ(env);
render(cam,env);
}
if(KeyDown(69)){
moveX(env,-7)
render(cam,env);
}
if(KeyDown(81)){
moveX(env,7)
render(cam,env);
}
if(KeyDown(65)){
rotX(env,7)
render(cam,env);
}
if(KeyDown(68)){
rotX(env,-7)
render(cam,env);
}
if(KeyDown(83)){
moveZ(env,7)
render(cam,env);
}
}


X2=-70;
Y2=-100;

for(var g:int=1;g<1000;g++){
addMP(env,X2,Y2,g*20);
addP3d(env,X2+200,Y2,g*20);
addP3d(env,X2+200,Y2+200,g*20);
addP3d(env,X2,Y2+200,g*20);
addP3d(env,X2,Y2,g*20);
}
render(cam,env); 
   
     
   
   
   
    
drow3D_5.rar
[a fla of the example ]

+
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. Permissions beyond the scope of this license, pertaining to the examples of code included within this work are available at Adobe.

Report abuse

Related recipes