Three.js选择:3D球体(globe)对象的相交

时间:2018-12-29 12:15:16

标签: javascript three.js intersection raycasting frustum

我使用Google WebGL Globe作为参考并添加了交点,此外,我想通过SHIFT + DRAG Google WebGL GLobe - multiple selection tool

执行多个对象选择

为此,我使用了一个视锥,并尝试使对象相交。

这里是相关代码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)的原因,因为我想暗示将来要选择更多形状(自由绘制,...) -不相关的其他部分代表全球导航。

0 个答案:

没有答案