threejs之使用shader实现雷达扫描

varying vec2 vUv;
uniform vec3 uColor;
uniform float uTime;mat2 rotate2d(float _angle){return mat2(cos(_angle),-sin(_angle),sin(_angle),cos(_angle));
}void main(){vec2 newUv = rotate2d(uTime*6.18)*(vUv-0.5);float angle = atan(newUv.x,newUv.y);// 根据uv坐标获取不同位置的旋转角度float alpha =  1.0 - step(0.5,distance(newUv,vec2(0)));// 获取一个圆float strength = (angle+3.14)/6.28;// 设置旋转角度为0到1gl_FragColor =vec4(uColor,alpha*strength);// 根据旋转角度控制圆的不同角度的透明度}

变量说明

  • varying vec2 vUv;:从顶点着色器传递到片元着色器的变量,表示纹理坐标。这里用于确定片元(像素)的位置,进而进行旋转等操作。
  • uniform vec3 uColor;:uniform变量是从应用程序传递给着色器的,这里uColor用于设置圆形的颜色。
  • uniform float uTime;:这也是一个uniform变量,表示时间。这通常用于创建动态效果,如在本例中实现旋转。

函数说明

  • rotate2d(float _angle):这是一个自定义函数,用于生成一个2D旋转矩阵,使得可以根据给定的角度_angle来旋转一个向量。

这行代码使用了自定义的 rotate2d 函数来旋转一个二维向量 vUv,并且旋转的角度随时间 uTime 变化。具体的计算过程如下:

步骤 1: 计算旋转角度

  • uTime * 6.18 计算旋转角度,其中 uTime 代表时间,6.18 大约等于 (2\pi),这意味着每单位时间,旋转角度大约是一个完整的圈。

步骤 2: 调整 vUv

  • vUv - 0.5vUv 向量(通常是一个表示纹理坐标的二维向量)中心移到原点。这是因为纹理坐标通常在 [0, 1] 范围内,所以通过减去 0.5,我们将坐标范围调整到 [-0.5, 0.5],使旋转操作以纹理的中心为轴。

步骤 3: 应用旋转矩阵

  • rotate2d(uTime*6.18) 生成一个基于时间变化的旋转矩阵。这个矩阵能够将任何给定的二维向量旋转指定的角度。
  • 矩阵与向量相乘:rotate2d(...) * (vUv-0.5) 应用旋转矩阵到调整后的 vUv 向量上。这实际上是通过矩阵乘法完成的,具体计算如下:

在这里插入图片描述

旋转矩阵的解释

  • cos(_angle): 这是矩阵的第一个元素,代表旋转轴的 x 分量不变的部分。
  • -sin(_angle): 这是矩阵的第二个元素,代表 x 分量向 y 分量旋转的部分。
  • sin(_angle): 这是矩阵的第三个元素,代表 y 分量向 x 分量旋转的部分。
  • cos(_angle): 这是矩阵的第四个元素,代表旋转轴的 y 分量不变的部分。

通过这个矩阵,可以对二维空间中的点或向量进行旋转,使其绕原点旋转 _angle 指定的角度。在图形和游戏开发中,这种类型的矩阵变换非常有用,尤其是在处理物体的旋转和定位时。

结果

  • vec2 newUv 这个操作完成后,newUv 就是旋转后的向量。随着 uTime 的增加,newUv 会围绕原点(即纹理的中心)旋转,旋转速度与 uTime 的变化速率有关。

主函数 void main()

  • vec2 newUv = rotate2d(uTime*6.18)*(vUv-0.5);:这行代码首先将纹理坐标vUv向左下角移动0.5单位,使得旋转中心位于纹理的中心。然后,通过rotate2d函数和随时间变化的角度(uTime*6.18)来旋转这些坐标。
  • float angle = atan(newUv.x,newUv.y);:计算旋转后的newUv坐标点相对于原点的角度。
  • float alpha = 1.0 - step(0.5, distance(newUv, vec2(0)));:使用step函数和distance函数来创建一个圆形的透明度遮罩。如果newUv的距离中心点(0,0)超过0.5,则透明度为0;否则为1。这实际上是在屏幕上绘制了一个半径为0.5单位的圆。
  • float strength = (angle + 3.14) / 6.28;:将角度angle转换为0到1之间的值,用于后续调整透明度。
  • gl_FragColor = vec4(uColor, alpha*strength);:最终设置片元的颜色和透明度。颜色由uColor决定,透明度由alpha*strength决定,这使得圆形的不同角度有不同的透明度效果。

总结,这段代码通过动态旋转的方式,结合时间变化,创建了一个中心透明度变化的圆形效果,其中圆形的颜色和旋转速度可以通过调整uColoruTime来改变。

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

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

相关文章

STM32——OLED菜单(二级菜单)

文章目录 一.补充二. 二级菜单代码 简介:首先在我的51 I2C里面有OLED详细讲解,本期代码从51OLED基础上移植过来的,可以先看完那篇文章,在看这个,然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

代码随想录算法训练营DAY18 | 二叉树 (5)

一、LeetCode 513 找树左下角的值 题目链接:513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/ 思路一:递归回溯全局变量比深度。 class Solution {int Max_depth 0;int result 0;public int findBottomLeftValue(TreeNo…

前端工程化面试题 | 10.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ES入门知识点总结

目录 倒排索引 倒排索引 Elasticsearch的倒排索引是一种数据结构,用于加快基于文本的搜索操作。它的主要优势在于能够快速找到包含特定单词的文档。 倒排索引的构建过程如下: 文档分词:将文档内容分割成单独的词(或者更小的词元…

Javaweb基础-会话

会话: 会话管理:Cookie和Session配合解决 cookie是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息 session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息 cookie和session配合记录…

一文分清OMS、CMS、PMS、TMS、IM、BI、BPMS、SCRM、DSS等B端系统

继5月22日发布一文分清OA、CRM、ERP、MES、HRM、SCM、WMS、KMS等后,很多老铁又给我推荐了其他系统,贝格前端工场这次再撰一文,介绍这些系统。 之前文章: 一文分清OA、CRM、ERP、MES、HRM、SCM、WMS、KMS等 1、OMS系统 OMS系统是…

吐血整理!操作系统【处理机调度】

🌈个人主页:godspeed_lucip 🔥 系列专栏:OS从基础到进阶 1 基本概念1.1 总览1.2 什么是调度1.2.1 调度1.2.2 处理机调度 1.3 调度的三个层次1.3.1 高级调度1.3.2 中级调度(内存调度)1.3.3 低级调度&#xf…

A. Desorting

链接 : Problem - A - Codeforces 题意 : 思路 : 先判断序列是否排好序 , 不是排好序的,直接输出0即可,排好序的 : 先求出相邻元素之间的最小间隔,因为,要使有序非递减序列,变得不排序,…

联想拯救者:截屏就高亮,字都不清楚

截屏老是这样 改显示设置 关闭这个HDR, 就可以了 了解了一下HDR: HDR简单来说就是一种提高影像亮度和对比度的处理技术,它可以将每个暗部的细节变亮,暗的地方更暗,丰富更多细节色彩,让电影,图片都能呈现出…

C/C++重点解析——内存管理

1. C/C内存分布 我们先来看一段代码和其相关问题: int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd"…

[计算机网络]---序列化和反序列化

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、再谈协议…

MySQL数据库基础(四):图形化开发工具DataGrip

文章目录 图形化开发工具DataGrip 一、DataGrip介绍 二、DataGrip安装 三、创建工程 四、连接数据库 五、选择要使用的数据库 六、DataGrip软件设置 1、设置字体大小 2、设置关键字大写 3、自动排版 图形化开发工具DataGrip 一、DataGrip介绍 DataGrip是JetBrains公…