日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

three.js通过canvas实现球体世界平面地图

發布時間:2023/12/15 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 three.js通过canvas实现球体世界平面地图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概況如下:

1、SphereGeometry實現自轉的地球;

2、THREE.CatmullRomCurve3實現球體線條地圖點確定;

3、THREE.Math.degToRadMath.sinMath.cos實現地圖經緯度與三位坐標x,y,z之間的轉換;

4、MeshLine用于繪制線條;

5、canvas用于繪制球體世界地圖貼圖,通過THREE.CanvasTexture引入。

效果圖如下:

預覽地址:three.js通過canvas實現球體世界平面地圖

初始化場景、相機、渲染器,設置相機位置,初始化光源,光源采用HemisphereLight,設置光源位置為場景中心位置,并將光源加入場景中。

 1 // 初始化場景
 2 var scene = new THREE.Scene();
 3 // 初始化相機,第一個參數為攝像機視錐體垂直視野角度,第二個參數為攝像機視錐體長寬比,
 4 // 第三個參數為攝像機視錐體近端面,第四個參數為攝像機視錐體遠端面
 5 var camera = new THREE.PerspectiveCamera(20, dom.clientWidth / dom.clientHeight, 1, 100000);
 6 // 設置相機位置,對應參數分別表示x,y,z位置
 7 camera.position.set(0, 0, 200);
 8 var renderer = new THREE.WebGLRenderer({
 9       alpha: true,
10       antialias: true
11 });
12 // 設置光照
13 scene.add(new THREE.HemisphereLight('#ffffff', '#ffffff', 1));

設置場景窗口尺寸,并且初始化控制器,窗口尺寸默認與瀏覽器窗口尺寸保持一致,最后將渲染器加載到dom中。

1 // 設置窗口尺寸,第一個參數為寬度,第二個參數為高度
2 renderer.setSize(dom.clientWidth, dom.clientHeight);
3 // 初始化控制器
4 var orbitcontrols = new THREE.OrbitControls(camera,renderer.domElement);
5 // 將渲染器加載到dom中
6 dom.appendChild(renderer.domElement);

通過canvas定義地球材質。

 1 // canvas畫地圖函數,因為性能問題,線條不再canvas中實現,w表示寬度,h表示高度,worldPos表示世界地圖經緯度信息
 2 var createCanvas = function (w, h, worldPos) {
 3     var canvas = document.createElement('canvas');
 4     canvas.width = w;
 5     canvas.height = h;
 6     var context = canvas.getContext('2d');
 7     var centerX = w / 2;
 8     var centerY = h / 2;
 9     var average = w / 360;
10     // 繪制背景顏色
11     context.fillStyle = earthBallColor;
12     context.fillRect(0, 0, w, h);
13     // canvas中繪制地圖方法
14     function canvasLineFun (childrenPosition) {
15         context.fillStyle = earthBallPlaneColor;
16         context.moveTo(centerX + childrenPosition[0][0] * average, centerY - childrenPosition[0][1] * average);
17         childrenPosition.forEach(function (posItem) {
18             context.lineTo(centerX + posItem[0] * average, centerY - posItem[1] * average);
19         })
20         context.closePath();
21         context.fill();
22     }
23     worldPos.forEach(function (item) {
24         canvasLineFun(item);
25     })
26     return canvas;
27 }

定義地球及其材質,地球通過SphereGeometry來實現,通過THREE.CanvasTexture來引入canvas創建的貼圖。

1 // 創建地球
2 earthBall = new THREE.Mesh(new THREE.SphereGeometry(earthBallSize, 50, 50), new THREE.MeshBasicMaterial({
3     map: new THREE.CanvasTexture(createCanvas(2048, 1024, worldGeometry)),
4     side: THREE.FrontSide
5 }));
6 scene.add(earthBall);

標記地點經緯度坐標與三維x,y,z坐標轉換方法。

 1 // 經緯度轉換函數,longitude表示經度,latitude表示唯獨,radius表示球體半徑
 2 var getPosition = function (longitude, latitude, radius) {
 3     // 將經度,緯度轉換為rad坐標
 4     var lg = THREE.Math.degToRad(longitude);
 5     var lt = THREE.Math.degToRad(latitude);
 6     var temp = radius * Math.cos(lt);
 7     // 獲取x,y,z坐標
 8     var x = temp * Math.sin(lg);
 9     var y = radius * Math.sin(lt);
10     var z = temp * Math.cos(lg);
11     return {
12         x: x,
13         y: y,
14         z: z
15     }
16 }

繪制世界地圖線條方法

 1 // 繪制世界地圖線條函數
 2 var drawWorldLine = function (pos, identify) {
 3     var posArray = [];
 4     pos.forEach(function (item) {
 5         var pointPosition = getPosition(item[0] + 90, item[1], earthBallSize);
 6         posArray.push(new THREE.Vector3(pointPosition.x, pointPosition.y, pointPosition.z));
 7     })
 8     // 繪制的線條需要關閉,第二個參數默認為false,表示不關閉
 9     var curve = new THREE.CatmullRomCurve3(posArray, true);
10     var points = curve.getPoints(500);
11     var geometry = new THREE.Geometry().setFromPoints(points);
12     // 定義線條
13     var line = new MeshLine();
14     line.setGeometry(geometry);
15     // 定義線條材質
16     var material = new MeshLineMaterial({
17         color: worldLineColor,
18         lineWidth: worldLineWidth
19     })
20     // 繪制地圖
21     lineGeometryObj['lineGeometry' + identify] = new THREE.Mesh(line.geometry, material);
22     // 將地圖加入場景
23     scene.add(lineGeometryObj['lineGeometry' + identify])
24 }

獲取世界地圖經緯度信息及計算繪制球體地圖參數方法

 1 // 獲取世界經緯度信息函數
 2 var getWorldGeometry = function () {
 3     $.ajax({ 
 4          type : "GET", //提交方式 
 5          url : "./code/world.json",
 6          async: false,
 7          success : function(response) {//返回數據根據結果進行相應的處理 
 8              worldGeometry = [];
 9              // 繪制世界地圖
10             response.features.forEach(function (worldItem, worldItemIndex) {
11                 var length = worldItem.geometry.coordinates.length;
12                 var multipleBool = length > 1 ? true : false;
13                 worldItem.geometry.coordinates.forEach(function (worldChildItem, worldChildItemIndex) {
14                     if (multipleBool) {
15                         // 值界可以使用的經緯度信息
16                         if (worldChildItem.length && worldChildItem[0].length == 2) {
17                             worldGeometry.push(worldChildItem);
18                         }
19                         // 需要轉換才可以使用的經緯度信息
20                         if (worldChildItem.length && worldChildItem[0].length > 2) {
21                             worldChildItem.forEach(function (countryItem, countryItenIndex) {
22                                 worldGeometry.push(countryItem);
23                             })
24                         }
25                     } else {
26                         var countryPos = null;
27                         if (worldChildItem.length > 1) {
28                             countryPos = worldChildItem;
29                         } else {
30                             countryPos = worldChildItem[0];
31                         }
32                         if (countryPos) {
33                             worldGeometry.push(countryPos);
34                         }
35                     }
36                 })
37             })
38          } 
39     })
40 }

球體地圖線條通過position值來實現位置的確認,動畫使用requestAnimationFrame來實現。

1 // 執行函數
2 var render = function () {
3     scene.rotation.y -= 0.01;
4     renderer.render(scene, camera);
5     orbitcontrols.update();
6     requestAnimationFrame(render);
7 }

總結

以上是生活随笔為你收集整理的three.js通过canvas实现球体世界平面地图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩综合 | av无遮挡 | 欧美成人一区在线观看 | 美丽姑娘免费观看在线观看 | 天天爱夜夜爽 | 男女偷爱性视频刺激 | 亚洲一二三视频 | 先锋av在线资源 | 国产免费一区二区三区最新不卡 | 亚洲精品tv | 波多野一区二区 | 日本va视频 | 一个人看的视频www 色就是色网站 | 亚洲视频在线一区 | 亚洲天堂午夜 | 日本xxx在线观看 | 丰满人妻一区二区三区53号 | 国产香蕉视频在线播放 | 亚洲一区二区三区在线视频观看 | 91精品国 | 国产精品中文无码 | 在线看污视频 | 欧美9999| 国产色播 | 最近2019中文字幕大全第二页 | 玩偶游戏在线观看免费 | 精品五月天 | 欧美激情va永久在线播放 | 久久久久91 | 日韩女优在线 | 成年人午夜免费视频 | 在线免费小电影 | 午夜窝窝 | 亚洲第6页| 亚洲免费看片 | 一区二区午夜 | 国产91精品高潮白浆喷水 | 国产偷人 | 日日干夜夜草 | 成人国产在线观看 | 99热精品免费 | 国产精品国产三级国产普通话蜜臀 | 五十路六十路 | 黄色一级免费网站 | 国产123区| 精品成人一区二区三区久久精品 | 天天草天天射 | 91黑丝在线观看 | 久久久久中文字幕亚洲精品 | www.青青操| 日本熟妇成熟毛茸茸 | 怡红院国产 | 国产综合视频在线观看 | 香蕉视频毛片 | 国产精品v亚洲精品v日韩精品 | 国产视频你懂的 | 欧美瑟瑟 | tube极品少妇videos | 黄色aa级片| 国产一区二区三区四区五区六区 | 日韩三级不卡 | 天天操天天操天天操天天操 | 高清视频一区二区三区 | 亚洲性图一区二区 | 婷婷色婷婷开心五月四房播播 | 精品无码m3u8在线观看 | 亚洲欧美变态另类丝袜第一区 | 久久久久蜜桃 | 日韩欧美网站 | 午夜三区 | 亚洲乱码中文字幕久久孕妇黑人 | 91porny首页入口 | 瑟瑟视频在线看 | 影音先锋丝袜美腿 | 久久福利视频导航 | 国产中文在线 | 成人黄色片在线观看 | 夜夜艹天天干 | 超碰男人的天堂 | 国产 中文 字幕 日韩 在线 | 亚洲一区美女 | 高潮av在线| 久久九九爱 | 欧美九九| 国产成人一区二区三区影院在线 | 视频污在线观看 | 91精品国产欧美一区二区 | 国产黄大片 | 婷婷国产精品 | 久久精品国产99久久久 | 亚洲色图视频在线观看 | 久久看片网 | 熟妇人妻中文av无码 | 日韩欧美在线一区二区三区 | 日韩精品视频免费播放 | 性xxx18| 亚洲天天视频 | 久久青草热 | 日韩爱爱网站 |