【问题标题】:OpenLayers Map as texture on THREE.js planeOpenLayers Map 作为 THREE.js 平面上的纹理
【发布时间】:2017-05-17 22:14:56
【问题描述】:

我希望在 THREE.js 中使用 OpenLayers 贴图作为平面的纹理。我知道您可以将画布元素加载为平面材质的纹理,因此我尝试了不同的方法来实现这一点,但没有成功。首先,我在 DOM 中创建了一个带有 id=map 的画布元素。然后,我在上面创建了一张地图:

  const layers = [
      new ol.layer.Tile({
         source: new ol.source.OSM()
      })
  ];
  const map = new ol.Map({
      layers: layers,
      target: 'map',
      view: new ol.View({
         center: [-10997148, 4569099],
         zoom: 4
      })
  });

然后我尝试将地图作为纹理加载到我的三个场景中,例如:

const texture = new THREE.Texture(canvas);
texture.needsUpdate = true;
const material = new THREE.MeshBasicMaterial({ map : texture, });
const plane = new THREE.Mesh(geometry, material);

scene.add(this.plane);

这样做时,我只能看到黑色的飞机。场景中的其余元素正确渲染,我可以在 2D 画布元素中完美地看到地图。如果我不使用 OpenLayers 贴图,而是使用 fillRect 或类似的东西在画布上绘制,那么飞机会很好地获得纹理。我究竟做错了什么? (我正在使用 OL3 和三个 r71)

【问题讨论】:

  • 地图完全加载后可能需要设置texture.needsUpdate

标签: three.js openlayers-3


【解决方案1】:

正如 2pha 建议的那样,我需要在地图完全加载后设置 texture.needsUpdate,您可以确保使用来自 OpenLayers 的 postrender 地图事件,例如:

map.on('postrender', () => {
    document.getElementById('map2').children[0].children[0];
    const texture = new THREE.Texture(canvas);
    texture.needsUpdate = true;
    const material = new THREE.MeshBasicMaterial({ map: texture });
    plane = new THREE.Mesh(geometry, material);
    scene.add(this.plane);
});

【讨论】:

  • "map2" 是你三个js用的id吗?另外,“画布”在哪里定义??
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2012-12-13
  • 2012-01-19
相关资源
最近更新 更多