ThreeJS 制作地球

环境

  • ThreeJS 107版本
  • three.min.js
  • OrbitControls.js
  • 深空背景图片 大小4036*1808
  • 地球贴图 大小2048*1024 边幅以东西经180度为界限

说明

原本我们GIS使用的是cesiumJS开发的三维,但如果仅仅作为前端,大屏展示三维地球效果,cesiumJS显得过于厚重。故非强GIS功能,我们探索了ThreeJS。

解决方案

  1. 获取地球容器
//获取地球容器
dom = document.getElementById('divEarth');
dom.style.width = '100%';
dom.style.height = '100%';
  1. 添加深空背景
var _imgSky = "assets/images/earth_bg.jpg";
dom.style.background = "url(" + _imgSky + ") no-repeat center center";
dom.style.backgroundColor = "#00000000";
  1. 初始化场景,并设置场景光线
// 初始化场景
scene = new THREE.Scene();
// 设置光线
scene.add(new THREE.HemisphereLight('#ffffff', '#ffffff', 1));
  1. 设置相机
// 初始化相机
camera = new THREE.PerspectiveCamera(20, dom.clientWidth / dom.clientHeight, 1, 100000);
// 设置相机位置
camera.position.set(0, 0, 200);
  1. 初始化渲染
renderer = new THREE.WebGLRenderer({
alpha: true, //是否透明
antialias: true //抗锯齿
});
renderer.autoClear = false;
// 设置窗口尺寸
renderer.setSize(dom.clientWidth, dom.clientHeight);
dom.appendChild(renderer.domElement);
  1. 初始化轨道控制器
    这里需要先引入js包(OrbitControls.js)
// 初始化控制器
orbitcontrols = new THREE.OrbitControls(camera, renderer.domElement);
// 使动画循环使用时阻尼或自转 意思是否有惯性
orbitcontrols.enableDamping = true;
  1. 创建地球对象
// 定义地球材质
var earthTexture = THREE.ImageUtils.loadTexture("assets/images/starry_sky_bg.jpg", {}, function () {
renderer.render(scene, camera);
});
// 创建地球
earthBall = new THREE.Mesh(new THREE.SphereGeometry(30, 50, 50), new THREE.MeshBasicMaterial({
map: earthTexture
}));
earthBall.layers.set(0);
//添加到场景
scene.add(earthBall);
  1. 最后加上渲染
render();
// 执行函数
function render() {
if (handle) {
cancelAnimationFrame(handle);
}
renderer.clearDepth();
//自转,自转速度(正数自西向东转,负数为逆向)
scene.rotation.y += 0.01;
renderer.render(scene, camera);
orbitcontrols.update();
handle = requestAnimationFrame(render);
}

附上接口源码

var ThreeJSEarth = function (_domID, _earthOptions) {
var scene, renderer, camera, orbitcontrols;
var earthBall;//地球实体
var dom, handle;//容器,定时器动画句柄

/**
* 初始化地球,对象创建时自动调用
*/
(function init() {
//获取地球容器
dom = document.getElementById(_domID);
dom.style.width = '100%';
dom.style.height = '100%';
var _imgSky = _earthOptions.imgSky ? _earthOptions.imgSky : "";
dom.style.background = "url(" + _imgSky + ") no-repeat center center";
dom.style.backgroundColor = "#00000000";

// 初始化场景
scene = new THREE.Scene();
// 初始化相机
camera = new THREE.PerspectiveCamera(20, dom.clientWidth / dom.clientHeight, 1, 100000);
// 设置相机位置
camera.position.set(0, 0, _earthOptions.cameraZ ? _earthOptions.cameraZ : 200);
renderer = new THREE.WebGLRenderer({
alpha: true,
antialias: true
});
renderer.autoClear = false;
// 设置窗口尺寸
renderer.setSize(dom.clientWidth, dom.clientHeight);
// 初始化控制器
orbitcontrols = new THREE.OrbitControls(camera, renderer.domElement);
// 使动画循环使用时阻尼或自转 意思是否有惯性
orbitcontrols.enableDamping = true;
//动态阻尼系数 就是鼠标拖拽旋转灵敏度
// orbitcontrols.dampingFactor = 0.2;
dom.appendChild(renderer.domElement);
// 设置光线
scene.add(new THREE.HemisphereLight('#ffffff', '#ffffff', 1));
// 定义地球材质
var earthTexture = THREE.ImageUtils.loadTexture(_earthOptions.imgEarth ? _earthOptions.imgEarth : "404.jpg", {}, function () {
renderer.render(scene, camera);
});
// 创建地球
earthBall = new THREE.Mesh(new THREE.SphereGeometry(_earthOptions.earthBallSize, 50, 50), new THREE.MeshBasicMaterial({
map: earthTexture
}));
earthBall.layers.set(0);
scene.add(earthBall);
// this.renderEarthByRender();
render();
})();
// 执行函数
function render() {
if (handle) {
cancelAnimationFrame(handle);
}
renderer.clearDepth();
//自转
scene.rotation.y += _earthOptions.autorotationSpeed ? _earthOptions.autorotationSpeed : 0;
renderer.render(scene, camera);
orbitcontrols.update();
handle = requestAnimationFrame(render);
}
// 窗口resize事件
window.onresize = function () {
// 重新初始化尺寸
camera.aspect = dom.clientWidth / dom.clientHeight;
camera.updateProjectionMatrix();
renderer.setSize(dom.clientWidth, dom.clientHeight)
}
}

调用方式

//初始化
function initThree() {
var earthOptions = {
//imgEarth: 'assets/images/earth_bg.jpg',//地球贴图
imgEarth: 'http://10.19.151.238/earth_bg.jpg',//地球贴图
imgSky: 'assets/images/starry_sky_bg.jpg',//深空背景
autorotationSpeed: 0,//自转速度(正数自西向东转,负数为逆向)
cameraZ: 200,//摄像头高度,
earthBallSize: 30//地球大小
};
encEarth = new EncEarth("three-frame", earthOptions);
}

附上效果图

加载地球

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
three.js是一个用于在网页上创建3D图形的JavaScript库。在three.js中,我们可以使用贴图将图像贴在3D几何体上,包括地球。 要在three.js上创建一个地球贴图,我们需要准备一个地球的纹理图像。可以通过搜索引擎或者自己制作一个地球纹理图像。接下来,我们需要用three.js的纹理加载器将该图像加载到代码中。 例如,我们可以使用以下代码加载地球贴图: ```javascript var scene = new THREE.Scene(); // 创建场景 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); // 创建相机 camera.position.z = 5; // 设置相机位置 var renderer = new THREE.WebGLRenderer(); // 创建渲染器 renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器大小 document.body.appendChild(renderer.domElement); // 将渲染器添加到HTML页面 var textureLoader = new THREE.TextureLoader(); // 创建纹理加载器 var texture = textureLoader.load('path/to/earth_texture.jpg'); // 加载地球纹理图像 var geometry = new THREE.SphereGeometry(1, 32, 32); // 创建球体几何体 var material = new THREE.MeshBasicMaterial({ map: texture }); // 创建材质并将纹理赋给材质 var earth = new THREE.Mesh(geometry, material); // 创建地球网格 scene.add(earth); // 将地球添加到场景中 function animate() { requestAnimationFrame(animate); earth.rotation.y += 0.01; // 旋转地球 renderer.render(scene, camera); // 渲染场景和相机 } animate(); ``` 在以上代码中,我们使用`THREE.SphereGeometry`创建一个球体几何体,然后使用`THREE.MeshBasicMaterial`创建一个基本材质,并将地球纹理赋给材质。最后,我们将球体几何体和材质创建一个网格,并将网格添加到场景中。 通过控制`earth.rotation.y`的值,我们可以让地球旋转起来。最后,在`animate`函数中,我们使用`requestAnimationFrame`动画帧来不断调用`animate`函数并渲染场景,使得地球可以旋转。 以上是使用three.js创建地球贴图的基本步骤。可以根据自己的需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值