看Threejs好玩示例,学习创新与技术(LiquidRaymarching)

news2024/11/30 9:46:55

今天的示例有点超出我的想象,首先会科普下WGSL这种新的着色器脚本,然后说说示例《Liquid Raymarching Scene with Three.js Shading Language | Codrops (tympanus.net)》的技术流程。本示例最终呈现的效果如下。可以看到他跟QQ那个消息拖拽消灭的效果非常像。但QQ那个采用的是CSS中的溶解技术,本示例的算法另有玄机,很难一步讲清楚,请看到最后。

20240929_220411

1、什么是WGSL

我原以为在3D渲染着色器脚本方面,只有HLSL和GLSL,没想到现在针对WebGPU,推出了新的着色器脚本语言WGSL。关于WGSL的介绍我就不展开了,大家可以从官网及ThreeJS都可以找到。

在ThreeJS中,WGSL被组织成类似UE蓝图的模式,在调试过程中,可以发现每个对象具有Node这种对象形式。比如最简单的引用数值,在调试的时候其对象格式是代理变量(Proxy  VarNode)。

const t = float(1).toVar()。

虽然WGSL是一种新的开发语言,但对于学习者而言,理解并不难。为了简化描述,示例中其他的版块都是ThreeJS已封装的WGSL语言,但看起来就是JS脚本。

 2、还是画圆

看Threejs好玩示例,学习创新与技术(Noise)-CSDN博客一文中,我们学习了如何利用GLSL绘制一个标准圆。今天的示例也是画圆,但画法稍微不一样。今天采用射线(Ray)计算距离的方法。这是一个什么效果呢?

我们以上帝视角看整个屏幕,简单思考下,就应该能够想到得到如下这种效果。其中三角形表示我们眼睛的位置,每个圈表示跟眼睛位置相同距离的圆。

代码也很简单,如下(注意,我简化了代码,方便学习,实际代码会复杂那么一点点):

const _uv = uv();
const rayOrigin = vec3(0, 0, -3.3)
const rayDirection = vec3(_uv, 0)
const ray = rayOrigin.add(rayDirection).toVar()
const d = sdf(ray) // current distance to the scene
t.assign(d);
return vec3(t.mul(0.1),0,0)

 3、射线圆圈

我们看到射灯射出来的光,会形成一个簸箕状(可以看下面图的效果)。下面这个效果其跟第2章等距圆有点相似,它构建的是一个等夹角圆。算法是比较简单的。这里会有三个量,a)眼睛所在位置,b)射线目标点,3)周围照射点。

不过示例的算法,我到现在还没完全看懂,它采用还是距离判断,仍然得到上述效果,有研究的同学可以帮帮我。

我给它的代码画了一个示意图,它的算法是每次行近一段距离,并判断与中心点的距离是否小于某个阈值。当然越靠近中心点,每次步进就越小。感觉这个算法效率不高。下面是示例自己的解释。

SDF 基于计算从空间中任何点到形状表面的最短距离的概念。因此,如果点位于形状外部,则 SDF 返回的值为正,如果点位于形状内部,则返回的值为负,而恰好在表面上为零。

考虑到这一点,我们实际上只需要确定一条光线是否“足够接近”表面以使其成为命中。每个连续的步骤都会移动到最近的表面的距离,因此一旦我们越过接近 0 的某个小阈值,我们就有效地 “击中” 了一个表面,允许我们进行早期返回。

 4、交融圆

先看看两个圆交融的效果。可以看到两个圆中间部门会有一些黏黏的效果。

示例中给出的计算代码如下:

const smin = Fn(([a, b, k]) => {
  const h = max(k.sub(abs(a.sub(b))), 0).div(k)
  return min(a, b).sub(h.mul(h).mul(k).mul(0.25))
})

这段代码普通情况下是看不懂的,效果如下。其中这个a、b的范围是0~1。其中图中存在两个白线,这个白线值左边的值是负值,白线右边的值是正值。取负值表示吸附效果。这才实现上图中吸附的效果。

 本示例还有光照效果的代码,但我觉得本文到这里已经够我“喝一壶好的了”,就不在这锦上添花的说明相关代码。

国庆快乐。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink 03 | 数据流基本操作

Flink数据流结构 DataStream 转换 通常我们需要分析的业务数据可能存在如下问题: 数据中包含一些我们不需要的数据 数据格式不方面分析 因此我们需要对原始数据流进行加工,比如过滤、转换等操作才可以进行数据分析。 “ Flink DataStream 转换主要作…

C++ -引用-详解

博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ C -引用-详解 1.引用基础1.1是什么1.2特点 2.引用的意义3.引用的应用场景3.1作为参数3.2作为返回值传值返回引用返回 4.权限问题5.与指针的区别6.总结 1.引用基础 1.1是什么 …

SpringBoot整合异步任务执行

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响…

小红书三面被问 RAG 原理,秒挂…

最近这一两周看到不少互联网公司都已经开始秋招发放Offer。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球…

MySQL高阶2082-富有客户的数量

目录 题目 准备数据 分析数据 题目 编写解决方案找出 至少有一个 订单的金额 严格大于 500 的客户的数量。 准备数据 Create table If Not Exists Store (bill_id int, customer_id int, amount int)Truncate table Storeinsert into Store (bill_id, customer_id, amoun…

openpnp - 图像传送方向要在高级校正之前设置好

文章目录 openpnp - 图像传送方向要在高级校正之前设置好笔记END openpnp - 图像传送方向要在高级校正之前设置好 笔记 图像传送方向和JOG面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致,这样才能和贴板子时的实际操作方向对应起来。 设备标定完&#xf…

(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)

目录 前言 修改方向 修改内容 效果展示 两个新的问题🙋 1.问题1 2.问题2 代码如下: 前言 我们上一节实现了贪吃蛇吃食物身体节点变长,但是食物的刷新位置不是随机的,并且初始化几次后食物就刷不见了,本节我们就来…

【Linux】进程地址空间、环境变量:从理论到实践(三)

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 🚀 前言一:🔥 环境变量 🥝 基本概念🥝 常见环境变量🥝 查看环境变量方法 二:🔥 测试 &…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(中篇)

本篇文章重点讲解参数最多的 关键帧 模块。 「动画模式」选择「3D」: 下方「运动」Tab 会有一系列参数: 以下4个参数,只有「动画模式」选择「2D」才会生效,可忽略: 运动 平移 X 让镜头左右移动: 大于0&a…

JavaSE——面向对象练习题

1.对象数组排序 定义一个Person类{name,age,job},初始化Person对象数组,有3个person对象,并按照age从小到大进行冒泡排序;再按照name的长度从小到大进行选择排序。 public class HomeWork01 {public static void main(String[] a…

基于spring boot的篮球论坛系统

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…

基于拥堵模型的轻量级平台公交室内情况监控系统

论文标题:Bus Indoor Situation Monitoring System Based on Congestion Model Using Lightweight Platform 作者信息:Dong Hyun Kim, Yun Seob Kim, 和 Jong Deok Kim* 所属机构:Pusan National University, Department of Computer Scienc…

Linux·环境变量与进程地址空间

1. 命令行参数 各位可能见过main函数也是有参数的,只是我们平时写的代码都比较简单,用不到main函数的参数,下面我们看一下main函数的参数是什么又是怎么用的 我们看这样一段代码 其编译运行后的效果是这样的 我们将main函数后面的那两个参数叫…

排序算法剖析

文章目录 排序算法浅谈参考资料评价指标可视化工具概览 插入排序折半插入排序希尔排序冒泡排序快速排序简单选择排序堆排序归并排序基数排序 排序算法浅谈 参考资料 数据结构与算法 评价指标 稳定性:两个相同的关键字排序过后相对位置不发生变化时间复杂度空间复…

MyBatisPlus——学习笔记

MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…

C++基础(7)——STL简介及string类

目录 1.STL简介 1.1什么是 1.2STL的历史版本 1.3STL的六大组件 ​编辑 1.4有用的网址 2.string类 2.1string的多种定义方式 2.2string的插入 2.2.1尾插&#xff08;push_back&#xff09; 2.2.2insert插入 2.3拼接&#xff08;append&#xff09; 2.4删除 2.4.1尾…

CoRL 2024 麻省理工学院提出T3触觉Transformer,打破触觉感知的壁垒,重塑未来机器人

在智能机器人领域&#xff0c;触觉感知的研究正逐渐成为关注的焦点。然而&#xff0c;如何让机器人通过触觉更智能地感知和操作&#xff0c;依然是一个未解决的挑战。基于相机的触觉感知是一种通过在软弹性体下嵌入相机来捕获与环境的细粒度交互的感知方法&#xff0c;是最流行…

Java报错输出的信息究竟是什么?

Java报错输出的信息究竟是什么&#xff1f; 本篇会带大家了解一下java运行时报错输出的信息内容&#xff0c;简单学习一下虚拟机内存中Java虚拟机栈的工作方式以及栈帧中所存储的信息内容 异常信息 当你的程序运行报错时&#xff0c;你是否会好奇打印出来的那一大坨红色的究竟…

搜索引擎相关的一段实习经历

0 前言 就是跟搜索相关的一段经历。主要工作就是建立倒排索引库相关的一些简单内容。 又翻到了以前的工作&#xff0c;权作纪念。 就是简单的封装cpp的库供python语言调用。 反正就是很多版本问题等等吧各种鬼问题。 我感觉这个思路可能还是待考证。 跨语言的调用我感觉还是不…

泛型编程--模板【C++提升】(特化、类属、参数包的展开、static、模板机制、重载......你想知道的全都有)

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; C系列语法知识_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 C系列项目实战_Stark、的博客-CSDN博客 座右铭&#xff1a;梦…