背景:我是一个懂 JS 的开发者,但是对 Three JS 比较陌生。我做过一些涉及带有基本重复动画的静态场景的小项目。
我目前正在研究 Google Globe 项目http://workshop.chromeexperiments.com/globe/的修改版本。回想起来,我可能应该从头开始,但这是一个很好的工具,可以看到他们的开发人员采取的方法。我只是希望我现在可以更新 ThreeJS 而不让整个事情崩溃(有太多不受支持的方法和一些我永远无法修复的错误,至少在我尝试它的那个小时内没有)。
在最初,他们将所有几何点合并到一个对象中以加快 FPS。出于我的目的,我正在使用 JSON 更新地球上的点,并且永远不会超过 100 个(实际上可能不超过 60 个),因此它们需要保持独立。我已经删除了“组合”阶段,因此我现在可以单独将数据分配给点,然后调整高度变化动画。
我的问题是,如何手动选择一个点(这是一个立方体几何),以便我可以修改高度值?我在 GitHub 上浏览了 Stack Overflow 和 Three JS,但我不确定我是否理解这个过程。我正在分配一个 ID 以使其与传递给它的数据直接相关(我知道 WebGL 为粒子添加了一个单独的名称/ID,但我需要一些与我正在做的事情更直接相关的东西为简单起见)。这似乎工作正常。但同样,作为一名 JS 开发人员,我在 jQuery 中尝试过 .getElementById(id) 和 $('#'+id) ,但都不起作用。我意识到 Geometry 对象的行为方式与 HTML DOM 对象不同,所以我想这就是我遇到困难的地方。
将数据点添加到地球的代码:
function addPoint(lat, lng, size, color, server) {
geometry = new THREE.Cube(0.75, 0.75, 1, 1, 1, 1, null, false, { px: true,
nx: true, py: true, ny: true, pz: false, nz: true});
for (var i = 0; i < geometry.vertices.length; i++) {
var vertex = geometry.vertices[i];
vertex.position.z += 0.5;
}
var point = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial ({
vertexColors: THREE.FaceColors
}));
var phi = (90 - lat) * Math.PI / 180;
var theta = (180 - lng) * Math.PI / 180;
point.position.x = 200 * Math.sin(phi) * Math.cos(theta);
point.position.y = 200 * Math.cos(phi);
point.position.z = 200 * Math.sin(phi) * Math.sin(theta);
if($('#'+server).length > 0) {
server = server+'b';
}
point.id = server;
point.lookAt(mesh.position);
point.scale.z = -size;
point.updateMatrix();
for (var i = 0; i < point.geometry.faces.length; i++) {
point.geometry.faces[i].color = color;
}
console.log(point.id);
scene.addObject(point);
}
所以现在回去,我知道我不能使用 point.id 因为显然那只会在函数内部引用。但我尝试了“Globe.id”、“Globe.object.id”、“object.id”,但似乎没有任何效果。我知道这是可能的,但我似乎找不到有效的方法。