function torus(row, column, irad, orad){
var pos = new Array(), col = new Array(), idx = new Array();
for(var i = 0; i <= row; i++){
var r = Math.PI * 2 / row * i;
var rr = Math.cos(r);
var ry = Math.sin(r);
for(var ii = 0; ii <= column; ii++){
var tr = Math.PI * 2 / column * ii;
var tx = (rr * irad + orad) * Math.cos(tr);
var ty = ry * irad;
var tz = (rr * irad + orad) * Math.sin(tr);
pos.push(tx, ty, tz);
var tc = hsva(360 / column * ii, 1, 1, 1);
col.push(tc[0], tc[1], tc[2], tc[3]);
}
}
for(i = 0; i < row; i++){
for(ii = 0; ii < column; ii++){
r = (column + 1) * i + ii;
idx.push(r, r + column + 1, r + 1);
idx.push(r + column + 1, r + column + 2, r + 1);
}
}
第一个参数,是将管子分割成多少份,这个数值越大,生成的圆环体就越圆滑,数值太小的话,就会出现棱角。
第二个参数,是构成这个管子的圆是多少个顶点,数值越大,管子就越接近一个圆的形状,太小的话,这个圆就有棱角了。
第三个参数,是生成这个管子的半径。
第四个参数,是原点到管子中心的距离。
公式摆在这里,毕竟我不懂就是idx意义,这里解释下,col是颜色数组,pos记录甜甜圈所有的点,具体运算就是三角函数了,大家可以自己看代码,但idx我不懂,但图形都是以三角面进行画图,idx实际上是三角面的数组,编了一串代码看了下
0,7,1..7,8,1
1,8,2..8,9,2
2,9,3..9,10,3
3,10,4..10,11,4
4,11,5..11,12,5
5,12,6..12,13,6
7,14,8..14,15,8
8,15,9..15,16,9
9,16,10..16,17,10
10,17,11..17,18,11
11,18,12..18,19,12
12,19,13..19,20,13
14,21,15..21,22,15
15,22,16..22,23,16
16,23,17..23,24,17
17,24,18..24,25,18
18,25,19..25,26,19
19,26,20..26,27,20.也就是第一层往上第一个面,低二层往第一层第二个面,依次叠罗汉,比较抽象,但算出来结果第二层开始点是7,第一层二个,带第二层一个,第二个就是第二层二个带第一层一个,之后又是第一层二个带第二层一个,直到所有层弄完
最后效果: