学习threejs,THREE.PointCloud(新版本改名:THREE.Points)批量管理粒子
👨⚕️ 主页: gis分享者
👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨⚕️ 收录于专栏:threejs gis工程师
文章目录
- 一、🍀前言
- 1.1 ☘️THREE.PointCloud简介
- 1.11 ☘️THREE.PointCloudMaterial材质
- 二、🍀使用THREE.PointCloud(新版本改名THREE.Points)批量管理粒子
- 1. ☘️实现思路
- 2. ☘️代码样例
一、🍀前言
本文详细介绍如何基于threejs在三维场景中使用THREE.PointCloud(新版本改名:THREE.Points)批量管理粒子,亲测可用。希望能帮助到您。一起学习,加油!加油!
1.1 ☘️THREE.PointCloud简介
当我们大量使用粒子时,会很快遇到性能问题,导致页面卡顿,这是因为每添加一个粒子就是一个模型,因为每个粒子对象分别由THREE.js进行管理,所以,three.js提供了另一种方式来处理大量粒子,那就是使用THREE.PointCloud。通过THREE.PointCloud,three.js不再需要管理大量的单个粒子对象,而只需管理THREE.PointCloud实例即可。
创建方法:
var cloud = new THREE.PointCloud(geom, material);
geom:THREE.Geometry对象,用于创建粒子对象
material:THREE.PointCloudMaterial 粒子云材质
1.11 ☘️THREE.PointCloudMaterial材质
概念:
设置所有粒子的大小,颜色,顶点颜色,透明度,是否根据相机距离的远近改变大小等属性。
var material = new THREE.PointCloudMaterial({size: 4, vertexColors: true, color: 0xffffff});
属性:
color: PointCloud中所有的粒子的颜色都相同,除非设置了vertexColors且该几何体的colors属性不为空,才会使用colors颜色,否则都使用该属性。
map:在粒子上应用某种材质。
size:粒子的大小。
sizeAnnutation:false,无论相机的位置,所有的粒子大小一致;true,离相机近的粒子更大一些,离相机越远越小。
vetexColors:true,且该几何体的colors属性有值,则该粒子会舍弃第一个属性–color,而应用该几何体的colors属性的颜色。
opacity:粒子透明度。
transparent:是否透明。
blending:渲染粒子时的融合模式。
fog:是否受场景的雾化影响。
二、🍀使用THREE.PointCloud(新版本改名THREE.Points)批量管理粒子
1. ☘️实现思路
- 1、初始化renderer渲染器
- 2、初始化Scene三维场景
- 3、初始化camera相机,定义相机位置 camera.position.set
- 4、初始化THREE.AmbientLight环境光源,scene场景加入环境光源,初始化THREE.DirectionalLight平行光源,设置平行光源位置,scene添加平行光源。
- 5、加载几何模型:添加THREE.AxesHelper坐标辅助工具,创建11行11列THREE.Vector3矢量粒子对象以及对应的THREE.Color颜色,创建THREE.Geometry对象添加创建的THREE.Vector3矢量粒子对象和对应颜色,创建THREE.PointCloudMaterial粒子云材质对象。传入创建的THREE.Geometry和THREE.PointCloudMaterial作为参数,创建THREE.PointCloud粒子云对象,scene场景加入创建的THREE.PointCloud对象。
- 6、加入controls控制,加入stats监控器,监控帧数信息。
2. ☘️代码样例
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>learn28(使用THREE.PointCloud(新版本改名:THREE.Points)批量管理粒子)</title><script src="lib/threejs/91/three.js"></script><!--<script src="lib/threejs/127/three.js-master/build/three.js"></script>--><!--<script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script>--><script src="https://johnson2heng.github.io/three.js-demo/lib/js/controls/OrbitControls.js"></script><script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/stats.min.js"></script><script src="lib/threejs/127/three.js-master/examples/js/libs/dat.gui.min.js"></script>
</head>
<style>html, body {margin: 0;height: 100%;}canvas {display: block;}
</style>
<body onload="draw()">
</body>
<script>var renderervar initRender = () => {renderer = new THREE.WebGLRenderer({antialias: true})renderer.setSize(window.innerWidth, window.innerHeight)document.body.appendChild(renderer.domElement)}var scenevar initScene = () => {scene = new THREE.Scene()}var cameravar initCamera = () => {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000)camera.position.set(0, 0, 200)}var lightvar initLight = () => {scene.add(new THREE.AmbientLight(0x404040))light = new THREE.DirectionalLight(0xffffff)light.position.set(1, 1, 1)scene.add(light)}var initModel = () => {var helper = new THREE.AxesHelper(500)scene.add(helper)var geometry = new THREE.Geometry()var material = new THREE.PointCloudMaterial({size: 4, vertexColors: true, color: 0xffffff})for (var x = -5; x <= 5; x++) {for (var y = -5; y <= 5; y++) {var particle = new THREE.Vector3(x * 10, y * 10, 0)geometry.vertices.push(particle)geometry.colors.push(new THREE.Color(+randomColor()))}}var cloud = new THREE.PointCloud(geometry, material)scene.add(cloud)}var randomColor = () => {var arrHex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"],strHex = "0x",index;for (var i = 0; i < 6; i++) {index = Math.round(Math.random() * 15)strHex += arrHex[index]}return strHex}var statsvar initStats = () => {stats = new Stats()document.body.appendChild(stats.dom)}var controlsvar initControls = () => {controls = new THREE.OrbitControls(camera, renderer.domElement)controls.enableDamping = true}var render = () => {renderer.render(scene, camera)}var onWindowResize = () => {camera.aspect = window.innerWidth / window.innerHeightcamera.updateProjectionMatrix()render()renderer.setSize(window.innerWidth, window.innerHeight)}var animate = () => {render()stats.update()controls.update()requestAnimationFrame(animate)}var draw = () => {initRender()initScene()initCamera()initLight()initModel()initStats()initControls()animate()window.onresize = onWindowResize}
</script>
</html>
效果如下: