threejs-无限网格InfiniteGridHelper

2024-06-20 05:36

本文主要是介绍threejs-无限网格InfiniteGridHelper,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源代码

// Author: Fyrestar https://mevedia.com (https://github.com/Fyrestar/THREE.InfiniteGridHelper)THREE.InfiniteGridHelper = function InfiniteGridHelper( size1, size2, color, distance, axes = 'xzy' ) {color = color || new THREE.Color( 'white' );size1 = size1 || 10;size2 = size2 || 100;distance = distance || 8000;const planeAxes = axes.substr( 0, 2 );const geometry = new THREE.PlaneBufferGeometry( 2, 2, 1, 1 );const material = new THREE.ShaderMaterial( {side: THREE.DoubleSide,uniforms: {uSize1: {value: size1},uSize2: {value: size2},uColor: {value: color},uDistance: {value: distance}},transparent: true,vertexShader: `varying vec3 worldPosition;void main() {vec3 pos = position.xzy * 1000.0;pos.xz += cameraPosition.xz;worldPosition = pos;gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);}`,fragmentShader: `varying vec3 worldPosition;float getGrid(float size) {vec2 r = worldPosition.xz / size;vec2 grid = abs(fract(r - 0.5) ) / (2.0*fwidth(r));float line = min(grid.x, grid.y);return 1.0 - min(line, 1.0);}void main() {float d = 1.0 - min(distance(cameraPosition.xz, worldPosition.xz) / 1000.0, 1.0);float g1 = getGrid(2.5);float g2 = getGrid(2.5);gl_FragColor = vec4(0.1843137254901961, 0.30980392156862746, 0.30980392156862746, mix(g2, g1, g1) * pow(d, 3.0));gl_FragColor.a = mix(0.5 * gl_FragColor.a, gl_FragColor.a, g2);if ( gl_FragColor.a <= 0.0 ) discard;}`,extensions: {derivatives: true}} );THREE.Mesh.call( this, geometry, material );this.frustumCulled = false;};THREE.InfiniteGridHelper.prototype = {...THREE.Mesh.prototype,...THREE.Object3D.prototype,...THREE.EventDispatcher.prototype
};if ( parseInt( THREE.REVISION ) > 126 ) {class InfiniteGridHelper extends THREE.Mesh {constructor ( size1, size2, color, distance, axes = 'xzy' ) {color = color || new THREE.Color( 'white' );size1 = size1 || 10;size2 = size2 || 100;distance = distance || 8000;const planeAxes = axes.substr( 0, 2 );const geometry = new THREE.PlaneBufferGeometry( 2, 2, 1, 1 );const material = new THREE.ShaderMaterial( {side: THREE.DoubleSide,uniforms: {uSize1: {value: size1},uSize2: {value: size2},uColor: {value: color},uDistance: {value: distance}},transparent: true,vertexShader: `varying vec3 worldPosition;uniform float uDistance;void main() {vec3 pos = position.${axes} * uDistance;pos.${planeAxes} += cameraPosition.${planeAxes};worldPosition = pos;gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);}`,fragmentShader: `varying vec3 worldPosition;uniform float uSize1;uniform float uSize2;uniform vec3 uColor;uniform float uDistance;float getGrid(float size) {vec2 r = worldPosition.${planeAxes} / size;vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth(r);float line = min(grid.x, grid.y);return 1.0 - min(line, 1.0);}void main() {float d = 1.0 - min(distance(cameraPosition.${planeAxes}, worldPosition.${planeAxes}) / uDistance, 1.0);float g1 = getGrid(uSize1);float g2 = getGrid(uSize2);gl_FragColor = vec4(uColor.rgb, mix(g2, g1, g1) * pow(d, 3.0));gl_FragColor.a = mix(0.5 * gl_FragColor.a, gl_FragColor.a, g2);if ( gl_FragColor.a <= 0.0 ) discard;}`,extensions: {derivatives: true}} );super( geometry, material );this.frustumCulled = false;}}Object.assign( InfiniteGridHelper.prototype, THREE.InfiniteGridHelper.prototype );THREE.InfiniteGridHelper = InfiniteGridHelper;}

使用

var gridHelper =new THREE.InfiniteGridHelper(1, 5, new THREE.Color(0x2F4F4F), 200);
scene.add(gridHelper);

效果图

在这里插入图片描述

解析

        float getGrid(float size) {vec2 r = worldPosition.${planeAxes} / size;vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth(r);float line = min(grid.x, grid.y);return 1.0 - min(line, 1.0);}

fract()函数是GLSL(OpenGL Shading Language)中一个内建函数,用于获取一个浮点数的小数部分。换句话说,它会返回一个数减去其整数部分之后的结果,且结果的范围总是从0(包含)到1(不包含),所以fract是一个周期性函数,周期为1。
因此
vec2 r = worldPosition.${planeAxes} / size;
vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth®;
可以用函数 f(x) = | fract(x/size - 0.5) - 0.5 | 表示
可得,f(x)的周期是size, f(x)函数相当于在fract(x)函数的基础上向右和向上平移了0.5个单位。

这篇关于threejs-无限网格InfiniteGridHelper的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077249

相关文章

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论,强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作,敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析,探讨系统变化对敏捷开发的影响、业务与技术的对齐以及敏捷方法如何在产品开发过程中处理持续变化和迭代。 系统变化对敏捷软件开发的影响 在敏捷软件开发中,系统变化的管理至关重要。系统变化可以是需求的改变、技术的升级、

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock? Amazon Bedrock是亚马逊云服务(AWS)推出的一项旗舰服务,旨在推动生成式人工智能(AI)在各行业的广泛应用。它的核心功能是提供由顶尖AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI以及亚马逊自身)开发的多种基础模型(Foundation Models,简称FMs)。

hdu2073(无限的路)

无限的路 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5148    Accepted Submission(s): 2653 Problem Description 甜甜从小就喜欢画图画,最近他买了一支智能画笔,

”CSS 网格“二维布局系统(补充)——WEB开发系列32

CSS 网格布局是一种二维布局系统,用于网页设计。通过使用网格,你可以将内容以行和列的形式进行排列。此外,网格布局还能够简便地实现一些复杂的布局结构。 一、什么是网格布局? CSS网格布局是一种二维布局系统,它允许我们创建复杂的网页布局,既可以处理行也可以处理列。与传统的布局方法不同,网格布局将网页分成多个可控的区域,这些区域可以任意排列、对齐和调整大小。网格布局使得创建灵活且响应

collectionView 无限轮播图

拿一组4张的轮播图作为例子 思路主要是 1. 拿到一组图片后, 把绿色图1和绿色图4多复制出来一份, 把红色图1(复制的图1)放在最后, 红色图4(复制的绿色图4)放在首位, 现在一共是6张图. 2. 左滑从绿色图1到红色图1时,就迅速把collectionView的contentoffset 设置到图1的位置. 3.右滑时,到红色图4就把collectionView的frame设置到绿色图

css——网格布局

名词解释 div{$}*9+tab键,快捷生成   记首字母gtc  网格布局:display: grid;        grid-template-columns: 100px 100px 100px;        grid-template-rows: 100px 100px 100px; (父元素) <!DOCTYPE html><html lang="en"

Python中的方法重写与多态:解锁编程的无限可能

在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极大地提高代码的复用性和可维护性,还能帮助我们构建更加灵活、健壮的软件系统。本文将通过一系列由浅入深的例子,带你一起探索这两个概念的

python恶搞无限弹窗脚本

python恶搞无限弹窗代码; 弹窗可以关闭,但是每次关闭都会增加一个出现; 例如关闭一个弹窗会出现两个弹窗; 初始化出现20个弹窗; 部分核心代码 def on_close(top, root):global window_count# 关闭当前窗口top.destroy()window_count -= 1# 创建两个新窗口create_popups(root, 3)def create_

Data Mesh,数据网格的道与术

周末的时候,看到有群友讨论关于 Data Mesh 的话题。这个名词我在2020年初的时候听到过一次,当时感觉就是一个概念,看的糊里糊涂,没有当回事。最近突然又被推上了话题风口,所以静下心来看了一下相关的论文和介绍。 在讨论 Data Mesh 之前,首先要给大家介绍一下 Service Mesh。 Service Mesh 公认的定义,是用以处理服务与服务之间通信的专用基础设施层。更本质的理

Wyn 商业智能V8.0 新版本来袭,解锁“智造”的无限可能

Wyn商业智能V8.0 版本全新发布,聚焦制造业数字化升级痛点,深度赋能制造业数字化转型升级之路,从无缝集成物联网海量数据,到构建可视化实时分析、监控与预警大屏,全面打通生产制造全生命周期的数据脉络,为您开启工业智能新视界,一键解锁数字化工厂无限可能! Wyn商业智能 V8.0 版本亮点功能一览 1、支持MQTT等采集协议,接入物联网设备数据 全新引入”物联网数据”类型,支持MQTT,Web