Javascript 顶点的错误空间排列

Javascript 顶点的错误空间排列,javascript,three.js,vertices,Javascript,Three.js,Vertices,我一直在寻找解决我的问题的办法,但我找不到任何办法。所以我决定在这里问我的问题 我想做什么 我目前正试图用以下数学方程来表示一个“非球面”:z(x,y)=s/R/(1+sqrt(1-(1+k)*s/R))+p(s),其中s=x²+y²。给出了k和R,P是多项式。为了做到这一点,我决定使用一个空的几何体,并推动坐标x,y和z与前面的方程匹配的顶点。我不使用ThreeJS提供的参数化几何体,因为x和y需要遵循圆形轮廓 我的问题 我面临的问题是,当我试图用与数学方程匹配的坐标推动顶点时,这些顶点的空间

我一直在寻找解决我的问题的办法,但我找不到任何办法。所以我决定在这里问我的问题

我想做什么 我目前正试图用以下数学方程来表示一个“非球面”:z(x,y)=s/R/(1+sqrt(1-(1+k)*s/R))+p(s),其中s=x²+y²。给出了k和R,P是多项式。为了做到这一点,我决定使用一个空的几何体,并推动坐标x,y和z与前面的方程匹配的顶点。我不使用ThreeJS提供的参数化几何体,因为x和y需要遵循圆形轮廓

我的问题 我面临的问题是,当我试图用与数学方程匹配的坐标推动顶点时,这些顶点的空间排列是错误的,并且曲面上有非常大的孔

我的代码 这是我编码的结果:

/* Function creating the geometry */
/* model */
function asphericPersoCircu(R, k, coefficients, diametre){
var zFuncText = "s/R/(1+sqrt(1-(1+k)*s/(R*R)))";
var zFunc = Parser.parse(zFuncText).toJSFunction(['k', 'R', 's']);
var yFuncText = "y";
var yFunc = Parser.parse(yFuncText).toJSFunction(['y']);
var xFuncText = "x";
var xFunc = Parser.parse(xFuncText).toJSFunction(['x']);
var sFuncText = "x*x+y*y";
var s_sFunc = Parser.parse(sFuncText).toJSFunction(['x', 'y']);
var polyFuncText = "m*s + n*s*s + p*s*s*s + q*s*s*s*s";
var polyFunc = Parser.parse(polyFuncText).toJSFunction(['s', 'm', 'n', 'p', 'q']);

/* values */
var a2 = coefficients[0];
var a4 = coefficients[1];
var a6 = coefficients[2];
var a8 = coefficients[3];

var y = -Math.sqrt(Math.abs(diametre));


/* for the geometry, vertices and faces */
var three_pushed_ver = 0;
var geo = new THREE.Geometry();
var indice_x = 0,
  indice_y = 1,
  indice_z = 2;
/* main loop to calculate the coordinates of each vertex */
while (y < Math.sqrt(Math.abs(diametre))) {
  var max = Math.sqrt(diametre - y * y);
  var x = max;
  while (x > -max) {
    var s_s = s_sFunc(x, y);
    var pol = polyFunc(s_s, a2, a4, a6, a8);
    var z = zFunc(k, R, s_s) + pol;
    if (s_s <= R * R) {
      geo.vertices.push(new THREE.Vector3(x, y, z));
      three_pushed_ver++;
      if (three_pushed_ver === 3) {
        three_pushed_ver = 0;
        geo.faces.push(new THREE.Face3(indice_x, indice_y, indice_z));
        indice_x += 3;
        indice_y += 3;
        indice_z += 3;
      }
    }
    x -= 0.1;
  }
  y += 0.1;
}
return geo;
};
/* End of the function*/

/* In the HTML page */
var coefficients = [0.00521,-0.001981,0.0004783, -0.0007328];
var rayon  = 3.201;
var k = -4.1;

var geo = asphericPersoCircu(rayon, k, coefficients, 2.23);
for(var i = 0; i < geo.faces.length; i++)
{
  var face = geo.faces[i];
  face.color.setHex(0x000ff0);
}

var mesh = new THREE.Mesh(geo, new THREE.MeshBasicMaterial({vertexColors : THREE.FaceColors, side : THREE.DoubleSide}))
mesh.position.z = 2;
scene.add(mesh);
创建几何图形的函数*/ /*模型*/ 函数非球面(R,k,系数,直径){ var zFuncText=“s/R/(1+sqrt(1-(1+k)*s/(R*R))”; var zFunc=Parser.parse(zFuncText.toJSFunction(['k','R','s']); var yFuncText=“y”; var yFunc=Parser.parse(yFuncText.toJSFunction(['y']); var xFuncText=“x”; var xFunc=Parser.parse(xFuncText.toJSFunction(['x']); var sFuncText=“x*x+y*y”; var s_sFunc=Parser.parse(sFuncText).toJSFunction(['x','y']); var polyFuncText=“m*s+n*s*s+p*s*s*s+q*s*s*s*s*s”; var polyFunc=Parser.parse(polyFuncText).toJSFunction(['s',m',n',p',q']); /*价值观*/ var a2=系数[0]; var a4=系数[1]; var a6=系数[2]; var a8=系数[3]; 变量y=-Math.sqrt(Math.abs(直径)); /*对于几何体、顶点和面*/ var three\u Push\u ver=0; var geo=new THREE.Geometry(); 变量指数x=0, 指标y=1, 指数z=2; /*主循环用于计算每个顶点的坐标*/ 而(y-max){ var s_s=s_sFunc(x,y); var pol=多功能(s_s,a2,a4,a6,a8); var z=zFunc(k,R,s_s)+pol;
如果我已经设法解决了我的问题。 我为每条线设置了固定数量的顶点(每个y值)。然后,我在曲面的两条连续线之间绘制面。这样做更容易表示曲面