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到1
    gl_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来改变。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言学习day15:数组定义的格式

数组的写法格式有很多种 int arr1[6] { 1,2,3,4,5,6 }; int arr[] { 1,2,3,4,5,6 }; int arr[10] { 1,2,3,4,5 }; int arr[10]; arr[0] 1; 这些都有差别 代码: int main() {//int arr1[6] { 1,2,3,4,5,6 };//int arr[] { 1,2,3,4,5,6 };//int arr[10]…

【计算机网络】物理层|传输介质|物理层设备|宽带接入技术

目录 一、思维导图 二、传输介质 1.传输介质——导引型 2.传输介质——非导引型​编辑 三、物理层设备 1.物理层设备:中继器&集线器 2.宽带接入技术(有线) ​编辑 四、趁热打铁☞习题训练 五、物理层总思维导图 推荐 前些天发现…

如何利用SpringSecurity进行认证与授权

目录 一、SpringSecurity简介 1.1 入门Demo 二、认证 ​编辑 2.1 SpringSecurity完整流程 2.2 认证流程详解 2.3 自定义认证实现 2.3.1 数据库校验用户 2.3.2 密码加密存储 2.3.3 登录接口实现 2.3.4 认证过滤器 2.3.5 退出登录 三、授权 3.1 权限系统作用 3.2 授…

猫头虎分享已解决Bug || AttributeError: ‘str‘ object has no attribute ‘decode‘

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Packet Tracer - Configuring ASA Basic Settings and Firewall Using CLI

Packet Tracer - 使用CLI配置ASA基本设置和防火墙 IP地址表 目标 验证连接并探索ASA设备使用CLI配置ASA的基本设置和接口安全级别使用CLI配置路由、地址转换和检查策略配置DHCP、AAA和SSH服务配置DMZ区域、静态NAT和访问控制列表(ACL) 场景 您的公司…

ClickHouse--10--临时表、视图、向表中导入导出数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.临时表1.1 特征1.2 创建一个临时表 2.视图2.1 普通视图2.2 物化视图 3.向表中导入导出数据3.1 案例 1.临时表 1.1 特征 ClickHouse 支持临时表,临时表…

Kotlin基本语法2基本内置方法

1.Kotlin的可空性 fun main() {var str:String? "butterfly" //?问好代表可空类型str null } 安全的管理 1.1 安全操作调用符 fun main() {var str:String? "butterfly" //?问好代表可空类型str nullprintln(str?.capitalize())//当String为null时…

Java使用Documents4j实现Word转PDF(知识点+案例)

文章目录 前言源码获取一、认识Documents4j二、快速集成2.1、pom.xml依赖2.2、word转PDF实现项目目录WordUtils.javaDemo6.java测试效果 参考文章资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里…

优秀的电机驱动MCU:MM32SPIN360C

DC-DC电源布局注意点: 电源模块布局布线可提前下载芯片的datasheet(数据表),按照推荐的布局和布线进行设计。 1) 芯片电源接近原则: 对于为芯片提供电压的开关电源,应确保它尽量靠近芯片放置。这样可以避…

嵌入式中PWM操作与实现原理

PWM有非常广泛的应用,比如直流电机的无极调速,开关电源、逆变器等等。 个人认为,要充分理解或掌握模拟电路、且有所突破,很有必要吃透这三个知识点: PWM 电感 纹波 PWM是一种技术手段,PWM波是在这种技术…

java8使用流

这种处理数据的方式很有用,因为你让Stream API管理如何处理数据。这样StreamAPI就可以在背后进行多种优化。此外,使用内部迭代的话,SteamAPI可以决定并行运行你的代码。这要是用外部迭代的话就办不到了,因为你只能用单一线程挨个迭…

中等题 ----- 栈和单调栈

文章目录 一,栈1. 用栈操作构建数组2. 逆波兰表达式求值3. 使括号有效的最少添加4. 最小栈5.小行星碰撞6. 验证栈序列7.检查替换后的词是否有效8. 反转每队括号间的子串9.移除无效的括号10. 括号的分数11. 删除字符串后的所有相邻重复项II12. 基本计算器|| 二&#…

opencv鼠标响应与操作

这节讲得好,建议仔细揣摩 Point sp(-1, -1);//初始位置 Point ep(-1, -1);//结束位置 Mat temp; static void on_draw(int event, int x, int y, int flags, void * userdata) {Mat image *((Mat*)userdata);//先将void类型转为Mat类型//((Mat*)userdata)是Mat类型指针 前面加…

vue3 中使用pinia 数据状态管理(在Taro 京东移动端框架中的使用)

1.pinia 介绍 pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。就是和vuex一样的实现数据共享。 依据Pinia官方文档,Pinia是2019年由vue.js官方成员重新设计的新一代状态管理器,更替Vuex4成为Vuex5。 Pinia 目前也已经是 vue 官方正式的…

论文阅读 - Non-Local Spatial Propagation Network for Depth Completion

文章目录 1 概述2 模型说明2.1 局部SPN2.2 非局部SPN2.3 结合置信度的亲和力学习2.3.1 传统正则化2.3.2 置信度引导的affinity正则化 3 效果3.1 NYU Depth V23.2 KITTI Depth Completion 参考资料 1 概述 本文提出了一种非局部的空间传播网络用于深度图补全,简称为…

手把手教你免费搭建自己的红包封面商城​

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

【Linux】调试工具gdb:初识

前言 今天来记录并学习一下gdb的使用 背景 程序的发布方式有两种,debug模式和release模式Linux gcc/g出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 使用 gdb FileName 退出&#x…

爱上JVM——常见问题:JVM组成(一)

1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 难易程度:☆☆☆ 出现频率:☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&…

qt-C++笔记之打印所有发生的事件

qt-C笔记之打印所有发生的事件 code review! 文章目录 qt-C笔记之打印所有发生的事件1.ChatGPT问答使用 QApplication 的 notify 方法使用 QObject 的 event 方法 2.使用 QObject 的 event 方法3.使用 QApplication 的 notify 方法 1.ChatGPT问答 在Qt C中,若要打…

相机图像质量研究(22)常见问题总结:CMOS期间对成像的影响--光学串扰

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…