我已经搜索过,发现了几个在stackoverflow上的例子,但是这些答案都没有解决我的问题。
以下是我尝试过的方法:
首先,我创建了一个几何桶用于分组,并且创建了一个数组来存储我的材质。
addMapMarker3d函数定义如下:
在for循环运行并且所有的立方体被创建之后:
我收到了"Uncaught TypeError: Cannot read property 'transparent' of undefined"的错误提示,但是没有渲染出任何东西。我不太理解这个问题,因为根据示例,每个几何体都应该与材质数组中的一个材质相对应。
three.js版本为r.70
以下是我尝试过的方法:
首先,我创建了一个几何桶用于分组,并且创建了一个数组来存储我的材质。
var totalGeom = new THREE.Geometry();
var materials = [];
然后我使用for循环遍历我的数据(strData)并调用addMapMarker3d函数。
for(var i=0; i<strData.length;i++){
addMapMarker3d([strData[i].lat,strData[i].lon], strData[i].time, measureColors[i]);
}
addMapMarker3d函数定义如下:
addMapMarker3d = function(latLng, height, color){
var max = 600;
var dist = 25;
var opacity = (height/max);
var geometry = new THREE.BoxGeometry( Math.floor(dist), height, Math.floor(dist));
//create the material and add it to the materials array
var material = new THREE.MeshBasicMaterial({ transparent:true, color: Number(color), opacity:opacity});
this.materials.push(material);
//create a mesh from the geometry and material.
var cube = new THREE.Mesh( geometry, material);
//leaf is a simple lat/lng to pixel position converter
var actualMarkerPos = leaf.getPoint(latLng);
//apply the position on a 5000x5000 cartesian plane
var extent = 5000;
cube.position.setZ((actualMarkerPos[1] * extent) - extent/2);
cube.position.setX(-((actualMarkerPos[0] * extent) - extent/2));
cube.position.setY(height/2);
//update the matrix and add the cube to the totalGeom bucket
cube.updateMatrix();
totalGeom.merge( cube.geometry, cube.matrix);
}
在for循环运行并且所有的立方体被创建之后:
var mats = new THREE.MeshFaceMaterial(materials)
var total = new THREE.Mesh(totalGeom, mats);
world.scene.add(total);
问题
当使用几何合并函数时,我的视口运行速度大大提高,但所有的立方体都具有完全相同的颜色和不透明度。似乎合并正在使用我提供的10k个材质中的单个材质。 有没有办法确保几何体使用数组中提供的材质?我做错了什么吗?
如果我在addMapMarker3d中尝试这样做:
totalGeom.merge( cube.geometry, cube.matrix, materials.length-1);
我收到了"Uncaught TypeError: Cannot read property 'transparent' of undefined"的错误提示,但是没有渲染出任何东西。我不太理解这个问题,因为根据示例,每个几何体都应该与材质数组中的一个材质相对应。
three.js版本为r.70