
看pan大神的博客,研究源码。
package
{
import flash.display.Bitmap;
import flash.display.GraphicsTrianglePath;
import flash.display.Sprite;
/**
* @author:Gaara
* 2012-3-13
*
**/
[SWF(width="800", height="600" ,frameRate="30", backgroundColor="#000000")]
public class TestDrawTriang1 extends Sprite
{
//定义路径类
private var triangPath:GraphicsTrianglePath;
public function TestDrawTriang1()
{
super();
var sprite:Sprite = new Sprite;
sprite.x = this.stage.stageWidth / 2;
sprite.y = this.stage.stageHeight /2;
addChild(sprite);
var vertices:Vector.<Number> = new Vector.<Number>();
vertices.push(0,0);
vertices.push(0,200);
vertices.push(200,200);
vertices.push(200,0);
var indices:Vector.<int> = new Vector.<int>();
indices.push(1,2,3,1,3,0);
var uvtData:Vector.<Number> = new Vector.<Number>();
uvtData.push(0,0);
uvtData.push(0,1);
uvtData.push(1,1);
uvtData.push(1,0);
sprite.graphics.beginBitmapFill(ResConfig.myLpBmp.bitmapData);
sprite.graphics.drawTriangles (vertices,indices,uvtData);
sprite.graphics.endFill();
}
}
}
对应stage中的内容,顶点,索引和贴图坐标。

3d坐标映射到2d坐标
var indices:Vector.<int> = new Vector.<int>();
indices.push(0,1,2,0,2,3);
var uvtData:Vector.<Number> = new Vector.<Number>();
uvtData.push(0,0);
uvtData.push(1,0);
uvtData.push(1,1);
uvtData.push(0,1);
var vertices:Vector.<Vector3D> = new Vector.<Vector3D>();
vertices.push(new Vector3D(0,0,0));
vertices.push(new Vector3D(100,0,50));
vertices.push(new Vector3D(100,100,50));
vertices.push(new Vector3D(0,100,0));
var newVertices:Vector.<Number> = new Vector.<Number>;
for each (var vec3d:Vector3D in vertices)
{
var scale:Number = D/(D+vec3d.z);
newVertices.push(scale * vec3d.x);
newVertices.push(scale * vec3d.y);
}
sprite.graphics.beginBitmapFill(ResConfig.myLpBmp.bitmapData);
sprite.graphics.drawTriangles(newVertices,indices,uvtData);
sprite.graphics.endFill();
y轴旋转
package
{
import flash.display.Bitmap;
import flash.display.GraphicsTrianglePath;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Vector3D;
/**
* @author:Gaara
* 2012-3-13
*
**/
[SWF(width="800", height="600" ,frameRate="30", backgroundColor="#000000")]
public class TestDrawTriang1 extends Sprite
{
private const D:int = 300;
//定义路径类
private var triangPath:GraphicsTrianglePath;
private var sprite:Sprite = new Sprite;
private var indices:Vector.<int>;
private var uvtData:Vector.<Number>;
private var vertices:Vector.<Vector3D>;
private var angel:int = 0;
public function TestDrawTriang1()
{
super();
sprite.x = this.stage.stageWidth / 2;
sprite.y = this.stage.stageHeight /2;
addChild(sprite);
indices = new Vector.<int>();
indices.push(0,1,2,0,2,3);
uvtData = new Vector.<Number>();
uvtData.push(0,0);
uvtData.push(1,0);
uvtData.push(1,1);
uvtData.push(0,1);
vertices = new Vector.<Vector3D>();
vertices.push(new Vector3D(0,0,0));
vertices.push(new Vector3D(100,0,50));
vertices.push(new Vector3D(100,100,50));
vertices.push(new Vector3D(0,100,0));
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
protected function onEnterFrame(event:Event):void
{
angel++;
var radian:Number = angel/180*Math.PI;
var newVertices:Vector.<Number> = new Vector.<Number>;
for each (var vec3d:Vector3D in vertices)
{
var newX:Number = Math.cos(radian) * vec3d.x - Math.sin(radian) * vec3d.z;
var newZ:Number = Math.cos(radian) * vec3d.z + Math.sin(radian) * vec3d.x;
var scale:Number = D/(D+newZ);
newVertices.push(scale * newX);
newVertices.push(scale * vec3d.y);
}
sprite.graphics.clear();
sprite.graphics.beginBitmapFill(ResConfig.myLpBmp.bitmapData);
sprite.graphics.drawTriangles(newVertices,indices,uvtData);
sprite.graphics.endFill();
}
}
}

正方体
package
{
import flash.display.GraphicsTrianglePath;
import flash.display.Sprite;
import flash.display.TriangleCulling;
import flash.events.Event;
import flash.geom.Vector3D;
/**
* @author:Gaara
* 2012-3-14
*
**/
[SWF(width="800", height="600" ,frameRate="30", backgroundColor="#FFFFFF")]
public class Test3d extends Sprite
{
private const D:int = 300;
//定义路径类
private var triangPath:GraphicsTrianglePath;
private var sprite:Sprite = new Sprite;
private var indices:Vector.<int>;
private var uvtData:Vector.<Number>;
private var vertices:Vector.<Vector3D>;
private var angel:int = 0;
public function Test3d()
{
super();
sprite.x = this.stage.stageWidth / 2;
sprite.y = this.stage.stageHeight /2;
addChild(sprite);
indices = new Vector.<int>();
indices.push(0,1,2);
indices.push(0,2,3);
indices.push(4,5,6);
indices.push(4,6,7);
indices.push(8,9,10);
indices.push(8,10,11);
indices.push(12,13,14);
indices.push(12,14,15);
uvtData = new Vector.<Number>();
uvtData.push(0,0,1);
uvtData.push(1,0,1);
uvtData.push(1,1,1);
uvtData.push(0,1,1);
uvtData.push(0,0,1);
uvtData.push(1,0,1);
uvtData.push(1,1,1);
uvtData.push(0,1,1);
uvtData.push(0,0,1);
uvtData.push(1,0,1);
uvtData.push(1,1,1);
uvtData.push(0,1,1);
uvtData.push(0,0,1);
uvtData.push(1,0,1);
uvtData.push(1,1,1);
uvtData.push(0,1,1);
vertices = new Vector.<Vector3D>();
vertices.push(new Vector3D(0,0,0));
vertices.push(new Vector3D(100,0,0));
vertices.push(new Vector3D(100,100,0));
vertices.push(new Vector3D(0,100,0));
vertices.push(new Vector3D(100,0,0));
vertices.push(new Vector3D(100,0,100));
vertices.push(new Vector3D(100,100,100));
vertices.push(new Vector3D(100,100,0));
vertices.push(new Vector3D(100,0,100));
vertices.push(new Vector3D(0,0,100));
vertices.push(new Vector3D(0,100,100));
vertices.push(new Vector3D(100,100,100));
vertices.push(new Vector3D(0,0,100));
vertices.push(new Vector3D(0,0,0));
vertices.push(new Vector3D(0,100,0));
vertices.push(new Vector3D(0,100,100));
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
protected function onEnterFrame(event:Event):void
{
angel++;
var radian:Number = angel/180*Math.PI;
var newVertices:Vector.<Number> = new Vector.<Number>;
for (var i:int = 0; i < vertices.length; i++)
{
var vec3d:Vector3D = vertices[i]
var newX:Number = Math.cos(radian) * vec3d.x - Math.sin(radian) * vec3d.z;
var newZ:Number = Math.cos(radian) * vec3d.z + Math.sin(radian) * vec3d.x;
var scale:Number = D/(D+newZ);
uvtData[i*3+2] = scale;
newVertices.push(scale * newX);
newVertices.push(scale * vec3d.y);
}
sprite.graphics.clear();
sprite.graphics.beginBitmapFill(ResConfig.myLpBmp.bitmapData);
sprite.graphics.drawTriangles(newVertices,indices,uvtData,TriangleCulling.NEGATIVE);
sprite.graphics.endFill();
}
}
}
三角形增加深度z。等于绽放比例。GraphicsTrianglePath的最后一个参数,表示剔除算法,顶点顺时针时,法线指向z坐标正方向,TriangleCulling.POSITIVE剔除指向正的三角形,TriangleCulling.NEGATIVE剔除负的三角形。逆时针反之。

var newX2:Number = Math.cos(radiany) * newX - Math.sin(radiany) * vec3d.y; var newY:Number = Math.cos(radiany) * vec3d.y + Math.sin(radiany) * newX;
同时旋转几个坐标系。以及使用鼠标控制旋转方向。
var radianx:Number = mouseX /180*Math.PI; var radiany:Number = mouseY /180*Math.PI;