Javascript 顶点的错误空间排列
我一直在寻找解决我的问题的办法,但我找不到任何办法。所以我决定在这里问我的问题 我想做什么 我目前正试图用以下数学方程来表示一个“非球面”: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需要遵循圆形轮廓 我的问题 我面临的问题是,当我试图用与数学方程匹配的坐标推动顶点时,这些顶点的空间排列是错误的,并且曲面上有非常大的孔 我的代码 这是我编码的结果: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需要遵循圆形轮廓 我的问题 我面临的问题是,当我试图用与数学方程匹配的坐标推动顶点时,这些顶点的空间
/* 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如果我已经设法解决了我的问题。 我为每条线设置了固定数量的顶点(每个y值)。然后,我在曲面的两条连续线之间绘制面。这样做更容易表示曲面