【问题标题】:syncing d3.js with THREE.js earth将 d3.js 与 THREE.js 地球同步
【发布时间】:2017-01-18 22:25:54
【问题描述】:

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

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

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

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,而是使用Three.js。你有什么解决办法吗?

标签: javascript d3.js three.js map-projections d3.geo


【解决方案1】:

我也不使用 WebGL 地球,检查您的 jsfiddle 不再有效,并且我假设您的问题是您希望将 D3.js 与 Threejs 集成作为 3d 地球的解决方案。

我建议您尝试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();
    })

上面的 sn-p 代码你可以从 here 运行它。

【讨论】:

  • 感谢您的提示。我也会修复 jsFiddle。我试图实现的是将 D3 svg 图层投影与 Three.js WebGL 画布同步。 Earthjs 使用画布来渲染两者,效果很好,但它失去了 SVG 的可能性。
  • 啊,我明白了,你能try this demo, svg on top of Threejs,基本上我正在使用另一个svg插件。
  • 更新我的答案并使用 svg 插件。
  • 这太完美了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多