dw做网站有雪花效果,建站优化收费,深圳移动端网站建设模板,推广网站挣钱#x1f468;⚕️ 主页#xff1a; gis分享者 #x1f468;⚕️ 感谢各位大佬 点赞#x1f44d; 收藏⭐ 留言#x1f4dd; 加关注✅! #x1f468;⚕️ 收录于专栏#xff1a;threejs gis工程师 文章目录 一、#x1f340;前言1.1 ☘️Texture 贴图 二、#x1…⚕️ 主页 gis分享者 ⚕️ 感谢各位大佬 点赞 收藏⭐ 留言 加关注✅! ⚕️ 收录于专栏threejs gis工程师 文章目录 一、前言1.1 ☘️Texture 贴图 二、使用canvas更新纹理1. ☘️实现思路2. ☘️代码样例 一、前言
本文详细介绍如何基于threejs在三维场景中使用canvas更新纹理亲测可用。希望能帮助到您。一起学习加油加油
1.1 ☘️Texture 贴图
创建一个纹理贴图将其应用到一个表面或者作为反射/折射贴图。 构造函数 Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) 常用属性 方法
二、使用canvas更新纹理
1. ☘️实现思路
1、初始化renderer渲染器2、初始化Scene三维场景scene创建THREE.CubeTextureLoader立方体纹理加载器cubeTextureLoader加载cubeTextureLoader的六个方位的图片获取纹理对象cubeTexturescene背景background设置为cubeTexture。3、创建id为‘surface’的canvas页面元素火焰然后动画并执行。具体实现参考下面代码样例。4、初始化camera相机定义相机位置 camera.position.set5、初始化THREE.AmbientLight环境光源scene场景加入环境光源初始化THREE.DirectionalLight平行光源设置平行光源位置设置平行光源投影scene添加平行光源。6、加载几何模型创建THREE.AxesHelper坐标辅助工具helperscene场景中加入helper。创建THREE.BoxGeometry立方体几何体geometry创建THREE.MeshBasicMaterial基础材质materialmaterial设置map贴图为步骤3canvas元素、水平和垂直贴图包裹传入geometry和material创建THREE.Mesh网格对象scene中加入创建的网格对象。7、加入controls控制加入stats监控器监控帧数信息。
2. ☘️代码样例
!DOCTYPE html
html langen
headmeta charsetUTF-8titlelearn60(使用CANVAS更新纹理)/titlescript srclib/threejs/127/three.js-master/build/three.js/scriptscript srchttps://cdn.bootcss.com/jquery/3.3.1/jquery.min.js/scriptscript srclib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js/scriptscript srclib/threejs/127/three.js-master/examples/js/libs/stats.min.js/scriptscript srclib/threejs/127/three.js-master/examples/js/libs/dat.gui.min.js/scriptscript srclib/js/Detector.js/script
/head
style typetext/csshtml, body {margin: 0;height: 100%;}canvas {display: block;}#surface {position: fixed;left: 0;bottom: 0;}
/style
body onloaddraw()
canvas idsurface/canvas
/body
scriptvar renderer, camera, scene, gui, light, stats, controls//引入一个canvas动画function initCanvas() {$(document).ready(function () {// Set canvas drawing surfacevar space document.getElementById(surface)var surface space.getContext(2d)surface.scale(1, 1)// Set Particlesvar particles []var particle_count 150for (var i 0; i particle_count; i) {particles.push(new particle())}var time 0// Set wrapper and canvas items sizevar canvasWidth 480var canvasHeight 480$(.wrapper).css({width: canvasWidth, height: canvasHeight})$(#surface).css({width: canvasWidth, height: canvasHeight})// shim layer with setTimeout fallback from Paul Irishwindow.requestAnimFrame (function () {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||function (callback) {window.setTimeout(callback, 6000 / 60)}})()function particle() {this.speed {x: -1 Math.random() * 2, y: -5 Math.random() * 5}canvasWidth (document.getElementById(surface).width)canvasHeight (document.getElementById(surface).height)this.location {x: canvasWidth / 2, y: (canvasHeight / 2) 35}this.radius .5 Math.random() * 1this.life 10 Math.random() * 10this.death this.lifethis.r 255this.g Math.round(Math.random() * 155)this.b 0}function ParticleAnimation() {surface.globalCompositeOperation source-oversurface.fillStyle blacksurface.fillRect(0, 0, canvasWidth, canvasHeight)surface.globalCompositeOperation lighterfor (var i 0; i particles.length; i) {var p particles[i]surface.beginPath()p.opacity Math.round(p.death / p.life * 100) / 100var gradient surface.createRadialGradient(p.location.x, p.location.y, 0, p.location.x, p.location.y, p.radius)gradient.addColorStop(0, rgba( p.r , p.g , p.b , p.opacity ))gradient.addColorStop(0.5, rgba( p.r , p.g , p.b , p.opacity ))gradient.addColorStop(1, rgba( p.r , p.g , p.b , 0))surface.fillStyle gradientsurface.arc(p.location.x, p.location.y, p.radius, Math.PI * 2, false)surface.fill()p.death--p.radiusp.location.x (p.speed.x)p.location.y (p.speed.y)//regenerate particlesif (p.death 0 || p.radius 0) {//a brand new particle replacing the dead oneparticles[i] new particle()}}requestAnimFrame(ParticleAnimation)}ParticleAnimation()})}var initRender () {renderer new THREE.WebGLRenderer({antialias: true})renderer.setClearColor(0xeeeeee)renderer.setSize(window.innerWidth, window.innerHeight)renderer.shadowMap.enabled truerenderer.setPixelRatio(window.devicePixelRatio)document.body.appendChild(renderer.domElement)}var initCamera () {camera new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)camera.position.set(0, 0, 15)}var initScene () {var cubeTextureLoader new THREE.CubeTextureLoader()cubeTextureLoader.setPath(data/texture/skybox/space/)var cubeTexture cubeTextureLoader.load([right.jpg, left.jpg,top.jpg, bottom.jpg,front.jpg, back.jpg])scene new THREE.Scene()scene.background cubeTexture}var initLight () {scene.add(new THREE.AmbientLight(0x444444))light new THREE.DirectionalLight(0xffffff)light.position.set(0, 20, 20)light.castShadow truescene.add(light)}var initModel () {var helper new THREE.AxesHelper(50)scene.add(helper)var geometry new THREE.BoxBufferGeometry(5, 5, 5)var canvas $(#surface)[0]var texture new THREE.Texture(canvas)material new THREE.MeshBasicMaterial({map: texture})scene.add(new THREE.Mesh(geometry, material))}var initStats () {stats new Stats()document.body.appendChild(stats.dom)}var initControls () {controls new THREE.OrbitControls(camera, renderer.domElement)controls.enableDamping true}var render () {material.map.needsUpdate truerenderer.render(scene, camera)}var onWindowResize () {camera.aspect window.innerWidth / window.innerHeightcamera.updateProjectionMatrix()renderer.setSize(window.innerWidth, window.innerHeight)}var animate () {render()stats.update()controls.update()requestAnimationFrame(animate)}var draw () {if(!Detector.webgl)Detector.addGetWebGLMessage()initCanvas()initRender()initScene()initCamera()initLight()initModel()initStats()initControls()animate()window.onresize onWindowResize}
/script
/html效果如下