Threejs学习笔记-三

简介: 精灵例子和精灵贴图的简单使用

精灵例子是面向屏幕的半透明对象,通常含有半透明的纹理,而且始终面向屏幕,基于这个特性,我们可以实现简单的小功能
首先是下雨的小示例
F3417EEF-E72F-41C9-BDE9-916CB8EB8F50.png
具体代码如下

import React, { Component } from 'react'
import grass from './grass.png'
import rain from './rain.png'
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
export default class indexTwo extends Component {
componentDidMount () {
  const scene = new THREE.Scene();
  /**
   * 创建一个地面
   */
  const geometry = new THREE.PlaneGeometry(1000, 1000);
  //加载草地纹理
  const texture = new THREE.TextureLoader().load(grass);
  texture.wrapS = THREE.RepeatWrapping;
  texture.wrapT = THREE.RepeatWrapping;
  //uv两个方向纹理重复数量
  texture.repeat.set(10, 10);
  const material = new THREE.MeshLambertMaterial({
    map: texture,
    side: THREE.DoubleSide
  });
  const mesh = new THREE.Mesh(geometry, material);
  scene.add(mesh);
  mesh.rotateX(-Math.PI / 2);
  /**
   * 精灵模型创建下雨效果
   */
  //加载雨滴纹理贴图
  const textureTree = new THREE.TextureLoader().load(rain);
  //创建一个组表示所有的雨滴
  const group = new THREE.Group();
  const spriteMaterial = new THREE.SpriteMaterial({
      map: textureTree
    });
  //批量创建雨滴的精灵模型
  for (let i = 0; i < 2000; i++) {
    //创建精灵模型对象
    const sprite = new THREE.Sprite(spriteMaterial);
    group.add(sprite);
    //控制精灵大小
    sprite.scale.set(8, 10, 1);//只需要设置x,y,两个变量
    const k1 = Math.random() - 0.5;
    const k2 = Math.random() - 0.5;
    //设置精灵模型位置
    sprite.position.set(1000 * k1, 300 * Math.random(), 1000 * k2);
  }
  scene.add(group);
  /**
   * 光源设置
   */
  //点光源
  const point = new THREE.PointLight(0xffffff);
  point.position.set(400, 200, 300);
  scene.add(point);

  const ambient = new THREE.AmbientLight(0x888888);
  scene.add(ambient);
  /**
   * 透视投影相机设置
   */
  const width = window.innerWidth;
  const height = window.innerHeight;
  const camera = new THREE.PerspectiveCamera(60, width / height, 1, 2000);
  camera.position.set(292, 109, 268);
  camera.lookAt(scene.position);
  /**
   * 创建渲染器对象
   */
  const renderer = new THREE.WebGLRenderer();
  renderer.setSize(width, height);
  document.getElementById("rain").appendChild(renderer.domElement);

  function render () {
    //每次雨滴的y坐标减去2,模拟不断落地的效果
    //当group里面的某个雨滴落地时,立刻将其y坐标设置为300
    group.children.forEach(sprite => {
      sprite.position.y -= 2;
      if (sprite.position.y < 0) {
        sprite.position.y = 300;
      }
    });
    renderer.render(scene, camera);
    requestAnimationFrame(render);
  }
  render();
  new OrbitControls(camera, renderer.domElement);
}
render () {
  return (
    <div>
      <div id="rain" />
    </div>
  )
}
}

代码并不复杂,创建好精灵材质,然后循环创建多个精灵粒子,这里的精灵材质我只创建了一个对象,可以让所有的粒子共用一个材质,这样做的好处是避免创建过多的材质对象,减少内存消耗,此外,当你尝试交互改变某个材质的时候,所有的使用这个材质的对象都会受到影响。
沿着这样的思路,我们还可以创建别的效果,例如树林效果
F8AF8D5D-FED7-48AA-80F9-ED950DA1C723.png
思路同上。
最后,和图表结合,一般来讲,精灵例子很多时候在三维场景里面是作为标签使用的,我们可以将其与Echarts结合,Echarts有个getDataURL方法,可以获取图表的图片,我们可以将其作为精灵粒子的纹理贴图,然后和三维模型结合展示在一起。
效果如下,这个学习笔记所有的代码可以去 https://gitee.com/feng-pan/threejs-demo 获取。
EC5D3945-E7FD-40B0-B1D2-E1BF30A915AE.png

相关文章
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
3475 0
Threejs实现模拟河流,水面水流,水管水流,海面
|
2月前
|
人工智能 供应链 数据可视化
数字孪生智慧园区管理平台,三维可视化系统,沃思智能
智慧园区加速发展,2025年全球市场规模将超3000亿美元。依托物联网、AI等技术,管理系统实现安防、能源、空间等全链条智能化,推动园区从“物业服务”向“数据运营”转型,助力产城融合与绿色发展。(238字)
442 138
|
Web App开发 运维 监控
物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课
物联网相比这些年来,大家都了解很多了,直白的讲,就是万物互联,万物上网。那么这里的物联网3D就是指通过三维可视化的方式展现物联网监控设备。对设备的位置信息,状态信息能一目了然。面向IT设施和资源的一体化综合监控与远程操控方式。通过三维可视化方式展现,解决监控资源繁多、开源工具使用复杂、问题定位困难等问题。
1151 0
物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课
|
存储 开发框架 JavaScript
Threejs中三维物体和HTML的爱恨情仇:CSS2DRenderer
【8月更文挑战第7天】Threejs中三维物体和HTML的爱恨情仇:CSS2DRenderer
1478 4
Threejs中三维物体和HTML的爱恨情仇:CSS2DRenderer
|
存储 JavaScript 前端开发
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
该文章深入探讨了Vue3中Composition API的关键特性,包括`ref`、`toRef`、`toRefs`的使用方法与场景,以及它们如何帮助开发者更好地管理组件状态和促进逻辑复用。
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
Threejs中导入GLTF模型克隆后合并
这篇文章详细说明了在Three.js中如何导入GLTF模型,对其进行克隆,并将多个克隆模型合并成一个整体模型的过程。
539 2
Threejs中导入GLTF模型克隆后合并
|
数据可视化 物联网 程序员
使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课(炫酷版一)
3d建筑,3d消防,消防演习模拟,3d库房,3d档案室,3d密集架,webGL,threejs,3d机房,bim管理系统
6124 0
|
前端开发
css3超酷tab选项卡式页面切换特效
这是一款效果不错的Tab选项卡式css3全屏页面切换特效。该特效使用CSS Transitions和:target伪类完成。
ThreeJs控制模型的隐藏与显示
这篇文章讲解了如何在Three.js中通过代码控制3D模型的显示与隐藏状态。
255 3
ThreeJs控制模型的隐藏与显示
|
API
【threejs教程】threejs中的边边角角:几何体详解
【8月更文挑战第6天】threejs中的几何体详解
590 4
【threejs教程】threejs中的边边角角:几何体详解