我使用Google WebGL Globe作为参考并添加了交点,此外,我想通过SHIFT + DRAG
执行多个对象选择为此,我使用了一个视锥,并尝试使对象相交。
这里是相关代码JSBIN的链接(不可运行)。我的实现感觉很不准确,但是我不确定所有转换和计算是否正确。
重要的代码部分:
function getPlaneGeometry(points) {
var startX = points[0].x;
var startY = points[0].y;
var endX = points[points.length-1].x;
var endY = points[points.length-1].y;
var rx1 = (startX / window.innerWidth) * 2 - 1;
var rx2 = (endX / window.innerWidth) * 2 - 1;
var ry1 = -(startY / window.innerHeight) * 2 + 1;
var ry2 = -(endY / window.innerHeight) * 2 + 1;
var projectionMatrix = new THREE.Matrix4();
projectionMatrix.makePerspective( rx1, rx2, ry1, ry2, camera.near, camera.far );
camera.updateMatrix(); // make sure camera's local matrix is updated
camera.updateMatrixWorld(); // make sure plane's world matrix is updated
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
var viewProjectionMatrix = new THREE.Matrix4();
viewProjectionMatrix.multiplyMatrices( projectionMatrix, camera.matrixWorldInverse );
var frustum = new THREE.Frustum();
frustum.setFromMatrix(viewProjectionMatrix);
return frustum;
}
for ( var i in globeBars) {
var mesh = globeBars[i];
if (frustum.intersectsObject(mesh)) {
meshes.push(mesh);
}
}
提示: -我知道编码需要一些更新。 -点路径表示要进一步显示的Points(x,y)数组。 -那就是为什么我实现getSelectionsFromShape(shape)的原因,因为我想暗示将来要选择更多形状(自由绘制,...) -不相关的其他部分代表全球导航。