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实现模拟河流,水面水流,水管水流,海面
4321 0
Threejs实现模拟河流,水面水流,水管水流,海面
|
4月前
|
自然语言处理 测试技术 API
动动嘴就能编程!阿里云千问Qwen3.5-Omni发布:全模态全球最强,支持113种语言,免费体验
阿里云发布全模态大模型Qwen3.5-Omni官网:https://t.aliyun.com/U/JbblVp 测试全球第一,支持113种语言识别与36种语音合成,首创“音视频Vibe Coding”——对镜头口述需求即可生成APP/网页/游戏代码。免费开放体验,开发者可通过阿里云百炼调用API。
3014 2
Threejs用切线实现模型沿着轨道行驶
这篇文章详细介绍了如何使用Three.js让一个模型沿着预定的曲线路径移动,并保持模型的方向始终沿着路径的切线方向,提供了实现这一效果的具体代码和步骤。
1096 1
Threejs用切线实现模型沿着轨道行驶
|
算法 数据挖掘 调度
【调度算法】NSGA III(1)
【调度算法】NSGA III
2839 0
Threejs中导入GLTF模型克隆后合并
这篇文章详细说明了在Three.js中如何导入GLTF模型,对其进行克隆,并将多个克隆模型合并成一个整体模型的过程。
849 2
Threejs中导入GLTF模型克隆后合并
|
NoSQL 安全 Linux
Redis 从入门到精通之内存和CPU配置优化
Redis 是一种基于内存的数据存储系统,因此内存的规划是非常重要的。在配置 Redis 内存时,应该避免物理内存使用过量导致大量使用 Swap,同时需要考虑内存碎片的问题。根据多年的经验整理了一些建议
1584 107
|
人工智能 编解码 算法
全球顶级赛事实践:视频云制播在奥运赛事的关键技术与创新
本次分享主题为“全球顶级赛事实践:视频云制播在奥运等体育赛事的关键技术与创新”。内容涵盖视频云制播的整体技术框架、AI技术重构体育赛事全链路、视频云制播+AI的技术创新与应用、未来展望,以及央视频在奥运等赛事中的成功实践。通过阿里云和央视频的合作,展示了多语种解说、多视角同步、智能媒资管理等技术创新,提升了观众的观赛体验,并推动了体育赛事转播的智能化发展。
1005 0
|
人工智能 算法 数据挖掘
简述k-means算法基本原理,并针对如何自适应确定k值
简述k-means算法基本原理,并针对如何自适应确定k值
927 0
简述k-means算法基本原理,并针对如何自适应确定k值
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
3126 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
存储 算法 机器人
Threejs路径规划_基于A*算法案例V2
这篇文章详细介绍了如何在Three.js中使用A*算法进行高效的路径规划,并通过三维物理电路的实例演示了路径计算和优化的过程。
681 0

热门文章

最新文章