这应该让你开始。
(对应的jsBin在这里:http: //jsbin.com/olegoj/1/edit )
// 3D points array.
var points=[];
var Vector=function(x,y,z) {
this.x=x;
this.y=y;
this.z=z;
};
Vector.prototype.toString= function() {
return (' x: ' + this.x + ' y: ' + this.y + ' z : ' + this.z);
};
// returns a new vector translatedfrom ampVec * random
Vector.prototype.createRandomShift= function(ampVec) {
var thisRandom = Math.random()*0.9+0.1;
return new Vector(
thisRandom*ampVec.x+this.x,
thisRandom*ampVec.y+this.y,
thisRandom*ampVec.z+this.z );
};
var pointCount=20;
var pt = new Vector(Math.random()*100|0, Math.random()*100|0, Math.random()*100|0 );
var ampVec = new Vector(Math.random()*4-2, Math.random()*4-2, Math.random()*4 - 2);
var ampVecAmp = new Vector(Math.random()*2-1, Math.random()*2-1, Math.random()*2-1) ;
// fill the point array.
// based on the current point shifted randomly by ampVec
// ampVec itself is shifted randomly by ampVecAmp
for(var i=0; i<pointCount; i++) {
points.push(pt );
pt=pt.createRandomShift(ampVec);
ampVec=ampVec.createRandomShift(ampVecAmp);
}
// array of face. a face is an array of 3 point indexes.
var facelist=[];
var faceCount=10, i=faceCount;
// fill the face array
while(i--) {
var thisFacePoints=[];
var ip1 = 0;
// 3 point indexes
thisFacePoints.push(ip1=Math.random()*pointCount|0);
thisFacePoints.push(Math.random()*pointCount|0);
thisFacePoints.push(Math.random()*pointCount|0);
facelist.push(thisFacePoints);
}
// returns the min z for a face
var minZ=function(f) {
return Math.min(f[0].z, Math.min(f[1].z, f[2].z));
};
// returns the max z for a face
var maxZ=function(f) {
return Math.max(f[0].z, Math.max(f[1].z, f[2].z));
};
// !!! sort the faces on Z !!!
facelist.sort(function(a,b) {
if (maxZ(a) < minZ (b)) return 1; // a fully below b
if (minZ(b) < minZ(a) ) return -1; // b fully below a
// !!!!!!!!!!!!!!!!!!!!!!!!
// in fact here is the tricky part :
// here a and b overlap in Z.
return trickyFaceZSort(a,b);
});
// !!!!!! returns wether face a is < to face b when looking at Z (0,0,1).
//Required : a and b overlaps by Z.
var trickyFaceZSort= function(a,b) {
// do some checks on projected(xi), projected(yi) -> return 0 if no overlap
// then you have the hardest part ahead : x,y and z overlap.
return 0;
};
// Print sorted faces
for(var i=0; i<facelist.length; i++) {
var fp=facelist[i];
console.log(' *** face ' + i + ' *** ');
console.log(' ** point 0 ' + points[fp[0]] + ' *** ');
console.log(' ** point 1 ' + points[fp[1]] + ' *** ');
console.log(' ** point 2 ' + points[fp[2]] + ' *** ');
}