【案例】3D地球(vue+three.js)

在这里插入图片描述

需要下载插件
在这里插入图片描述

<template>
    <div class="demo">
        <div id="container" ref="content"></div>
    </div>
</template>
<script>
import * as THREE from 'three';
// import mapJSON from '../map.json';
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
export default {
  // components :{  CoolEarth},
  data() {
    return {
      // 创建一个场景
      scene: null,
      // 创建一个相机
      camera: null,
      // 创建一个渲染器
      renderer: null,
      // 模型对象
      mesh: null,
      // 平面
      plane: null,
      // 点光源
      point: null,
      // step
      step: 0,
      controls: null,
      starsGeometry: null,
    }
  },
  mounted() {
    // this.Earth_3D();
    this.init();
  },
  methods: {
    // 初始化
    init() {
        // 初始化容器
        var content = this.$refs.content;
        // 创建一个场景
        this.scene = new THREE.Scene();
        
        
        this.scene.background = new THREE.Color("#000000");
//         const positions = [];
// var colors = [];
// var geometry = new THREE.BufferGeometry();
// for (var i = 0; i < 100; i ++) {
//   var vertex = new THREE.Vector3();
//   vertex.x = Math.random() * 2 - 1;
//   vertex.y = Math.random() * 2 - 1;
//   // vertex.z = Math.random() * 2 + 1;
//   positions.push( vertex.x, vertex.y, );
//   var color = new THREE.Color();
//   color.setHSL( Math.random() * 0.2 + 0.5, 0.55, Math.random() * 0.25 + 0.55 );
//   colors.push( color.r, color.g, color.b );
// }
// geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );
// geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) );

        // 创建几何体
        var geometry = new THREE.SphereGeometry(30, 50, 50);
        
        // // 纹理加载器 ( 此处加载贴图 )
        var texture = new THREE.TextureLoader().load(require('@/assets/earth3.jpg'));
        // 发光地球
        // let lightTexture = new THREE.TextureLoader().load("@/assets/earth.jpg");
        // let lightEarthGeometry = new THREE.SphereGeometry(53, 30, 28);
        // let lightEarthMaterial = new THREE.MeshBasicMaterial({
        //   map: lightTexture,
        //   alphaMap: lightTexture,
        //   blending: THREE.AdditiveBlending,
        //   transparent: true,
        // });

        // let lightEarth = new THREE.Mesh(lightEarthGeometry, lightEarthMaterial);
        // this.scene.add(lightEarth);
        
        //  光环
        // var huan = new THREE.TextureLoader().load( '@/assets/00.jpg' );
        // var spriteMaterial = new THREE.SpriteMaterial( {
        //   map: huan,
        //   transparent: true,
        //   opacity: 0.5,
        //   depthWrite: false
        // } );
        // var sprite = new THREE.Sprite( spriteMaterial );
        // sprite.scale.set( 5 * 3, 5 * 3, 1 );
        // this.scene.add( sprite );
        
        // 几何体材质对象
        var material = new THREE.MeshLambertMaterial({
            map: texture
        });
        // 创建网格模型对象
        this.mesh = new THREE.Mesh(geometry, material);
        //设置几何体位置
        this.mesh.position.x = 0;
        this.mesh.position.y = 10;
        this.mesh.position.z = 0;
        this.scene.add(this.mesh);

        // 创建点光源
        var point = new THREE.PointLight("#FFF");
        point.position.set(40, 200, 30);
        this.point = point;
        this.scene.add(point);

        const sphereSize = 10;
        const pointLightHelper = new THREE.PointLightHelper(point, sphereSize);
        this.scene.add(pointLightHelper);
        //创建环境光
        var ambient = new THREE.AmbientLight(0x444444);
        this.scene.add(ambient);

        // 创建一个相机
        this.camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1,  1000 );
        this.camera.position.set(100, 100, 50);
        this.camera.lookAt(0, 0, 0);

        // // 坐标轴辅助器,X,Y,Z长度30
        // var axes = new THREE.AxesHelper(300);
        // this.scene.add(axes);
        // // // 辅助网格
        // let gridHelper = new THREE.GridHelper(100, 100);
        // this.scene.add(gridHelper);

        // 创建渲染器
        this.renderer = new THREE.WebGLRenderer();
        this.renderer.setSize(window.innerWidth, window.innerHeight);
        this.renderer.setClearColor(0xb9d3ff, 1);
        //插入 dom 元素
        content.appendChild(this.renderer.domElement);
        console.log("1111",OrbitControls)
        this.controls = new OrbitControls(this.camera, this.renderer.domElement);
        
        this.controls.addEventListener("resize", this.render(), false);

        this.createLight();
        
    },

    render() {
        this.renderer.render(this.scene, this.camera);
        // 自动旋转动画
        this.mesh.rotateY(0.002);
        requestAnimationFrame(this.render);
    },
    // 创建灯光
    createLight() {
      this.light = new THREE.DirectionalLight({
        color: 'blue'
      })
      this.light.position.set(100, 100, 100)
      this.scene.add(this.light)
    },
    Earth_3D() {
      const scene = new THREE.Scene();
      const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
      const renderer = new THREE.WebGLRenderer();
      renderer.setSize( window.innerWidth, window.innerHeight );
      document.body.appendChild( renderer.domElement );
      const geometry = new THREE.BoxGeometry( 1,1,1 );
      const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
      const cube = new THREE.Mesh( geometry, material );
      scene.add( cube );

      camera.position.z = 5;

      function animate() {
        requestAnimationFrame( animate );
        renderer.render( scene, camera );
      }
      animate();
      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;

    },
  }
}
</script>
<style scoped>

</style>

有人找不到合适的地球平面图的话,可直接地球平面图

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VueThree.js是两个不同的技术,Vue是一个前端框架,而Three.js是一个基于WebGL的JavaScript库,用于创建3D图形。使用VueThree.js可以很方便地实现3D地图场景的展示。 在使用VueThree.js创建3D地图时,首先需要设置场景(Scene)、相机(Camera)、光源(Lighting)、对象(Object)等元素,并将它们组合在一起。可以使用Vue的组件化方式来构建这些元素,然后将它们添加到场景中。在设置相机时,需要考虑到相机的位置、方向、FoV等参数,以便实现视角的变换和缩放等操作。 当创建好场景、相机、光源和对象后,可以使用Three.js提供的材质(Material)、纹理(Texture)、几何体(Geometry)等API,来实现对象的样式和效果。例如,可以使用纹理图片来为建筑物、地面等对象添加贴图效果,也可以使用材质来控制对象的表面和反射等特性。 除了基础的场景元素和对象设置外,还可以使用Three.js提供的控制器(Controller)来实现用户交互。例如,可以使用鼠标控制器(OrbitControls)来实现用户通过鼠标操作旋转和缩放场景,或使用触摸控制器(TouchControls)来实现在移动设备上的交互。 最后需要注意的是,3D地图的数据源通常比较大,需要进行优化和压缩。可以使用VueThree.js提供的工具和插件,来实现数据的处理和性能的优化。例如,可以使用Vue的懒加载和异步组件,来减少初始化时间和提高页面加载速度;也可以使用Three.js的GeometryUtils和TextureLoader等API,来优化数据加载和渲染性能。 总之,使用VueThree.js可以很方便地实现3D地图场景的展示,并且可以通过组件化与API的方式实现更加灵活和丰富的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值