同步 d3.js 与 THREE.js 地球

syncing d3.js with THREE.js earth

我正在尝试将 WebGL earth 与 d3.geo.satellite 投影相结合。

我已经设法将 2 个投影相互叠加并同步旋转,但我无法同步缩放。当我同步它们以匹配大小时,WebGL 投影会变形,但 d3.geo.satellite 保持不变。我尝试了 projection.scale、projection.distance 的不同组合,但都没有成功。

这里是JSfiddle(加载资源需要一点时间)。您可以拖动它进行旋转(效果很好)。但是如果你放大(使用鼠标滚轮)你可以看到问题。

https://jsfiddle.net/nxtwrld/7x7dLj4n/2/

重要的代码在脚本的底部——缩放函数。

function scale(){
    var scale = d3.event.scale;
    var ratio = scale/scale0;

    // scale projection
    projection.scale(scale);

    // scale Three.js earth
    earth.scale.x = earth.scale.y = earth.scale.z = ratio;
}

我也不使用 WebGL earth,检查你的 jsfiddle 不再工作,我假设你想将 D3.js 与 Threejs 集成作为 3d globe 的解决方案。

我可以建议您尝试 earthjs 作为您的解决方案。在引擎盖下它使用 D3.js v4 和 Threejs 修订版 8x 都是最新的,它可以在 Svg、canvas 和 threejs(WebGL) 之间结合。

    const g = earthjs({padding:60})
    .register(earthjs.plugins.mousePlugin())
    .register(earthjs.plugins.threejsPlugin())
    .register(earthjs.plugins.autorotatePlugin())
    .register(earthjs.plugins.dropShadowSvg(),'dropshadow')
    .register(earthjs.plugins.worldSvg('../d/world-110m.json'))
    .register(earthjs.plugins.globeThreejs('../globe/world.jpg'))
    g._.options.showLakes = false;
    g.ready(function(){
        g.create();
    })

上面的代码片段你可以 运行 它来自 here