在单个几何体中调整单个模型的大小

时间:2016-02-11 15:50:51

标签: javascript three.js

我有我家乡的3D模型。我想用实时数据来改变建筑物的高度。在我的第一次尝试中,我将建筑物作为单独的网格物体加载,并在设置过程中调用了scene.add(buildingMesh)。

var threeObjects = []
var buildingMesh = new THREE.Mesh(geometry, material)       
threeObjects.push(buildingMesh);
$.each(threeObjects,function(i, buildingMesh)
{
    buildingMesh.rotation.x += -3.1415*0.5;
    buildingMesh.castShadow = true;
    buildingMesh.receiveShadow = true;
    scene.add(buildingMesh);
});

这太慢了,因为我的数据集包含大约10,000个建筑物。 所以我采用这种方法将网格的所有(几何)添加到一个几何体中并将其包裹在一个网格中以添加到场景中

singleGeometry.merge(buildingMesh.geometry, buildingMesh.matrix); //in a loop


var faceColorMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, vertexColors: THREE.VertexColors } );
combinedMesh = new THREE.Mesh(singleGeometry, faceColorMaterial);

scene.add(combinedMesh);

只是为了做出概念验证,我试图在点击它时改变建筑物的高度。唉,这不行。 通过添加一个新的id字段,我可以获得对面和顶点的引用并改变建筑物的颜色,但我不能为我的生活,让他们改变高度。

在我的第一个版本中,我会使用类似的东西:

buildingMesh.scale.z=2;

但是因为我没有网格了,我有点失落。

有人可以帮忙吗?

免责声明:我是Three.js的新手,所以我的问题可能是愚蠢的...希望不是:)

2 个答案:

答案 0 :(得分:0)

如果将所有建筑物组合成一个几何体,就会消除使建筑物彼此不同的所有物体。现在你不能告诉建筑物A建筑物B,因为它是一个大的几何体,而基本层面的几何体实际上只是点和多边形的数组,无法区分它们。所以我认为将它们合并在一起是错误的方法。

相反,您应该利用three.js的高效场景图架构。您最初有正确的想法,只需将所有建筑物添加到单个根Object3D("场景")。通过这种方式,您可以获得场景图的所有效率,但仍然可以单独对建筑物进行寻址。

为了使其更有效地加载,而不是每次加载应用程序时都在three.js中创建场景图,您应该在3D建模程序中提前完成。在那里建立父/子关系,并将其导出为包含所有建筑物作为子节点的单个模型。当你将它导入three.js时,它应该保留其结构。

答案 1 :(得分:0)

JCD:那不是我问的问题。 但无论如何,我找到了解决问题的方法。

我所做的是合并所有几何,但是我使用了一个浅层引用,而不是在geometry.merge()中使用标准克隆函数,这使得我可以在threeObjects中使用引用来找到正确的使用Mesh.scale构建和调整几何体的大小,然后使用geometry.verticesNeedUpdate = true; 为了进一步优化,我将模型拆分为5个不同的几何图形,并仅更新包含建筑物的几何图形