2016-03-24 16 views
0

私は問題を解決するための解決策を探しましたが、何も見つかりませんでした。だからここで私の質問をすることにしました。 Z(X、Y)= S/R /(1 + SQRTは(1:私は現在、以下の数式によって記載された "非球面" を表現しようとしている私は ThreeJS間違った頂点の空間配置

を実行しようとしてい

(1 + k)* s/R))+ P(s)s = x2 + y2である。 kとRは与えられ、Pは多項式です。これを行うには、空のジオメトリを使用し、前の方程式に一致する座標x、y、zで頂点を押し込むことにしました。 xとyは円形の輪郭に従う必要があるため、ThreeJSが提供するパラメトリックジオメトリは使用しません。

私の問題

は、私が直面しています問題は、私は論文の頂点の空間的配置が間違っていると表面が非常に大きな穴がある数式に一致する座標と頂点をプッシュしようとするということです。 Here you can see the result.

私のコード

これは、私はこの結果を得るためにコード化されたものです:

/* 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); 

私のコードで間違っていますか?私は何が欠けていますか?私は私の問題を解決するために管理している

おかげ

答えて

0

。 各行に(yの各値に対して)一定数の頂点を設定します。それから、私の表面の2つの連続した線の間に面を描きました。そうすることで、表面を表現するのがずっと簡単になりました。

関連する問題