threejsLayer_bird.html 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title data-i18n="resources.title_flyBird"></title>
  6. <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  7. <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  8. <style>
  9. html, body {
  10. margin: 0;
  11. padding: 0;
  12. height: 100%;
  13. width: 100%;
  14. position: relative;
  15. }
  16. #map {
  17. width: 100%;
  18. height: 100%;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div id="map"></div>
  24. <script type="text/javascript" include="jquery" src="../js/include-web.js"></script>
  25. <script type="text/javascript" include="three,LegacyJSONLoader" src="../../dist/mapboxgl/include-mapboxgl.js"></script>
  26. <script type="text/javascript" src="js/bird/ImprovedNoise.js"></script>
  27. <script type="x-shader/x-vertex" id="vertexShader">
  28. varying vec3 vWorldPosition;
  29. void main() {
  30. vec4 worldPosition = modelMatrix * vec4( position, 1.0 );
  31. vWorldPosition = worldPosition.xyz;
  32. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  33. }
  34. </script>
  35. <script type="x-shader/x-fragment" id="fragmentShader">
  36. uniform vec3 topColor;
  37. uniform vec3 bottomColor;
  38. uniform float offset;
  39. uniform float exponent;
  40. varying vec3 vWorldPosition;
  41. void main() {
  42. float h = normalize( vWorldPosition + offset ).y;
  43. gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h , 0.0), exponent ), 0.0 ) ), 1.0 );
  44. }
  45. </script>
  46. <script>
  47. var attribution = "<a href='https://www.mapbox.com/about/maps/' target='_blank'>© Mapbox </a>" +
  48. " with <span>© <a href='https://iclient.supermap.io' target='_blank'>SuperMap iClient</a> | </span>" +
  49. " Map Data <span>© <a href='http://support.supermap.com.cn/product/iServer.aspx' target='_blank'>SuperMap iServer</a></span> ";
  50. var host = window.isLocal ? window.server : "https://iserver.supermap.io",
  51. url = host + "/iserver/services/map-china400/rest/maps/ChinaDark";
  52. var map, threeLayer, position = [104.05108830860604, 30.57183314034];
  53. map = new mapboxgl.Map({
  54. container: 'map',
  55. style: {
  56. "version": 8,
  57. "sources": {
  58. "raster-tiles": {
  59. "attribution": attribution,
  60. "type": "raster",
  61. "tiles": [url + '/zxyTileImage.png?z={z}&x={x}&y={y}'],
  62. "tileSize": 256,
  63. },
  64. },
  65. "layers": [{
  66. "id": "simple-tiles",
  67. "type": "raster",
  68. "source": "raster-tiles",
  69. "minzoom": 0,
  70. "maxzoom": 22
  71. }]
  72. },
  73. center: [104.05108830860604, 30.57183314034],
  74. zoom: 18.02,
  75. bearing: 18.13,
  76. pitch: 60
  77. });
  78. map.addControl(new mapboxgl.NavigationControl(), 'top-left');
  79. loaderModels();
  80. function loaderModels() {
  81. threeLayer = new mapboxgl.supermap.ThreeLayer('three');
  82. threeLayer.on("initialized", render);
  83. var mixers = [];
  84. var clock = new THREE.Clock();
  85. function render() {
  86. var renderer = threeLayer.getThreeRenderer(),
  87. scene = threeLayer.getScene(),
  88. camera = threeLayer.getCamera();
  89. //半球光光源
  90. var hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6);
  91. hemiLight.color.setHSL(0.6, 1, 0.6);
  92. hemiLight.groundColor.setHSL(0.095, 1, 0.75);
  93. hemiLight.position.set(0, 50, 0);
  94. scene.add(hemiLight);
  95. // 方向光源
  96. var dirLight = new THREE.DirectionalLight(0xffffff, 1);
  97. dirLight.color.setHSL(0.1, 1, 0.95);
  98. dirLight.position.set(-1, 1.75, 1);
  99. dirLight.position.multiplyScalar(30);
  100. scene.add(dirLight);
  101. renderer.gammaInput = true;
  102. renderer.gammaOutput = true;
  103. renderer.shadowMap.enabled = true;
  104. //加载飞鸟模型
  105. var loader = new THREE.LegacyJSONLoader();
  106. loader.load('./js/bird/bird.js', function (geometry) {
  107. var material = new THREE.MeshPhongMaterial({
  108. color: 0xffffff,
  109. specular: 0xffffff,
  110. shininess: 20,
  111. morphTargets: true,
  112. vertexColors: THREE.FaceColors,
  113. flatShading: true
  114. });
  115. var mesh = new THREE.Mesh(new THREE.BufferGeometry().fromGeometry(geometry), material);
  116. mesh.position.y = 15;
  117. mesh.rotation.y = -1;
  118. mesh.castShadow = true;
  119. mesh.receiveShadow = true;
  120. mesh.rotation.x = -Math.PI / 2;
  121. mesh.rotation.y = -Math.PI / 2;
  122. //设置飞鸟在地图上显示位置
  123. threeLayer.setPosition(mesh, position);
  124. scene.add(mesh);
  125. var mixer = new THREE.AnimationMixer(mesh);
  126. mixer.clipAction(geometry.animations[0]).setDuration(1).play();
  127. mixers.push(mixer);
  128. (function animate() {
  129. requestAnimationFrame(animate);
  130. var delta = clock.getDelta();
  131. for (var i = 0; i < mixers.length; i++) {
  132. mixers[i].update(delta);
  133. }
  134. renderer.render(scene, camera);
  135. })();
  136. });
  137. }
  138. threeLayer.addTo(map);
  139. }
  140. </script>
  141. </body>
  142. </html>