3d 地球与卫星绕地飞行

这篇具有很好参考价值的文章主要介绍了3d 地球与卫星绕地飞行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求:实现3d地球与卫星绕地飞行,实时运动

1 准备

  1. 创建场景
let scene = new THREE.Scene();
// scene.background = new THREE.Color( 0xa0a0a0 );
this.scene = scene;
  1. 创建相机
//canvas将要渲染的位置大小
let areaSize = this.areaSize;
//渲染区域
let camera = new THREE.PerspectiveCamera(60,  areaSize.width / areaSize.height, 0.1, 10000)
//设置相机位置
camera.position.set(50, -10, 200)
//设置相机方向
camera.lookAt(0, 0, 0)
this.camera = camera;
this.scene.add(this.camera);
  1. 创建网络模型
//==============地球===============
//this.map.earthRadius为显示地球的半径
let geometry = new THREE.SphereGeometry( this.map.earthRadius, 64, 32);
let earthImgSrc = require('@/assets/img/home/home3dMapBackground.png');
//材质
let earthMater = new THREE.MeshPhongMaterial({
	map: new THREE.TextureLoader().load(earthImgSrc),
	transparent:true,
	depthWrite:false,
});
//网络模型对象 -- 地球
let meshMaterial = new THREE.Mesh(geometry,earthMater);
//地球模型
this.meshMaterial = meshMaterial;
//添加到场景中
this.scene.add(meshMaterial);

//==============卫星轨迹===============
// 轨迹圆环图片
let sadImgSrc = require('@/assets/img/control/satellite.png');
//循环卫星   假设有3颗卫星
for(let i=0; i<3; i++){
	let satelliteSize = 12,satelliteRadius=0,rotation={x:0,y:0,z:0},speed=0;
	if(i==0){
		satelliteRadius = 80;
		rotation.x = -Math.PI * 0.35;
		rotation.y = Math.PI * 0.25;
		rotation.z = 0;
		speed = 0.004;
	}else if(i==1){
		satelliteRadius =100;
		rotation.x = -Math.PI * 0.35;
		rotation.y = -Math.PI * 0.2;
		rotation.z = 0;
		speed = 0.005;
	}else{
		satelliteRadius = 86;
		rotation.x = -Math.PI * 0.25;
		rotation.y = Math.PI * 0.15;
		rotation.z = 0;
		speed = 0.003;
	}
	//卫星中心
	let earthGeometry = new THREE.SphereGeometry(0,0,0); 
	//材质
	let earthMater = new THREE.MeshPhongMaterial({
		color:0xa0a0a0,
	});
	let centerMesh = new THREE.Mesh(earthGeometry,earthMater);
	
	//卫星圆环
	let circleGeometry = new THREE.RingGeometry(satelliteRadius, satelliteRadius + 0.3, 100, 1);
	//材质
	let circleMater = new THREE.MeshBasicMaterial({
		color:0xffffff,
		side: THREE.DoubleSide
	})
	//网络模型对象 -- 卫星圆环
	let track = new THREE.Mesh(circleGeometry,circleMater);
	//卫星图片
	let satellite = new THREE.Sprite(new THREE.SpriteMaterial({
		map: new THREE.TextureLoader().load(sadImgSrc),
		blending: THREE.AdditiveBlending
	}));
	//卫星大小
	satellite.scale.x = satellite.scale.y = satellite.scale.z = 12;
	//卫星旋转半径
	satellite.position.set(satelliteRadius, 0, 0);
	//3d模型
	let pivotPoint = new THREE.Object3D();
	pivotPoint.add(satellite);
	pivotPoint.add(track);
	//卫星中心模型添加卫星对象
	centerMesh.add(pivotPoint);
	centerMesh.rotation.set(rotation.x, rotation.y, rotation.z);
	//添加到场景中
	this.scene.add(centerMesh);
	//添加卫星
	this.satellites.push({satellite:centerMesh, speed:speed, address:rotation});
}

  1. 创建控制器
let controls = new OrbitControls(this.camera, this.renderer.domElement);
controls.enableDamping = true;  //开启衰弱
controls.maxZoom = Infinity;
controls.minDistance = 75;   //设置最小可缩放
this.controls = controls;
  1. 创建渲染器
letelement = document.getElementById("home3dMap");
//创建渲染器
let renderer = new THREE.WebGLRenderer({
	antialias:true,  //开启抗锯齿
	alpha:true,
})
let areaSize = this.areaSize;
renderer.setSize(areaSize.width,areaSize.height)   //设置渲染区域尺寸
renderer.shadowMap.enabled = true;   //显示阴影
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
renderer.setClearColor(0x3f3f3f, 0);   //设置背景颜色
this.renderer = renderer;
element.appendChild(this.renderer.domElement)

6 渲染

this.controls.update();  //控制阻尼器
//地球自传
this.meshMaterial.rotation.y += 0.0015;
this.renderer.render(this.scene, this.camera);
//卫星轨迹转动
for(let i=0; i<this.map.circleLonLat.length; i++){
	this.map.circleLonLat[i].rotation.y += 0.0015;
}
requestAnimationFrame(this.animate.bind(this));

完整代码

<template>
	<div class="home3dMap" id="home3dMap">
		
	</div>
</template>

<script>
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
export default {
	name:"home3dMap",
	data(){
		return {
			scene:null,		//场景
			camera:null,   //相机
			meshMaterial:null,  //网络模型
			controls:null,  //控制器
			renderer:null,  //渲染器
			satellites:[],   //卫星(数组) 
		}
	},
	components:{},
	created(){
		
	},
	beforeDestroy(){
		
	},
	mounted(){
		//初始化
		this.init();
	},
	methods:{
		init(){
			this.createScene();   //创建场景
			this.createLight();   //创建光源
			this.createCamera();  //创建相机
			this.createMesh();    //创建几何体
			this.createRender();  //创建渲染器
			this.createControls();   //创建轨道控制器

			this.animate();
		},
		
		//创建场景
		createScene(){
			let scene = new THREE.Scene();
			// scene.background = new THREE.Color( 0xa0a0a0 );
			this.scene = scene;
		},

		//创建光源
		createLight(){
			// 环境光
			const ambientLight = new THREE.AmbientLight(0xcccccc, 2)
			this.scene.add(ambientLight)
			// 平行光
			let directionalLight = new THREE.DirectionalLight(0xffffff, 0.2)
			directionalLight.position.set(1, 0.2, 0).normalize()
			// 平行光2
			let directionalLight2 = new THREE.DirectionalLight(0xff2ffff, 0.2)
			directionalLight2.position.set(1, 0.2, 0.1).normalize()
			this.scene.add(directionalLight)
			this.scene.add(directionalLight2)
			// 半球光
			let hemiLight = new THREE.HemisphereLight(0xffffff, 0x444444, 0.2)
			hemiLight.position.set(5, 50, 0)
			// this.scene.add(hemiLight)
			// 平行光3
			let directionalLight3 = new THREE.DirectionalLight(0xffffff, 0)
			// directionalLight3.position.set(1, 50, -2)
			// 开启阴影
			directionalLight3.castShadow = true
			// 设置光边界
			// directionalLight3.shadow.camera.top = 18
			// directionalLight3.shadow.camera.bottom = -10
			// directionalLight3.shadow.camera.left = -52
			// directionalLight3.shadow.camera.right = 12
			this.scene.add(directionalLight3)
		},
		
		//创建相机
		createCamera(){
			//渲染区域  宽高为  960/685
			let camera = new THREE.PerspectiveCamera(60, 960 / 685, 1, 10000)
			//设置相机位置
			camera.position.set(50, -10, 200)
			//设置相机方向
			camera.lookAt(0, 0, 0)
			this.camera = camera;
			this.scene.add(this.camera);
		},
		
		//创建几何体
		createMesh(){
			
			//地球
			let geometry = new THREE.SphereGeometry( 70, 32, 16);
			let earthImgSrc = require('@/assets/img/home/home3dMapBackground.png');
			//材质
			let earthMater = new THREE.MeshPhongMaterial({
				map: new THREE.TextureLoader().load(earthImgSrc),
				transparent:true,
				depthWrite:false,
			});
			//网络模型对象 -- 地球
			let meshMaterial = new THREE.Mesh(geometry,earthMater);
			
			//地球模型
			this.meshMaterial = meshMaterial;
			
			//添加到场景中
			this.scene.add(meshMaterial);
			
			//添加圆环
			this.initSatellite(meshMaterial);
			
		},
		
		//添加圆环
		initSatellite(meshMaterial){
			//返回一个卫星和轨道的组合体
			// satelliteSize/卫星大小   satelliteRadius/卫星旋转半径   rotation	/组合体的旋转方向     speed/卫星运动速度
			
			// 圆环图片
			let sadImgSrc = require('@/assets/img/control/satellite.png');
			
			//循环卫星   假设有3颗卫星
			for(let i=0; i<3; i++){
				let satelliteSize = 12,satelliteRadius=0,rotation={x:0,y:0,z:0},speed=0;
				
				if(i==0){
					satelliteRadius = 80;
					rotation.x = -Math.PI * 0.35;
					rotation.y = Math.PI * 0.25;
					rotation.z = 0;
					speed = 0.004;
				}else if(i==1){
					satelliteRadius =100;
					rotation.x = -Math.PI * 0.35;
					rotation.y = -Math.PI * 0.2;
					rotation.z = 0;
					speed = 0.005;
				}else{
					satelliteRadius = 86;
					rotation.x = -Math.PI * 0.25;
					rotation.y = Math.PI * 0.15;
					rotation.z = 0;
					speed = 0.003;
				}
				
				//卫星中心
				let earthGeometry = new THREE.SphereGeometry(0,0,0); 
				//材质
				let earthMater = new THREE.MeshPhongMaterial({
					color:0xa0a0a0,
				});
				let centerMesh = new THREE.Mesh(earthGeometry,earthMater);
				
				//卫星圆环
				let circleGeometry = new THREE.RingGeometry(satelliteRadius, satelliteRadius + 0.3, 100, 1);
				//材质
				let circleMater = new THREE.MeshBasicMaterial({
					color:0xffffff,
					side: THREE.DoubleSide
				})
				//网络模型对象 -- 卫星圆环
				let track = new THREE.Mesh(circleGeometry,circleMater);
				
				let satellite = new THREE.Sprite(new THREE.SpriteMaterial({
					map: new THREE.TextureLoader().load(sadImgSrc),
					blending: THREE.AdditiveBlending
				}));
				
				//卫星大小
				satellite.scale.x = satellite.scale.y = satellite.scale.z = 12;
				//卫星旋转半径
				satellite.position.set(satelliteRadius, 0, 0);
				
				let pivotPoint = new THREE.Object3D();
				pivotPoint.add(satellite);
				pivotPoint.add(track);
				//卫星中心模型添加卫星对象
				centerMesh.add(pivotPoint);
				
				centerMesh.rotation.set(rotation.x, rotation.y, rotation.z);
				
				//添加到场景中
				this.scene.add(centerMesh);
				
				//添加卫星
				this.satellites.push({satellite:centerMesh, speed:speed, address:rotation});
			}
		},
		
		//发光的星星
		generateSprite(color){
			let canvas = document.createElement('canvas');
			canvas.width = 16;
			canvas.height = 16;
			let context = canvas.getContext('2d');
			let gradient = context.createRadialGradient(canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, canvas.height / 2, canvas.width / 2);
			gradient.addColorStop(0, 'rgba(' + color + ',1)');
			gradient.addColorStop(0.2, 'rgba(' + color + ',1)');
			gradient.addColorStop(0.4, 'rgba(' + color + ',.6)');
			gradient.addColorStop(1, 'rgba(0,0,0,0)');
			context.fillStyle = gradient;
			context.fillRect(0, 0, canvas.width, canvas.height);
			return canvas;
   		 },
		
		//创建渲染器
		createRender(){
			let element = document.getElementById("home3dMap");
			//创建渲染器
			let renderer = new THREE.WebGLRenderer({antialias:true, alpha:true})
			renderer.setSize(960,685)   //设置渲染区域尺寸
			renderer.shadowMap.enabled = true;   //显示阴影
			renderer.shadowMap.type = THREE.PCFSoftShadowMap;
			renderer.setClearColor(0x3f3f3f, 0);   //设置背景颜色
			
			this.renderer = renderer;
						
			element.appendChild(this.renderer.domElement)
		},
		
		//创建轨道控制器
		createControls(){
			let controls = new OrbitControls(this.camera, this.renderer.domElement);
			controls.enableDamping = true;
			controls.maxZoom = Infinity;
			this.controls = controls;
			
		},
		
		//循环
		animate(){
			this.controls.update();  //控制阻尼器
			//地球自传
			this.meshMaterial.rotation.y += 0.0015;
			this.renderer.render(this.scene, this.camera);

			for(let i=0; i<this.satellites.length; i++){
				this.satellites[i].satellite.rotation.z -= this.satellites[i].speed;
			}
			
			requestAnimationFrame(this.animate.bind(this));
		},
		
	},
}
</script>

<style>
	.home3dMap{
		width:100%;
		height:100%;
	}
</style>

3d 地球与卫星绕地飞行,threejs,3d文章来源地址https://www.toymoban.com/news/detail-628610.html

到了这里,关于3d 地球与卫星绕地飞行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ThreeJS——在3D地球上标记中国地图板块

    地球预览视频效果 TweenJS (动画库)用来做相机转场的动画 Jquery (这里只用到一个 each 循环方法,可以使用 js 去写) ThreeJS (3D 地球制作) 100000.json (全国城市经纬度) d3.v6.js 用来设置平面转3D效果(本来考虑做成3D的中国地图板块,最后因效果看起来比较美观还是考虑用线条嵌入球体

    2024年02月12日
    浏览(40)
  • threeJs实现3D地球-旋转-自定义贴图-透明发光

    //---html (angular)---         //---ts--- 效果图:

    2024年04月17日
    浏览(41)
  • 基于threejs开发的3D地球大屏可视化,支持2D地图模式,飞线,涟漪,配置简单易上手

    基于threejs 封装的3D可视化地球组件,开箱即用 主要实现功能 根据geojson格式的json文件,渲染平面2D 和3D地图,地图可配置区域色,边界色 支持以贴图的方式实现用户设计的个性化地图图片的3D地球渲染(2D的支持正在开发) 通过本组件提供的方法可实现 新增飞线动画 和 标记

    2024年02月08日
    浏览(65)
  • 中巴地球资源(CBERS)卫星系列介绍

    CBERS (China-Brazil Earth Resources Satellite)是我国的CAST(中国空间技术研究院)和巴西的INPE(巴西国家太空研究院)之间的合作计划(两国政府关于开发和运行两颗卫星的协议)。该计划于1988年7月签署,旨在建立一个完整的遥感系统(空间和地面部分),为两国提供多光谱遥感图

    2024年02月05日
    浏览(19)
  • echarts实现3D地球模式--3D线

    前言:基于echarts实现3D地球自动旋转展示及不同坐标点相互连线 这里主体基于echarts,需引入依赖资源 echarts.min.js,echarts-gl.min.js 效果如下: 代码如下: 依赖资源 HTML CSS JS 贴图奉上 echarts官方文档地址:https://echarts.apache.org/zh/index.html 简单记录如有问题或更优解还请不要吝啬

    2024年02月04日
    浏览(50)
  • 3d地球散点图加路径lines3D的实现,带有散点即路径的立体地球

    效果图:  安装 npm install echarts echarts-gl 代码  问题 散点图使用的是scatter3D,可以看到文字不是贴合在地球表面,某些角度文字会被遮挡(对此没有要求的话,到这里就行了)。尝试了几种方案最终解决问题,以下是散点图贴合地球表面的做法 效果图: 安装 npm install echarts echart

    2024年02月09日
    浏览(32)
  • 【案例】3D地球

    效果图: 直接放源码 采用的技术为百度地图“卫星图”

    2024年02月05日
    浏览(46)
  • Echarts 3d地球实现(Vue框架)

    最近迷上了echarts实现数据可视化了,也确实因为工作需要,目前公司需要我们来在自己的新厂房展厅把自己的产品展示出来,我所在研发部软件组,第一个想到的就是使用echarts来实现一个数据可视化的大屏了,下面就带着大家看看我这段时间使用Echarts来实现一个3D地球的过

    2024年04月25日
    浏览(26)
  • 【案例】3D地球(vue+three.js)

    需要下载插件 有人找不到合适的地球平面图的话,可直接地球平面图

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包