| orangeline |
08.05.2006 02:53 |
Код:
function create3DObject(mc:MovieClip, points:Array, lineSt:Object, fillSt:Object, transformObject:Object):Void {
var kof:Number = 2*Math.SQRT2;
function Draw(clip:MovieClip, points:Array, lineSt:Object):Void {
clip.lineStyle(lineSt.thickness, lineSt.rgb, lineSt.alpha);
var points_length:Number = points.length;
var kof:Number = 2*Math.SQRT2;
for (var i = 0; i<points_length; i++) {
clip.beginFill(fillSt.rgb, fillSt.alpha);
clip.moveTo((points[i][0][0]+points[i][0][2]/kof), (points[i][0][1]-points[i][0][2]/kof));
var numb_points:Number = points[i].length;
for (var j = 1; j<numb_points; j++) {
clip.lineTo(points[i][j][0]+points[i][j][2]/kof, points[i][j][1]-points[i][j][2]/kof);
}
clip.lineTo(points[i][0][0]+points[i][0][2]/kof, points[i][0][1]-points[i][0][2]/kof);
clip.endFill();
}
}
function matrMult(a:Array, b:Array):Array {
var matrix:Array = [[], [], [], []];
for (var i = 0; i<4; i++) {
for (var j = 0; j<4; j++) {
matrix[i][j] = a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[i][2]*b[2][j]+a[i][3]*b[3][j];
}
}
return matrix;
}
function createTransform(points:Array, transformObject:Object):Array {
var tr:Object = transformObject;
if (tr.Shift == undefined && tr.scale == undefined && tr.rotation == undefined) {
return points;
}
var matrix:Array = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
if (tr.Shift[0]*tr.Shift[1]*tr.Shift[2]>0) {
var shiftMatrix:Array = [[1, 0, 0, tr.scale[0]], [0, 1, 0, tr.scale[1]], [0, 0, 1, tr.scale[2]], [0, 0, 0, 1]];
matrix = matrMult(matrix, shiftMatrix);
}
if (tr.scale[0]*tr.scale[1]*tr.scale[2]>0) {
var scaleMatrix:Array = [[tr.scale[0], 0, 0, 0], [0, tr.scale[1], 0, 0], [0, 0, tr.scale[2], 0], [0, 0, 0, 1]];
matrix = matrMult(matrix, scaleMatrix);
}
if (tr.rotation[0]*tr.rotation[0]>0) {
var phi:Number = tr.rotation[0]/180*Math.PI;
var rotationMatrixX:Array = [[1, 0, 0, 0], [0, Math.cos(phi), -Math.sin(phi), 0], [0, Math.sin(phi), Math.cos(phi), 0], [0, 0, 0, 1]];
matrix = matrMult(matrix, rotationMatrixX);
}
if (tr.rotation[1]*tr.rotation[1]>0) {
var psi:Number = tr.rotation[1]/180*Math.PI;
var rotationMatrixY:Array = [[Math.cos(psi), 0, Math.sin(psi), 0], [0, 1, 0, 0], [-Math.sin(psi), 0, Math.cos(psi), 0], [0, 0, 0, 1]];
matrix = matrMult(matrix, rotationMatrixY);
}
if (tr.rotation[2]*tr.rotation[2]>0) {
var thi:Number = tr.rotation[2]/180*Math.PI;
var rotationMatrixZ:Array = [[Math.cos(thi), -Math.sin(thi), 0, 0], [Math.sin(thi), Math.cos(thi), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
matrix = matrMult(matrix, rotationMatrixZ);
}
var new_points:Array = [];
var points_length = points.length;
for (var i = 0; i<points_length; i++) {
new_points[i] = [];
var points_i_length:Number = points[i].length;
for (var j = 0; j<points_i_length; j++) {
var np:Array = new_points[i][j]=[];
var op:Array = points[i][j];
np[0] = matrix[0][0]*op[0]+matrix[0][1]*op[1]+matrix[0][2]*op[2]+matrix[0][3];
np[1] = matrix[1][0]*op[0]+matrix[1][1]*op[1]+matrix[1][2]*op[2]+matrix[1][3];
np[2] = matrix[2][0]*op[0]+matrix[2][1]*op[1]+matrix[2][2]*op[2]+matrix[2][3];
}
}
return new_points;
}
var trans_points:Array = createTransform(points, transformObject);
Draw(mc, trans_points, lineSt);
}
сиди изучай :bye:
|