学习threejs,使用导入的模型生成粒子

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
    • [1.1 ☘️THREE.STLLoader STL模型加载器](#1.1 ☘️THREE.STLLoader STL模型加载器)
    • [1.2 ☘️THREE.Points 粒子云](#1.2 ☘️THREE.Points 粒子云)
    • [1.3 ☘️THREE.PointCloudMaterial 粒子云材质](#1.3 ☘️THREE.PointCloudMaterial 粒子云材质)
  • 二、🍀导入STereoLithography(.STL)格式的模型
    • [1. ☘️实现思路](#1. ☘️实现思路)
    • [2. ☘️代码样例](#2. ☘️代码样例)

一、🍀前言

本文详细介绍如何基于threejs在三维场景中使用导入的模型生成粒子,亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️THREE.STLLoader STL模型加载器

THREE.STLLoader用于加载和处理STereoLithography(.stl)格式3D模型文件的扩展。
STL三维文件:

STL(STereoLithography)是由3D Systems软件公司创立的文件格式,主要用于快速成型、3D打印和计算机辅助制造(CAM)。STL文件描述三维物体的表面几何形状,没有颜色、材质贴图或其他属性。STL格式有文字和二进制两种形式,二进制形式更常见。STL模型广泛应用于促进创新、降低成本、提高精度、推动教育和医疗进步等方面。

1.2 ☘️THREE.Points 粒子云

当我们大量使用粒子时,会很快遇到性能问题,导致页面卡顿,这是因为每添加一个粒子就是一个模型,因为每个粒子对象分别由THREE.js进行管理,所以,three.js提供了另一种方式来处理大量粒子,那就是使用THREE.Points。通过THREE.Points,three.js不再需要管理大量的单个粒子对象,而只需管理THREE.Points实例即可。

创建方法:

var cloud = new THREE.Points(geom, material);

geom:THREE.Geometry对象,用于创建粒子对象

material:THREE.PointCloudMaterial 粒子云材质

1.3 ☘️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:是否受场景的雾化影响。

二、🍀导入STereoLithography(.STL)格式的模型

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt。
  • 4、初始化THREE.AmbientLight环境光源,scene场景加入环境光源,初始化THREE.PointLight点光源,设置点光源位置,设置点光源投影,scene添加点光源。
  • 5、加载几何模型:创建THREE.AxesHelper坐标辅助工具,创建STLLoader加载器,调用load方法,在load回调中获取geometry集合体对象,创建THREE.Points对象,参入geometry和THREE.PointCloudMaterial材质对象,生成mesh模型物体,设置旋转、大小和位置。scene场景加入mesh和THREE.AxesHelper坐标辅助工具。具体实现方法参照代码样例。
  • 6、加入controls控制,加入stats监控器,监控帧数信息。

2. ☘️代码样例

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn43(使用导入的模型生成粒子)</title>
    <script src="lib/threejs/127/three.js-master/build/three.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/loaders/STLLoader.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/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 renderer
  var initRender = () => {
    renderer = new THREE.WebGLRenderer({antialias:true})
    renderer.setClearColor(0x000000)
    renderer.setSize(window.innerWidth, window.innerHeight)
    document.body.appendChild(renderer.domElement)
  }
  var scene
  var initScene = () => {
    scene = new THREE.Scene()
  }
  var camera
  var initCamera = () => {
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
    camera.position.set(0, 20, 25)
    camera.lookAt(new THREE.Vector3(0, 0, 0))
  }
  var light
  var initLight = () => {
    scene.add(new THREE.AmbientLight(0x444444))

    light = new THREE.PointLight(0xffffff)
    light.position.set(0, 50, 50)
    light.castShadow = true
    scene.add(light)
  }
  var initModel = () => {
    var helper = new THREE.AxesHelper(50)
    scene.add(helper)

    var loader = new THREE.STLLoader()
    loader.load('data/model/stl/SolidHead_2_lowPoly_42k.stl', geometry => {
      var material = new THREE.PointsMaterial({
        color: 0xffffff,
        size: 0.4,
        opacity: 0.6,
        transparent: true,
        blending: THREE.AdditiveBlending,
        depthTest: false,
        map: generateSprite()
      })
      var mesh = new THREE.Points(geometry, material)
      mesh.rotation.x = -0.5 * Math.PI //将模型摆正
      mesh.scale.set(0.1, 0.1, 0.1) //缩放
      geometry.center() //居中显示
      scene.add(mesh)
    })
  }
  var generateSprite = () => {
    var canvas = document.createElement('canvas');
    canvas.width = 16;
    canvas.height = 16;

    var context = canvas.getContext('2d')
    var gradient = context.createRadialGradient(canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, canvas.height / 2, canvas.width / 2)
    gradient.addColorStop(0, 'rgba(255,255,255,1)')
    gradient.addColorStop(0.2, 'rgba(0,255,255,1)')
    gradient.addColorStop(0.4, 'rgba(0,0,64,1)')
    gradient.addColorStop(1, 'rgba(0,0,0,1)')

    context.fillStyle = gradient
    context.fillRect(0, 0, canvas.width, canvas.height)

    var texture = new THREE.Texture(canvas)
    texture.needsUpdate = true
    return texture
  }
  var stats
  var initStats = () => {
    stats = new Stats()
    document.body.appendChild(stats.dom)
  }
  var controls
  var initControls = () => {
    controls = new THREE.OrbitControls(camera, renderer.domElement)
    controls.enableDamping = true
  }
  var render = () => {
    renderer.render(scene, camera)
  }
  var onWindowResize = () => {
    camera.aspect = window.innerWidth / window.innerHeight
    camera.updateProjectionMatrix()
    render()
    renderer.setSize(window.innerWidth, window.innerHeight)
  }
  var animate = () => {
    render()
    stats.update()
    controls.update()
    requestAnimationFrame(animate)
  }
  var draw = () => {
    initRender()
    initScene()
    initCamera()
    initLight()
    initStats()
    initControls()
    initModel()

    animate()
    window.onresize = onWindowResize
  }
</script>
</html>

效果如下:

相关推荐
gis分享者20 小时前
学习threejs,使用PointLight点光源
threejs·点光源·pointlight
gis分享者5 天前
学习threejs,使用HemisphereLight半球光
threejs·hemispherelight·半球光
gis分享者9 天前
学习threejs,使用Lensflare模拟镜头眩光
threejs·lensflare·眩光
gis分享者12 天前
学习threejs,tga格式图片文件贴图
threejs·贴图·tga·tgaloader
gis分享者13 天前
学习threejs,pvr格式图片文件贴图
threejs·贴图·pvr
gis分享者1 个月前
学习threejs,使用OrbitControls相机控制器
threejs·相机·相机控制器·orbitcontrols
不系舟1781 个月前
threejs 实现镜面反射,只反射指定物体,背景透明
threejs
gis分享者1 个月前
学习threejs,使用RollControls相机控制器
threejs·相机控制器·rollcontrols
gis分享者1 个月前
学习threejs,使用FlyControls相机控制器
threejs·相机控制器·flycontrols
gis分享者1 个月前
学习threejs,使用TrackballControls相机控制器
threejs·trackball·相机控制器