28
5. Так же используются следующие глобальные переменные:
var vertex3D, polygons:Array;
var rgb, alpha:Number;
var matrix:Object;
6. Методы setVertex() и setPolygon() предназначены соответственно для
заполнения массивов координат вершин и порядок построения полигонов по
этим вершинам (четыре вершины – a, b, c, d):
public function setVertex(x:Number, y:Number, z:Number) {
vertex3D.push({x:x, y:y, z:z});
}
public function setPolygon(a:Number, b:Number, c:Number,
Êd:Number, rgb, alpha) {
polygons.push({vertices:[a, b, c, d], rgb:rgb, alpha:alpha});
}
7. При рисовании граней трёхмерной модели на одном плоском
графическом уровне, необходимо определять, какая из граней будет ближе к
наблюдателю, чем все остальные так, чтобы не было перекрытия. Для этого
используется массив depths для хранения информации о порядке граней:
public function render(focalLength:Number) {
...
var vertex2D:Array = new Array();
var depths:Array = new Array();
for (var i = 0; i<polygons.length; i++) {
var zDepth:Number = 0;
for (var j = 0; j<polygons[i].vertices.length; j++) {
var zVertex:Array = polygons[i].vertices[j];
if (!vertex2D[zVertex]) {
vertex2D[zVertex] = new Object();
var scale:Number = focalLength/
Ê(focalLength-vertex3D[zVertex].z);
vertex2D[zVertex].x = vertex3D[zVertex].x*scale;
vertex2D[zVertex].y = vertex3D[zVertex].y*scale;
}
zDepth += vertex3D[zVertex].z;
}
depths.push([polygons[i], zDepth]);
}
depths.sort(function (a:Number, b:Number) {
return a[1]>b[1];
});
for (var i = 0; i<depths.length; i++) {
var zPolygon:Array = depths[i][0].vertices;
this.moveTo(vertex2D[zPolygon[0]].x, vertex2D[zPolygon[0]].y);
this.beginFill(depths[i][0].rgb, depths[i][0].alpha);
for (var j = 1; j<zPolygon.length; j++) {
this.lineTo(vertex2D[zPolygon[j]].x,
Êvertex2D[zPolygon[j]].y);
}
this.lineTo(vertex2D[zPolygon[0]].x, vertex2D[zPolygon[0]].y);
this.endFill();
}
}