チューブ形状の 3D モデルがあります。生産側の座標は 18000 あります。実際に 9000 座標をプロットしてチューブ ジオメトリを構築するように、9 番目ごとの座標を取得しています。使うCanvasRenderer
しかない。
で使用vertexColors: THREE.VertexColors
するWebGLRenderer
と、モデルは面ごとに異なる色を表示します。に変更するとCanvasRenderer
、モデルは白色のみになります。変えvertexColors: THREE.FaceColors
ても結果は同じです。
以下の jsfiddle のリンクと、mrdoob が CanvasRenderer のサポートを追加した以前のリンクを見つけてくださいmaterial.vertexColors = THREE.FaceColors
。
値に基づいて色を適用するには、画像の下を参照してください。
画像に示すように、座標ごとに 12 の異なる角度で 12 の値があります。そこで、半径セグメントが 12 のチューブを作成しました。次に、これらの値を JSON ファイルに保存しましたが、18000 ポイントあるため、ファイルが重くなります。2000 ポイントをプロットしていますが、時間がかかりすぎます。2000 セグメントで各セグメントに 12 の面がある場合、チューブには 24000 の面があります。
パラメータの値に基づいて色を適用するプログラミング ロジックを以下に示します。
// res 値を取得して色を適用 var lblSeg=0; var pntId; 変数 d=0; var faceLength=tube.faces.length; var 度 = [ '30', '60', '90', '120', '150', '180', '210', '240', '270', '300', '330' ]; var 面 = tube.faces; var degreeCntr=0; var degreeProp; //console.log(顔); var res30=0,res60=0,res90=0,res120=0,res150=0,res180=0,res210=0,res240=0,res270=0,res300=0,res330=0; var res; var resDegree; var pnt=0;
// fetching json data of resistivity values at different degree as //shown in the image
var result = getResValue();
for(var k=0; k<faceLength; k++){
resDegree = degrees[degreeCntr];
degreeProp = "r"+resDegree;
res = result.resistivity[pnt][degreeProp];
objects.push(result.resistivity[pnt]);
f = faces[k];
color = new THREE.Color( 0xffffff );
if(res<5){
color.setRGB( 197/255, 217/255, 241/255);
}
else if(res>=5 && res<50){
color.setRGB( 141/255, 180/255, 226/255);
}
else if(res>=50 && res<100){
color.setRGB( 83/255, 141/255, 213/255);
}
else if(res>=100 && res<200){
color.setRGB( 22, 54, 92);
}
else if(res>=200 && res<300){
color.setRGB( 15/255,36/255,62/255);
}
else if(res>=300 && res<400){
color.setRGB( 220/255, 230/255, 241/255);
}
else if(res>=400 && res<700){
color.setRGB( 184/255, 204/255, 228/255);
}
else if(res>=700 && res<1200){
color.setRGB( 149/255, 179/255, 215/255);
}
else if(res>=1200 && res<1500){
color.setRGB( 54/255, 96/255, 146/255);
}
else if(res>=1700 && res<1800){
color.setRGB( 36/255, 84/255, 98/255);
}
else if(res>1900){
color.setRGB( 128/255, 128/255, 128/255);
}
for(var j=0;j<4;j++)
{
tube.vertices.push(f.centroid);
vertexIndex = f[ faceIndices[ j ] ];
p = tube.vertices[ vertexIndex ];
f.vertexColors[ j ] = color;
}
degreeCntr++;
if(degreeCntr==10){
degreeCntr=0;
}
if(k%12==0 && k!=0){
pnt++;
}
}
このロジックでは、モデルのレンダリングに時間がかかりすぎて、モデルが重くなりすぎて、他の操作を実行できなくなります。Android の FPS は 2 ~ 3 FPS に低下します。実際には、このモデルを iPad でレンダリングする必要があるため、キャンバス レンダラーのみを使用する必要があります。
では、このモデルの負荷を軽くし、iPad でスムーズに動作させるにはどうすればよいでしょうか? すべての面に色を適用する他の方法はありますか? キャンバス マップをテクスチャとして適用してモデルを軽量化できる場合、値に基づいてすべての色を使用してそのマップを作成するにはどうすればよいですか?
更新:
ライブラリのバージョンを r53 に変更した後vertexColors: THREE.FaceColors
、face.color.setRGB( Math.random(), Math.random(), Math.random())
モデルはキャンバス レンダリングで面ごとにランダムな色を表示します。
そのため、問題は要件に従って (キャンバス マップまたは実行可能なソリューションのいずれかによって) 色を適用し、モデルを軽量にして iPad にスムーズにロードすることです。