3.js - modelPosition.z = sin((modelPosition.x+uTime)*10.0)*0.05;

1、完整的动态波纹效果吧

main.js
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'// 顶点着色器
import basicVertexShader from './shader/11-01/raw/vertex.glsl?raw'
// 片元着色器
import basicFragmentShader from './shader/11-01/raw/fragment.glsl?raw'const scene = new THREE.Scene()const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 700)
camera.position.set(0, 0, 10)// const axesHelper = new THREE.AxesHelper(5)
// scene.add(axesHelper)// --------------------------------------------------------------------/*宽度,高度,宽度分段数:它决定了平面在宽度方向上被分割成多少个小矩形(或更准确地说,是顶点网格的宽度分辨率)。更高的值会创建更平滑的曲线(虽然对于平面来说,这主要体现在边缘的圆形或平滑处理上,如果有的话),但也会增加渲染的顶点和面数。高度分段数:与宽度分段数类似,它决定了平面在高度方向上被分割成多少个小矩形。
*/
const planeGeometry = new THREE.PlaneGeometry(1, 1, 64, 64)// 普通材质
const material = new THREE.MeshBasicMaterial({color: 0x00ff00
})// 着色器材质
// const shaderMaterial = new THREE.ShaderMaterial({
//   vertexShader: `
//     void main(){
//       gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
//     }
//   `,
//   fragmentShader: `
//     void main(){
//       gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
//     }
//   `
// })const textureLoader = new THREE.TextureLoader()
const texture = textureLoader.load('../public/assets/texture/ca.jpeg')/*原始着色器材质,
*/
const rawShaderMaterial = new THREE.RawShaderMaterial({vertexShader: basicVertexShader, // 顶点着色器的GLSL代码(一个字符串)fragmentShader: basicFragmentShader, // 片元着色器的GLSL代码(一个字符串)side: THREE.DoubleSide,`uniforms:一个对象,包含了在着色器代码中使用的全局变量,这些变量可以在JS中设置,并在着色器中被访问和修改。`uniforms: {`uTime:用于在着色器中模拟时间,其value属性被初始化为0,但可以在JS中随时间更新,以在着色器中创建【动态效果】。`uTime: {value: 0},`uTexture:用于将纹理传递给着色器`uTexture: {// value: texturevalue: null}}
})const plane = new THREE.Mesh(planeGeometry, rawShaderMaterial)
scene.add(plane)// --------------------------------------------------------------------const renderer = new THREE.WebGLRenderer({antialias: true
})
renderer.shadowMap.enabled = true
renderer.toneMapping = THREE.ReinhardToneMapping
renderer.toneMappingExposure = 1
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = trueconst clock = new THREE.Clock()
const render = () => {// 获取,自Clock对象创建以来,经过的秒数const elapsedTime = clock.getElapsedTime()// 色器中的uTime变量,就会随着时间的推移而更新rawShaderMaterial.uniforms.uTime.value = elapsedTimecontrols.update()requestAnimationFrame(render)renderer.render(scene, camera)
}
render()window.addEventListener('resize', () => {// 重置相机的宽高比camera.aspect = window.innerWidth / window.innerHeight// 更新相机的投影矩阵camera.updateProjectionMatrix()// 重置渲染器的宽高比renderer.setSize(window.innerWidth, window.innerHeight)// 更新渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio)
})
vertex.glsl
/*precision关键字:设置着色器中使用的浮点数精度为lowp(低精度),有助于在不影响视觉效果的情况下提高渲染性能precision lowp float;   // 后续,所有浮点数的精度,为lowp(低精度:-2^8 - 2^8)precision lowp mediump; // 后续,所有浮点数的精度,为mediump(中精度:-2^10 - 2^10)precision lowp highp;   // 后续,所有浮点数的精度,为highp(高精度:-2^16 - 2^16)*/
precision lowp float;/*attribute:在顶点着色器中声明变量(在较新的GLSL版本中,attribute已经被in关键字所取代)vec3:一个数据类型,代表一个三维向量 */
attribute vec3 position;attribute vec2 uv; // uv:每个顶点的纹理坐标(u, v)// 模型空间 -> 世界空间 -> 观察空间 -> 裁剪空间,然后,最终映射到屏幕坐标上,这是渲染管线中的标准变换顺序
uniform mat4 modelMatrix; // modelMatrix模型矩阵:用于将顶点,从模型空间 -> 世界空间
uniform mat4 viewMatrix; // viewMatrix视图矩阵:用于将顶点,从世界空间 -> 观察空间
uniform mat4 projectionMatrix; // projectionMatrix投影矩阵:用于将顶点,从观察空间 -> 裁剪空间,并最终映射到屏幕坐标上// 获取时间
uniform float uTime; // uTime:一个统一变量,用于传递时间信息,可以用于动画效果varying vec2 vUv; // vUv:传递给片段着色器的纹理坐标varying float vElevation;void main() {// 将输入的纹理坐标传递给片段着色器vUv = uv;// 顶点着色器处理的每个顶点,都有一个位置(position),这个位置是一个三维向量(vec3),包含x、y、z三个坐标// 用于,将顶点的位置,从模型空间啊 -> 世界空间vec4 modelPosition = modelMatrix*vec4(position, 1.0);// modelPosition.x += 1.0;// modelPosition.z += 1.0;// modelPosition.z += modelPosition.x;`1、通过,正弦函数sin,动态的调整,顶点的z坐标,创建一种基于时间和顶点位置的波动效果乘以0.05:基于顶点x坐标和时间的正弦波值,并将其幅度缩放为原始值的5%,意味着,随着uTime(时间)的增加,顶点的z坐标,将根据其在x轴上的位置以正弦波的形式变化。2、sin((modelPosition.x + uTime) * 10.0),为什么乘以10呢?因为,正弦函数sin的周期是2π,意味着,它完成一个完整的波形(从0到1,再到0)需要2π个单位但是,对(modelPosition.x + uTime)乘以10之后,实际上,是在对,正弦函数sin的周期,进行缩放,使得原本需要2π单位才能完成的波形,现在只需要(2π / 10) = 0.2π单位,就能完成一次完整的周期,所以,乘以10.0,意味着,波形在相同的空间或时间范围内,完成了更多的周期,从而增加了波形的频率`modelPosition.z = sin((modelPosition.x+uTime)*10.0)*0.05;modelPosition.z += sin((modelPosition.y+uTime)*10.0)*0.05;vElevation = modelPosition.z; // 将调整后的z值传递给片段着色器 `计算顶点在裁剪空间中的位置,gl_Position,是GLSL内置的输出变量,用于存储顶点的最终位置`gl_Position = projectionMatrix*viewMatrix*modelPosition;
}
fragment.glsl
precision lowp float; // 设置着色器中使用的浮点数精度为lowp(低精度),有助于在不影响视觉效果的情况下提高渲染性能varying vec2 vUv; // 顶点着色器传过来的,表示,每个片段(像素)在纹理图像上的UV坐标varying float vElevation; // 顶点着色器传过来的,表示,每个顶点的高度信息,这里用它来影响片段的颜色uniform sampler2D uTexture; // 这是一个统一变量,指向一个二维纹理图像void main() {// gl_FragColor = vec4(vUv, 0.0, 1.0);// float height = vElevation + 0.05 * 10.0;// gl_FragColor = vec4(1.0*height,0.0, 0.0, 1.0);/* 使用texture2D()函数,根据UV坐标,从uTexture纹理中采样颜色,texture2D()函数,返回的是一个包含RGBA四个分量的vec4向量。 */vec4 textureColor = texture2D(uTexture, vUv);// 根据UV,取出对应的颜色float height = vElevation+(0.05*20.0); `将顶点的高度vElevation,增加了一个固定值``将采样得到的纹理颜色(仅RGB部分)与计算出的高度值相乘,意味着,高度越高,纹理颜色会越亮(或越深,取决于纹理颜色的初始亮度)这是一个简单的,颜色调制过程,用于,根据高度信息,改变纹理的视觉效果。`textureColor.rgb *= height;`gl_FragColor:这是GLSL内置的输出变量,用于存储片元的最终颜色,将用于渲染到屏幕上`gl_FragColor = textureColor;
}
效果图(图是动态的)

在这里插入图片描述







2、modelPosition.z = sin((modelPosition.x+uTime)*10.0)*0.05;

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416783.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用docker安装jenkins,然后使用jenkins本地发版和远程发版

使用docker安装jenkins,然后使用jenkins本地发版和远程发版 1、安装docker 1.安装必要的一些系统工具 sudo yum install docker-ce 2.添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.更新…

内推|京东|后端开发|运维|算法...|北京 更多岗位扫内推码了解,直接投递,跟踪进度

热招岗位 更多岗位欢迎扫描末尾二维码,小程序直接提交简历等面试。实时帮你查询面试进程。 安全运营中心研发工程师 岗位要求 1、本科及以上学历,3年以上的安全相关工作经验; 2、熟悉c/c、go编程语言之一、熟悉linux网络编程和系统编程 3、…

102.二叉树的层次遍历的算法实现及详解

二叉树的层次遍历 题目 102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3…

解析查看elf文件的构成

x86下用clang编译一段c代码,编译成elf文件,读elf文件,dump出里面的所有段,并打印出段中的数据和含义以及汇编的内容 编写C代码 首先,编写一个简单的C程序,例如命名为example.c: 使用Clang编…

您知道tar、xz、zip这三种不同压缩方式的区别吗?

tar、xz、zip是三种不同的压缩和打包格式,它们在压缩算法、使用场景、兼容性等方面存在一定的差异。以下是对这三种格式的比较: 1. 压缩算法 tar:tar本身并不进行压缩,它只是一种打包工具,将多个文件和目录打包成一个…

springboot整合Logback

Logback介绍 描述 Logback是由log4j创始人设计的另外一种开源日志组件,性能比log4j要好。相对是一个可靠、通用、快速而又灵活的Java日志框架。 Logback主要分三个模块 1、logback-core:其他两个模块的基础模块 2、logback-classic:它是lo…

10、Django Admin修改标题

admin from django.contrib import admin from .models import Category, Origin, Hero, Villain # 添加以下代码 admin.site.site_header "系统管理" admin.site.site_title "管理员界面" admin.site.index_title "欢迎来到这里&#xff…

TCP如何关闭连接(详细版)

关闭连接的⽅式通常有两种,分别是 RST 报⽂关闭和 FIN 报⽂关闭。 如果进程异常退出了,内核就会发送 RST 报⽂来关闭,它可以不⾛四次挥⼿流程,是⼀个暴⼒关闭连接的⽅式。 安全关闭连接的⽅式必须通过四次挥⼿,它…

【STM32】通用定时器TIM(输入捕获)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 前言 输入捕获简介 输入捕获配置 初始化IO口 输入捕获初始化 选择触发源及从模式 测量频率方法 输入捕获代码 IC.h IC.c 输入捕获测占空比 前言 建议先阅读这篇博客&#xf…

Unity编辑器开发 Immediate Mode GUI (IMGUI)

1. 简介: IMGUI是代码驱动gui系统,由 OnGUI 函数驱动: void OnGUI() {if (GUILayout.Button("Press Me")){ Debug.Log("Hello!");} } IMGUI常用于: 创建 in-game debugging displays and tools&#xff1b…

vs2019编译opencv+contribute+gpu

1、提前准备 vs2019、opencv4.4.0、opencv-contribute4.4.0、CUDA Toolkit 11.8(不能高于自己电脑的CUDA版本)、CUDNN8.9.6 ps:先提前准备环境 1)cmd中查看:nvidia-smi查看自己的显卡信息,不存在下述信息…

使用python+opencv解析图像和文本数据

1. 创建虚拟环境 新建文件夹, 并在文件夹中创建虚拟环境,可以使用Vscode打开文件夹, 然后在终端中输入以下命令: python -m venv venv2. 激活虚拟环境 在终端中输入以下命令: venv\Scripts\activate3. 安装依赖 在终端中输入以下命令: pip install opencv-pythonpip inst…

《JavaEE进阶》----7.<SpringMVC实践项目:【登录页面的验证】>

这篇文章详细的讲解了一个 简单的登录网页的前端代码和后端代码的构造 使用了JavaScript中的ajax来进行前后端的交互 一、前端代码 登录页面代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>登录…

CSS解析:盒模型

在网页上实现元素布局涉及很多技术。在复杂网站上&#xff0c;可能会用到浮动元素、绝对定位元素以及其他各种大小的元素&#xff0c;甚至也会使用较新的CSS特性&#xff0c;比如Flexbox或者网格布局。 在此之前我们要打好基础&#xff0c;深刻理解浏览器是如何设置元素的大小…

【卷起来】VUE3.0教程-04-表单输入绑定

Hello&#xff0c;各位老铁&#xff0c;今天我们继续给大家讲解VUE3.0教程&#xff0c;本期我们讲述一下VUE中的表单输入绑定&#xff0c;在实际开发过程中&#xff0c;表单的输入是我们常见的功能&#xff0c;那么我们接下来看看&#xff0c;VUE是如何处理的。 各位看官&…

JVM面试(五)垃圾回收机制和算法

概述 了解Java虚拟机的垃圾回收机制&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;&#xff0c;我们也要像其作者John McCarthy一样&#xff0c;思考一下三个问题&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&#xff1f; 虽…

51单片机-DS1302(RTC时钟显示,代码内改变,内设的24年9月5日,上午11:12:00)

一、DS1302时序及命令字 两个操作&#xff1a;写操作和读操作 写操作&#xff1a; &#xff08;由我们单片机一个控制引脚控制DS1302的IO口写入&#xff09;首先就是通过时序图把我们的命令字写入&#xff0c;命令字是控制我们对应要写入的年月日&#xff0c;时分秒等配置的关…

vue3安装sass时报错:Embedded Dart Sass couldn‘t find the embedded compiler executable

vue3安装sass&#xff1a; npm install sass --save-dev 引用 <template><div class"c1"><h1>hello</h1></div> </template> <style lang"scss">.c1{background-color:red;h1{color:yellow;}} </style>报…

2.门锁_STM32_舵机设备实现

概述 需求来源&#xff1a; 门锁的开启和关闭&#xff0c;就是电机来控制。这里不进行实际门锁机械结构的设计&#xff0c;选择用舵机或者电机转动一定的角度&#xff0c;就代表门锁开启。 舵机开发整体思路&#xff1a; 使用STM32裸机开发舵机&#xff0c;使得舵机可以实现…

spring boot 项目 prometheus 自定义指标收集区分应用环境集群实例ip,使用 grafana 查询--方法耗时分位数指标

spring boot 项目 prometheus 自定义指标收集 auth author JellyfishMIX - github / blog.jellyfishmix.comLICENSE LICENSE-2.0 说明 网上有很多 promehteus 和 grafana 配置&#xff0c;本文不再重复&#xff0c;只介绍自定义部分。目前只介绍了分位数指标的收集和查询&a…