谷歌地球api(googlemap)引入threejs模型方法

通过前两个文章的代码我们已经完成了基础谷歌地图引入和地图自定义标点的方法
下面我们将地球引入模型展示
注意!想要引入模型自己编辑的底图必须是矢量底图,在谷歌创建地图时注意选择!

// 引入依赖
npm install @googlemaps/js-api-loader
npm i @googlemaps/three

import { Loader } from '@googlemaps/js-api-loader';
import * as THREE from "three";
import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js';

initMap()
var map
const loader = new Loader({
  apiKey: "你的秘钥",
  version: "beta",
});
const mapOptions = {
  "tilt": 0,
  "heading": 0,
  "zoom": 18,
  "center": { lat: , lng:  },
  "mapId": "你的地图ID",
  mapTypeId: "satellite",
  'zoomControl': false,
  'mapTypeControl': false,
  'scaleControl': false,
  'streetViewControl': false,
  'rotateControl': false,
  'fullscreenControl': false
};


loader.load().then(() => {
		//初始化地球方法
        const mapDiv = document.getElementById("map");
        const apiLoader = new Loader(loader);
        apiLoader.load();
        map  =  new google.maps.Map(mapDiv, mapOptions);
        //调用地图模型加载方法
        initWebGLOverlayView(map)
        //click事件获得定位
        map.addListener("click", (e) => {
          console.log(e.latLng.lat(),e.latLng.lng());
        });
        map.moveCamera({
          center: new google.maps.LatLng(经,纬度),
          zoom: 16,
          heading: 0,
          tilt: 60
        });
  }
async function initWebGLOverlayView (map) {

  let scene, renderer, camera, loader;
  let lat,lng
  //如果需要加载多个模型请在此处多定义几个方法
  //let scene1, renderer1, camera1, loader1;
  //let lat1,lng1
  //初始化模型方法
  const webGLOverlayView = new google.maps.WebGLOverlayView();
  webGLOverlayView.onAdd = () => {
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera();
	//如果需要加载多个模型
    //scene1 = new THREE.Scene();
    //camera1 = new THREE.PerspectiveCamera();
    
    //第一个模型--------------------
    //亮度0xffffff,'#1772B4'
    //调整模型亮度
    var ambientLight = new THREE.AmbientLight(0xffffff, 3 ); // soft white light
    //光照
    var directionalLight = new THREE.DirectionalLight(0xffffff, 0);
    directionalLight.position.set(0.1, -1, 0.5);
    scene.add( ambientLight );
    scene.add(directionalLight);
    loader = new GLTFLoader();
    //你的模型地址,可以是相对路径或者http地址
    var source = 'dexintouming8.gltf';
    loader.load(
      source,
      gltf => {
        gltf.scene.scale.set(75,75,75);//长、高、宽
        gltf.scene.rotation.x = 90 * Math.PI/180;
        scene.add(gltf.scene);
      }
    );
    //定义你的经纬度
    lat = ''
    lng = ''

	//如果要加载多个模型
	 //亮度
   	//var ambientLight = new THREE.AmbientLight( 0xffffff, 0.1 ); // soft white light
    //光照
    //var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
    //directionalLight.position.set(0.1, -1, 0.5);
    //scene1.add( ambientLight );
    //scene1.add(directionalLight);
    //loader1 = new GLTFLoader();
    //var source1 = '4.gltf';
    //loader1.load(
     // source1,
     // gltf => {
     //   gltf.scene.scale.set(900,750,700);//长、高、宽
     //   gltf.scene.rotation.x = 90 * Math.PI/180;
     //   scene1.add(gltf.scene);
     // }
   // );
   // lat1 = 
    //lng1 = 
 
  }
  webGLOverlayView.onContextRestored = ({gl}) => {
    //第一个模型-----------------------------------------
    renderer = new THREE.WebGLRenderer({
      canvas: gl.canvas,
      context: gl,
      ...gl.getContextAttributes(),
    });
    renderer.autoClear = false;
//如果要加载多个模型
   // renderer1 = new THREE.WebGLRenderer({
    //  canvas: gl.canvas,
    //  context: gl,
     // ...gl.getContextAttributes(),
   // });
   // renderer1.autoClear = false;
  
  }

  webGLOverlayView.onDraw = ({gl, transformer}) => {
    //第一个模型
    const latLngAltitudeLiteral = {
      lat: lat,
      lng: lng,
      altitude: 1
    }
    const matrix = transformer.fromLatLngAltitude(latLngAltitudeLiteral);
    camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix);
    webGLOverlayView.requestRedraw();
    renderer.render(scene, camera);
    renderer.resetState();
    //初始化方法
    renderer.resetState();
	//如果要加载多个模型
   // var latLngAltitudeLiteral1 = {
     // lat: lat1,
     // lng: lng1,
    //  altitude: 1
   // }
   // var matrix1 = transformer.fromLatLngAltitude(latLngAltitudeLiteral1);
   // camera1.projectionMatrix = new THREE.Matrix4().fromArray(matrix1);
   // webGLOverlayView.requestRedraw();
   // renderer.render(scene1, camera1);

  }
  webGLOverlayView.setMap(map);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值