【发布时间】:2012-11-25 21:20:33
【问题描述】:
我有一个管几何的 3D 模型。生产端有18000个坐标。我每 9 个坐标取一次,以便实际绘制 9000 个坐标来构建管几何图形。我只能使用CanvasRenderer。
现在当我在WebGLRenderer 中使用vertexColors: THREE.VertexColors 时,模型在每个面上显示不同的颜色。当我将其更改为CanvasRenderer 时,模型仅变为白色。即使我更改vertexColors: THREE.FaceColors,结果也是一样的。
请在下面找到 jsfiddle 的链接和我以前的链接,其中 mrdoob 向 CanvasRenderer 添加了对 material.vertexColors = THREE.FaceColors 的支持。
support for vertex color in canvas rendering
请在图片下方找到根据值应用颜色。
如图所示,每个坐标有 12 个不同角度的 12 个值。所以我创建了一个半径段为 12 的管。然后我将这些值存储到 JSON 文件中,但由于有 18000 个点,文件变得很重。即使我正在绘制 2000 个点,也需要花费太多时间。对于 2000 个段,每个段有 12 个面,管上有 24000 个面。
请在下面找到根据参数值应用颜色的编程逻辑。
// 获取 res 值并应用颜色 变量 lblSeg=0;变量 pntId;变量 d=0; var faceLength=tube.faces.length; var degree = ['30', '60', '90', '120', '150', '180', '210', '240', '270', '300', '330' ]; var faces = tube.faces;变量度Cntr = 0; var degreeProp; //console.log(faces); 变量 res30=0,res60=0,res90=0,res120=0,res150=0,res180=0,res210=0,res240=0,res270=0,res300=0,res330=0; 变量资源;变量 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 上顺利加载。
【问题讨论】:
-
小提琴正在运行 r.50。变化是 r.52。此外,如果您一次提出一个问题,您将获得更多帮助,并保持您的示例简单。这个问题只会让读者目瞪口呆。
-
好的,我将其更改为 r.52。我的问题是关于画布地图的,所以我解释了整个场景,因为最终我只能在画布上渲染模型。
-
如何从github下载旧版three.js?因为最新版本是 r53。我可以从标签中选择它,但它没有显示下载 r52 包的选项。 - @WestLangley
-
设置“无库”并自己包含。 jsfiddle.net/RnFqz/21.
-
这里是一张带有面部颜色和画布的:jsfiddle.net/RnFqz/22
标签: javascript json ipad html5-canvas three.js