ThreeJS Shader的效果样例雷达图和大气层(二)

news/2024/9/18 8:53:51/文章来源:https://www.cnblogs.com/codeOnMar/p/18233673

一、雷达图

   

 实现原理:图中是一个旋转的渐变扇形,可以通过先实现一个扇形、然后再实现一个渐变扇形,最后再将扇形旋转来达到最终效果

1. 实现一个夹角为O的扇形,已X轴正方向为单位向量M,UV点到(0,0)形成向量N,通过M和N的点乘就可以得到一个夹角,然后判断角度小于O就可以了

2. 实现扇形的渐变色,主要是通过smoothstep实现,smoothstep是在两个值之间取渐变值,这样就可以实现离X轴越远越暗的效果

3. 如何让扇形旋转起来呢,上面已经实现了一个扇形A,通过将扇形B按照一定角度旋转到A,就可以得到对应的渐变色颜色值了,这样一个渐变的旋转角度就可以实现一个旋转的渐变扇形

4. 实现蓝色线圈,也是通过smoothstep函数,一个smoothstep最后会生成0-1的跳变值,如果是两个smoothstep相减会生成一个波峰的颜色值

    

主要原理是先实现一个扇形渐变的区域,这个不是很复杂,然后通过不断渲染页面时,将该扇形旋转到某个角度即可

const vertex = '\varying vec2 vUv;\void main() {\vUv = uv;\vec4 modelPosition = modelMatrix * vec4(position, 1.0);\gl_Position = projectionMatrix * viewMatrix * modelPosition;\}\';const frag = '\uniform float uTime;\varying vec2 vUv;\float drawCircle(vec2 vUv, float radius) {\float res = length(vUv);\float width = 0.005;\return smoothstep(radius - width, radius, res) - smoothstep(radius, radius + width, res);\}\float drawSector(vec2 vUv, float radius) {\float angle = uTime;\vec2 newvUv = mat2(cos(angle), sin(angle), -sin(angle), cos(angle)) * vUv;\vec2 x = vec2(1.0, 0.0);\vec2 y = vec2(0.0, 1.0);\float res = dot(newvUv, y);\float angle2 = acos(dot(x, normalize(newvUv)));\if (angle2 > 0.0 && angle2 < 1.5707 && length(newvUv) < 0.45 && res > 0.0) {\return 1.0 - smoothstep(0.0, 1.5707, angle2);\} else {\return 0.0;\}\}\void main() {\vec2 newvUv = vUv;\newvUv -= vec2(0.5);\vec3 color = vec3(0.0, 0.0, 0.0);\float circle = drawCircle(newvUv, 0.45);\float circle2 = drawCircle(newvUv, 0.3);\float circle3 = drawCircle(newvUv, 0.1);\color += circle + circle2 + circle3;\color += drawSector(newvUv, 0.45);\gl_FragColor = vec4(color * vec3(0.0, 1.0, 0.0), 1.0);\}\';

 

三、遮罩层

1. 第一种方法:采用shader中法向量的概念,取法向量和球体上各个坐标点与相机形成的向量之间的点积,离相机位置越近,

  越靠近相机位置,点积值越大,且为正值,反之越远,则点积越小,同时可能为负值,这时候用产生的点积数据作为透明度,

  即可得到渐变的效果

var vertex    ='varying vec3    vVertexWorldPosition;\varying vec3    vVertexNormal;\varying vec4    vFragColor;\void main(){\vVertexNormal    = normalize(normalMatrix * normal);\vVertexWorldPosition    = (modelMatrix * vec4(position, 1.0)).xyz;\gl_Position    = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\}';var frag    ='uniform vec3    glowColor;\uniform float    coeficient;\varying vec3    vVertexNormal;\varying vec3    vVertexWorldPosition;\varying vec4    vFragColor;\void main(){\vec3 worldVertexToCamera = cameraPosition - vVertexWorldPosition;\vec3 viewCameraToVertex    = (viewMatrix * vec4(worldVertexToCamera, 0.0)).xyz;\viewCameraToVertex = normalize(viewCameraToVertex);\float intensity = coeficient + dot(vVertexNormal, viewCameraToVertex);\if (intensity < 0.0) {\gl_FragColor = vec4(vec3(0.0, 1.0, 0.0), 1.0);\} else {\gl_FragColor = vec4(glowColor, intensity);\}\}';

 

2. 第二种方法通过ThreeJS官方提供的样例,使用EffectCompose的方式来实现,其中也是通过添加shader着色器的原理实现的

 

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

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

相关文章

sql server导入mysql,使用工具SQLyog

概述 需要将sql server的数据导入到mysql中,由于2种数据库存在各种差异,比如表字段类型就有很多不同,因此需要工具来实现。 这里使用SQLyog来实现。SQLyog安装 安装过程参考文档:https://blog.csdn.net/Sunshine_liang1/article/details/84400820 注意:版本不能太低,必须…

PyCharm debug collecting data...

用PyCharm调试时变量实现不出来,一直显示Collecting data...:解决的办法是File-->Settings-->Python Debugger,选中Gevent compatible:问题顺利解决,变量很快就出来了:

进度报告12

(1)接口 创建接口:接口只能有成员变量和方法,方法默认是抽象接口用处:弥补单继承,面向接口编程可以灵活切换各种需求的实现

kubernetes学习笔记

基础环境系统镜像版本Centos 7.6 最小化最低运行环境基本要求内存及CPU:512MB / CPU 1核K3s版本v1.30.0+k3s1集群规划: 注意:需要对每台主机设置hostname,使用 hostnamectl set-hostname 主机名K8s-master 192.168.200.129 1C/1G K8s-worker1 192.168.200.130 2C/2G K8s-wo…

MURF860AC-ASEMI智能AI专用MURF860AC

MURF860AC-ASEMI智能AI专用MURF860AC编辑:ll MURF860AC-ASEMI智能AI专用MURF860AC 型号:MURF860AC 品牌:ASEMI 封装:TO-220AC 批号:最新 恢复时间:35ns 最大平均正向电流(IF):8A 最大循环峰值反向电压(VRRM):600V 最大正向电压(VF):0.95V~1.90V 工作温度:-65C~…

无线遥控技术研究433MHZ

1. 主流的有433MHZ的,主要用在遥控玩具上,使用芯片 EV1527,其中 1527是数据的编码格式,OOK是无线发射数据的通信方式,433M是载波频率。原理图如下,其中根据4个按键的组合,在TXD输出组合波形 TXD的输出波形如下: 方波需要发恶化电路发射出去,发射电路如下,那么理论上…

057、Vue3+TypeScript基础,页面通讯之父页面使用$refs修改子页面暴露的成员

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mou…

【Windows提权】windows环境变量滥用维权/提权

原创 掌控安全学院 - camer#include <windows.h> #include <stdio.h>int main(int argc, char *argv[]) {// 恶意程序wchar_t* Shell = L"C:\\Windows\\Temp\\shell.exe";HINSTANCE hInstance1 = ShellExecuteW(NULL, L"open", Shell, NULL, N…

13-神经网络-模型预测

nn.ReLU()是构造了一个ReLU对象,并不是函数调用,而F.ReLU()是函数调用类似于这样来构造我们的层和块,可以比直接用nn.Sequential有更高的灵活性。当然我们也可以在我们的class中使用nn.Sequential,这样组合使用也可以提高灵活性

订单

当点击结算(car.html)时,会跳转到提交订单页面(palce_order.html)

信息学奥赛初赛天天练-74-NOIP2016普及组-基础题5-树、父节点、根节点、叶子节点、非叶节点、组合、组合排除法

NOIP 2016 普及组 基础题5 21 从一个 44的棋盘(不可旋转)中选取不在同一行也不在同一列上的两个方格,共有( )种方法。 22 约定二叉树的根节点高度为 1。一棵结点数为 2016 的二叉树最少有( )个叶子结点;一棵结点数为 2016 的二叉树最小的高度值是( …

【Linux提权】check-system文件

【此次省略一万字.........】 成功突破边界! 提权: 看了sudo -l,发现一个shutdown命令可以,但是这名字应该是重启吧。。。先跑一跑linpeas.sh,试了一下跑出来的CVE,没有成功找一找具有root命令并且我们可以写权限的文件: find / -user root -type f -perm -o=rw -ls 2&g…