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

相关文章
|
JavaScript 前端开发
javascript中的switch用法
javascript中的switch用法
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
3822 0
Threejs实现模拟河流,水面水流,水管水流,海面
|
2月前
|
JSON Java 数据格式
Feign 复杂对象参数传递避坑指南:从报错到优雅落地
本文深入剖析了SpringCloud Feign在复杂对象参数传递中的常见问题及解决方案。文章首先分析了GET请求传递复杂对象失败的底层原因,包括HTTP规范约束和Feign参数解析逻辑。针对GET场景,提供了四种解决方案:@SpringQueryMap(首选)、手动拆分属性+@RequestParam、MultiValueMap封装和自定义FeignEncoder,详细比较了各方案的优缺点和适用场景。对于POST场景,推荐使用@RequestBody注解传递JSON请求体。
652 6
|
JavaScript 前端开发 Web App开发
带你读《Three. js开发指南: 基于WebGL和HTML5在网页上渲染 3D图形和动画(原书第3版)》之一:使用Three.js创建你的第一个三维场景
本书将介绍如何直在浏览器中创建漂亮的3D场景和动画,并且充分发挥WebGL和现代浏览器的潜能。首先介绍基本概念和基础组件,然后通过逐渐扩展示例代码逐步深讲解更多高级技术。在本书中读者将学到如何从外部加载3D模型和具有真实效果的材质纹理、学习使用Three.js提供的摄像机组件来实现在3D场景中飞行和走动、如何将HTML5视频和画布作为材质贴在3D模型表面。此外还将学习变形动画和骨骼动画,甚至还会涉及在场景中使用物理模拟的方法,例如重力、碰撞检测等等。
Threejs中导入GLTF模型克隆后合并
这篇文章详细说明了在Three.js中如何导入GLTF模型,对其进行克隆,并将多个克隆模型合并成一个整体模型的过程。
709 2
Threejs中导入GLTF模型克隆后合并
|
NoSQL 安全 Linux
Redis 从入门到精通之内存和CPU配置优化
Redis 是一种基于内存的数据存储系统,因此内存的规划是非常重要的。在配置 Redis 内存时,应该避免物理内存使用过量导致大量使用 Swap,同时需要考虑内存碎片的问题。根据多年的经验整理了一些建议
1506 98
|
JavaScript 前端开发
JavaScript Array map() 方法
JavaScript Array map() 方法
|
存储 算法 机器人
Threejs路径规划_基于A*算法案例V2
这篇文章详细介绍了如何在Three.js中使用A*算法进行高效的路径规划,并通过三维物理电路的实例演示了路径计算和优化的过程。
587 0
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
2820 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
安全 Linux 数据安全/隐私保护
Windows 部署 Elasticsearch + kibana 8.0 指南
Windows 部署 Elasticsearch + kibana 8.0 指南