2016-09-11 2 views
3

WebGL 지구를 d3.geo.satellite 프로젝션과 결합하려고합니다.THREE.js 지구와 d3.js 동기화

2 개의 투영을 서로 겹쳐서 회전을 동기화 할 수 있었지만 확대/축소를 동기화하는 데 문제가 있습니다. 크기를 맞추기 위해 이들을 동기화하면 WebGL 투영이 변형되지만 d3.geo.satellite는 동일하게 유지됩니다. 나는 많은 성공없이 projection.scale, projection.distance의 다른 조합을 시도했다.

여기는 JS 피들입니다 (리소스를로드하는 데 약간 시간이 걸립니다). 드래그하여 회전시킬 수 있습니다 (잘 작동 함). 그러나 확대 (마우스 휠 사용)하면 문제를 볼 수 있습니다. 스케일 기능 -

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

중요한 코드는 스크립트의 맨 아래에 있습니다. 나는 당신의 jsfiddle에 검사 중 WebGL이 지구를 사용하지 않는

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; 
} 
+0

이 문제도 발생하지만 WebGL 지구를 사용하지 않고 대신 Three.js를 사용합니다. 어떤 해결책이 있습니까? –

답변

1

더 이상 작동, 당신은 3D 세계를위한 솔루션으로 Threejs으로 통합 D3.js하려는 문제의 내 가정이되지 않습니다.

해결책으로 earthjs을 사용해 보시기 바랍니다. 후드에서는 D3.js v4를 사용합니다. & 세 개정 8x가 모두 최신이고 Svg, 캔버스 & 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에서 실행할 수 있습니다.

+0

팁 주셔서 감사. 나는 또한 jsFiddle을 고칠 것이다. 내가 뭘 하려던 것은 D3 svg 레이어 투영을 Three.js WebGL 캔버스와 동기화하는 것이 었습니다. Earthjs는 둘 다 렌더링하기 위해 캔버스를 사용하고 있지만 잘 작동하지만 SVG의 가능성은 느슨합니다. – nxtwrld

+1

아, 나는 그것을 얻을 수있다, 당신은 [이 데모를 시도, Threejs 맨 위에 svg] (https://earthjs.github.io/09-readme/index1.html), 기본적으로 svg에 대한 다른 플러그인을 사용하고 있습니다. –

+0

내 대답을 업데이트하고 svg 용 플러그인을 사용하십시오. –