three.js实现世界3d地图
概况如下:
1、THREE.Shape
绘制世界地图平面地图;
2、THREE.ExtrudeGeometry
将绘制的平面沿着Z轴拉伸,实现3d效果;
效果图如下:
预览地址:three.js实现世界3d地图
初始化场景、相机、渲染器,设置相机位置,初始化光源,光源采用HemisphereLight
,设置光源位置为场景中心位置,并将光源加入场景中。
- // 初始化场景
- var scene = new THREE.Scene();
- // 初始化相机,第一个参数为摄像机视锥体垂直视野角度,第二个参数为摄像机视锥体长宽比,
- // 第三个参数为摄像机视锥体近端面,第四个参数为摄像机视锥体远端面
- var camera = new THREE.PerspectiveCamera(20, dom.clientWidth / dom.clientHeight, 1, 100000);
- // 设置相机位置,对应参数分别表示x,y,z位置
- camera.position.set(0, 0, 500);
- var renderer = new THREE.WebGLRenderer({
- alpha: true,
- antialias: true
- });
- // 设置光照
- scene.add(new THREE.HemisphereLight('#ffffff', '#ffffff', 1));
设置场景窗口尺寸,并且初始化控制器,窗口尺寸默认与浏览器窗口尺寸保持一致,最后将渲染器加载到dom中。
- // 设置窗口尺寸,第一个参数为宽度,第二个参数为高度
- renderer.setSize(dom.clientWidth, dom.clientHeight);
- // 初始化控制器
- var orbitcontrols = new THREE.OrbitControls(camera,renderer.domElement);
- // 将渲染器加载到dom中
- dom.appendChild(renderer.domElement);
绘制世界地图平面方法
- // 绘制世界平面地图函数
- var drawShape = function (pos, averageX, averageY) {
- var shape = new THREE.Shape();
- shape.moveTo(pos[0][0] - averageX, pos[0][1] - averageY);
- pos.forEach(function (item) {
- shape.lineTo(item[0] - averageX, item[1] - averageY);
- })
- return shape;
- }
将平面地图沿着z轴拉伸转换配置参数
- // ExturdeGeometry配置参数
- var options = {
- depth: 3, // 定义图形拉伸的深度,默认100
- steps: 0, // 拉伸面方向分为多少级,默认为1
- bevelEnabled: true, // 表示是否有斜角,默认为true
- bevelThickness: 0, // 斜角的深度,默认为6
- bevelSize: 0, // 表示斜角的高度,高度会叠加到正常高度
- bebelSegments: 0, // 斜角的分段数,分段数越高越平滑,默认为1
- curveSegments: 0 // 拉伸体沿深度方向分为多少段,默认为1
- }
将平面地图沿着z轴拉伸转换为3d方法
- // 将shape转换为ExtrudeGeometry
- var transition3d = function (shapeObj, identify) {
- var geometry = new THREE.ExtrudeGeometry(shapeObj, options);
- var material1 = new THREE.MeshBasicMaterial({
- color: faceColor
- });
- var material2 = new THREE.MeshBasicMaterial({
- color: sideColor
- });
- // 绘制地图
- shapeGeometryObj['shapeGeometry' + identify] = new THREE.Mesh(geometry, [material1, material2]);
- // 将地图加入场景
- scene.add(shapeGeometryObj['shapeGeometry' + identify])
- }
世界地图通过position
值来实现位置的确认,动画使用requestAnimationFrame
来实现。
- // 执行函数
- var render = function () {
- scene.rotation.y -= 0.01;
- renderer.render(scene, camera);
- orbitcontrols.update();
- requestAnimationFrame(render);
- }
three.js实现世界3d地图的更多相关文章
- Three.js实现3D地图实例分享
本文主要给大家介绍了关于利用Three.js开发实现3D地图的实践过程,文中通过示例代码介绍的非常详细,对大家学习或者使用three.js具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习 ...
- three.js 绘制3d地图
通过地图数据配合three可以做出非常酷炫的地图,在大数据展示中十分常见. 这篇郭先生就来说说使用three.js几何体制作3D地图.在线案例点击原文地址. 地图的数据是各个地图块的点数组,通过THR ...
- three.js通过canvas实现球体世界平面地图
概况如下: 1.SphereGeometry实现自转的地球: 2.THREE.CatmullRomCurve3实现球体线条地图点确定: 3.THREE.Math.degToRad,Math.sin,M ...
- Threejs 开发3D地图实践总结
前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂直于我们想要照亮的物体表面的向量.法线代表 ...
- Threejs 开发3D地图实践总结【转】
Threejs 开发3D地图实践总结 前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂 ...
- ArcGIS API for JavaScript 4.2学习笔记[2] 显示3D地图
3D地图又叫场景. 由上一篇可知, require入口函数的第一个参数是字符串数组 ["esri/Map", "esri/views/MapView", &qu ...
- 初级开发者也能码出专业炫酷的3D地图吗?
好看的3D地图搭建出来,一定是要能为开发者所用与业务系统开发中才能真正地体现价值.基因于此,CityBuilder建立了与ThingJS的通道——直转ThingJS代码,支持将配置完成的3D地图一键转 ...
- Windows 10 新特性 -- Bing Maps 3D地图开发入门(一)
本文主要内容是讲述如何创建基于 Windows Universal App 的Windows 10 3D地图应用,涉及的Windows 10新特性包括 Bing Maps 控件.Compiled da ...
- js渲染的3d玫瑰
参看下面链接: 程序员最美情人节礼物:JS渲染的3D玫瑰
随机推荐
- opencv在VS2017上的环境搭建
最近开始做一个图像识别的小项目,需要安装opencv,VS里报的错迷的一批,网上教程好多,找了好长时间,终于找的两个解决了问题,在这儿记录一下. 安装很简单,在opencv官网(https://ope ...
- .NETCore C# 中级篇2-6 Json与XML
.NETCoreCSharp 中级篇2-6 本节内容为Json和XML操作 简介 Json和XML文本是计算机网络通信中常见的文本格式,其中Json其实就是JavaScript中的数组与对象,体现了一 ...
- django简单密码加密和效验
通过django自带的类库,来加密解密很方便,下面来简单介绍下: 导入包: from django.contrib.auth.hashers import make_password, check_p ...
- 爬虫爬取m3u8视频文件
一.m3u8视频格式 一般m3u8文件和 视频流ts文件放在同一目录 而m3u8文件格式存放的一般都是ts 文件的一个列表 二.根据m3u8视频存放以及写法的规律 思路 我们一般网站上能找到的m3u8 ...
- SSH框架之Hibernate第四篇
Hibernate中有两套实现数据库数据操作的方式 : hibernate前3天讲解的都是 : hibernate自己的操作方式(纯XML配置文件的方式) 另一种方式是基于JPA的操作方式(通过注解的 ...
- Dynamics CRM邮件附件,你真的了解吗?
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复160或者20151014可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 听人问起怎么读取到一封邮件所有的 ...
- Xamarin Bindableproperty 可绑定属性
重要的事情说三遍: 本文基本是取自微软官方 Bindable Properties, 官方也提供了机翻的中文版本,笔者只是尝试用自己的理解描述一遍,便于记忆.如有不对之处,欢迎拍砖. 本文基本是取自微 ...
- Ubuntu下Xilinx Linux内核编译问题,出现“缺少ncurses”libraries
对官方提供的内核源码包进行解压缩,进入到内核目录,使用make menuconfig后,发现提示以下错误: *** Unable to find the ncurses libraries or th ...
- React 创建一个自动跟新时间的组件
componentDidMount声明周期函数 表示组件渲染完成后 componentWillUnmount声明周期函数 组件将要卸载 通常用于(为了防止内存泄漏 清除定时器) 11==>创建组 ...
- Codeforces Round #594 (Div. 2)
传送门 C. Ivan the Fool and the Probability Theory 题意: 给出一个\(n*m\)的方格,现在要给方格中的元素黑白染色,要求任一颜色最多有一个颜色相同的格子 ...