摘要:光暈效果必須設置主要的光線還是靠模擬設置光暈的范圍后記入門教程源碼地址原創不易,辛苦各位大大點個
閱讀本文章可以獲取到的知識
創建一個3d的空間
粒子效果
three.js點擊事件的處理
著色器的初步使用
實現一個光暈效果
1.創建一個3d的空間可以想象一下我們在房間內,房間是一個立方體,如果你有生活品味,可能會在房間內貼上壁紙,three.js可以很方便的創建一個立方體,并且給它的周圍貼上紋理,讓照相機在立方體之中,照相機可以360旋轉,就模擬了一個真實的場景。
轉換為代碼:const path = "assets/image/" const format = ".jpg" const urls = [ `${path}px${format}`, `${path}nx${format}`, `${path}py${format}`, `${path}ny${format}`, `${path}pz${format}`, `${path}nz${format}` ] const materials = [] urls.forEach(url => { const textureLoader = new TextureLoader() textureLoader.setCrossOrigin(this.crossOrigin) const texture = textureLoader.load(url) materials.push(new MeshBasicMaterial({ map: texture, overdraw: true, side: BackSide })) }) const cube = new Mesh(new CubeGeometry(9000, 9000, 9000), new MeshFaceMaterial(materials)) this.scene.add(cube)
CubeGeometry創建一個超大的立方體
MeshFaceMaterial給立方體貼上文理,由于視角是在立方體內部,所以side:BackSide
2.粒子效果一個3d模型是由點,線,面組成的,可以遍歷模型的每一個點,把每一個點轉換為幾何模型,并且給它貼上文理,拷貝每一個點的位置,用這些幾何模型重新構成一個只有點的模型,這就是粒子效果的基本原理。
this.points = new Group() const vertices = [] let point const texture = new TextureLoader().load("assets/image/dot.png") geometry.vertices.forEach((o, i) => { // 記錄每個點的位置 vertices.push(o.clone()) const _geometry = new Geometry() // 拿到當前點的位置 const pos = vertices[i] _geometry.vertices.push(new Vector3()) const color = new Color() color.r = Math.abs(Math.random() * 10) color.g = Math.abs(Math.random() * 10) color.b = Math.abs(Math.random() * 10) const material = new PointsMaterial({ color, size: Math.random() * 4 + 2, map: texture, blending: AddEquation, depthTest: false, transparent: true }) point = new Points(_geometry, material) point.position.copy(pos) this.points.add(point) }) return this.points
new Group創建一個群,可以說是粒子的集合
通過point.position.copy(pos)設置粒子和位置,坐標和模型中對應點的位置相同
3.點擊事件的處理three.js的點擊事件需要借助光線投射器(Raycaster),為了方便理解,請先看一張圖:
Raycaster發射一個射線,intersectObject監測射線命中的物體
this.raycaster = new Raycaster() // 把你要監聽點擊事件的物體用數組儲存起來 this.seats.push(seat) onTouchStart(event) { event.preventDefault() event.clientX = event.touches[0].clientX; event.clientY = event.touches[0].clientY; this.onClick(event) } onClick(event) { const mouse = new Vector2() mouse.x = ( event.clientX / this.renderer.domElement.clientWidth ) * 2 - 1 mouse.y = - ( event.clientY / this.renderer.domElement.clientHeight ) * 2 + 1; this.raycaster.setFromCamera(mouse, this.camera) // 檢測命中的座位 const intersects = this.raycaster.intersectObjects(this.seats) if (intersects.length > 0) { intersects[0].object.material = new MeshLambertMaterial({ color: 0xff0000 }) } }
intersects.length > 0 表示射線命中了某個幾何體
偷懶只實現了移動端的點擊實現,如果想看pc怎么實現,請看thee.js官網
4.著色器的初步使用著色器分為頂點著色器和片元著色器,用GLSL語言編寫,是一種和GPU溝通的的語言,這里只講如何使用
const vertext = ` void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); } ` const fragment = ` uniform vec2 resolution; uniform float time; vec2 rand(vec2 pos) { return fract( 0.00005 * (pow(pos+2.0, pos.yx + 1.0) * 22222.0)); } vec2 rand2(vec2 pos) { return rand(rand(pos)); } float softnoise(vec2 pos, float scale) { vec2 smplpos = pos * scale; float c0 = rand2((floor(smplpos) + vec2(0.0, 0.0)) / scale).x; float c1 = rand2((floor(smplpos) + vec2(1.0, 0.0)) / scale).x; float c2 = rand2((floor(smplpos) + vec2(0.0, 1.0)) / scale).x; float c3 = rand2((floor(smplpos) + vec2(1.0, 1.0)) / scale).x; vec2 a = fract(smplpos); return mix( mix(c0, c1, smoothstep(0.0, 1.0, a.x)), mix(c2, c3, smoothstep(0.0, 1.0, a.x)), smoothstep(0.0, 1.0, a.y)); } void main(void) { vec2 pos = gl_FragCoord.xy / resolution.y; pos.x += time * 0.1; float color = 0.0; float s = 1.0; for(int i = 0; i < 8; i++) { color += softnoise(pos+vec2(i)*0.02, s * 4.0) / s / 2.0; s *= 2.0; } gl_FragColor = vec4(color); } ` // 設置物體的質材為著色器質材 let material = new ShaderMaterial({ uniforms: uniforms, vertexShader: vertext, fragmentShader: fragment, transparent: true, })5.光暈效果
由于是模擬電影院,我想做一個投影儀,模擬投影儀射出的光線。
// 光暈效果必須設置alpha = true const renderer = this.renderer = new WebGLRenderer({alpha: true, antialias: true}) let textureFlare = new TextureLoader().load("assets/image/lensflare0.png") let textureFlare3 = new TextureLoader().load("assets/image/lensflare3.png") let flareColor = new Color(0xffffff) let lensFlare = new LensFlare(textureFlare, 150, 0.0 , AdditiveBlending, flareColor) lensFlare.add(textureFlare3, 60, 0.6, AdditiveBlending); lensFlare.add(textureFlare3, 70, 0.7, AdditiveBlending); lensFlare.add(textureFlare3, 120, 0.9, AdditiveBlending); lensFlare.add(textureFlare3, 70, 1.0, AdditiveBlending); lensFlare.position.set(0, 150, -85)
主要的光線還是靠lensflare0.png模擬
textureFlare3設置光暈的范圍
后記:入門教程
源碼地址
原創不易,辛苦各位大大點個star
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92206.html
摘要:庫一個用來在中創建炫酷的浮動粒子的庫一個用來在中創建物體和空間的庫快速實現全屏滾動特性打字機效果滾動到某個元素位置時觸發一個功能語法高亮使用創建漂亮的圖表能夠明顯加速網站加載時間,鼠標時預加載資源另一個圖表庫一個基于動畫和平移的雪碧圖庫實現 Javascript 庫 Particles.js? 一個用來在 web 中創建炫酷的浮動粒子的庫 Three.js? 一個用來在 web 中創...
摘要:是一個基于的地球數據可視化的開源組件庫。地址中文官網在線例子為什么要開發使用這個庫的開發是受到大會上的項目世界武器販賣可視化的啟發,該項目開發者是員工。 在這里和大家分享一個和小伙伴們一起開發的開源庫 Gio.js 。Gio.js 是一個基于 Three.js 的 web 3D 地球數據可視化的開源組件庫。使用 Gio.js 的網頁應用開發者,可以快速地以申明的方式創建自定義的 Web...
摘要:調用百度實現圖像識別使用渲染導出的制作的超級炫酷的三維模型一個代碼庫本人本人瀏覽器調試及所有錯誤代碼整合千峰超級好用的各種開發自學文檔這是它對應的學習視頻使用教程詳細虛擬機安裝系統詳解版網易開源鏡像站在線數據互轉使 1.Java調用百度API實現圖像識別 2.使用Three.js渲染Sketchup導出的dae 3.three.js制作的超級炫酷的三維模型 4.three.js - 一...
摘要:調用百度實現圖像識別使用渲染導出的制作的超級炫酷的三維模型一個代碼庫本人本人瀏覽器調試及所有錯誤代碼整合千峰超級好用的各種開發自學文檔這是它對應的學習視頻使用教程詳細虛擬機安裝系統詳解版網易開源鏡像站在線數據互轉使 1.Java調用百度API實現圖像識別 2.使用Three.js渲染Sketchup導出的dae 3.three.js制作的超級炫酷的三維模型 4.three.js - 一...
閱讀 3521·2021-11-18 10:02
閱讀 952·2021-09-04 16:48
閱讀 2039·2019-08-30 15:55
閱讀 3540·2019-08-30 15:52
閱讀 1816·2019-08-30 14:08
閱讀 3557·2019-08-30 13:19
閱讀 1142·2019-08-27 10:53
閱讀 3121·2019-08-26 12:11