如何在WebGL中实现类似隧道的动画? [关闭]

2024-03-02

如何在WebGL中实现类似隧道的动画?

Source: http://dvdp.tumblr.com/ http://dvdp.tumblr.com/

也可以看看:如何在WebGL中实现这个旋转螺旋? https://stackoverflow.com/questions/4638317/how-to-implement-this-rotating-spiral-in-webgl


嗯,这很有趣。 :)

WebGL 演示可在此处获取:http://boblycat.org/~knute/webgl/tunnel/ http://boblycat.org/~knute/webgl/tunnel/

(EDIT:不再可用,但我创建了一个 ShaderToy 版本:https://www.shadertoy.com/view/XdKfRD https://www.shadertoy.com/view/XdKfRD)

主要算法在片段着色器中。基本思想是 for 循环从大到小迭代黑色环/圆圈,同时偏移中心以产生类似隧道的效果。

给定任何像素,我们可以检查该像素是否足够接近环以成为黑色像素的候选者。如果它在环之外,请打破环以避免通过较大的环看到较小的环。

当环靠近时,与前一个(外)圆的距离用于将图案“挤压”在一起,这有助于创建 3D 表面的错觉。

每个环的波浪图案当然是正弦曲线。像素的角度(与圆中心相比)与统一的时间参数相结合,为每个环的波浪图案设置动画。

最后,对不同的参数和转换函数(如 pow())进行了大量实验,以获得接近目标动画的结果。它并不完美,但非常接近。

片段着色器代码:

#ifdef GL_ES
precision highp float;
#endif

const float PI = 3.14159265358979323846264;
const float TWOPI = PI*2.0;

const vec4 WHITE = vec4(1.0, 1.0, 1.0, 1.0);
const vec4 BLACK = vec4(0.0, 0.0, 0.0, 1.0);

const vec2 CENTER = vec2(0.0, 0.0);

const int MAX_RINGS = 30;
const float RING_DISTANCE = 0.05;
const float WAVE_COUNT = 60.0;
const float WAVE_DEPTH = 0.04;

uniform float uTime;
varying vec2 vPosition;

void main(void) {
    float rot = mod(uTime*0.0006, TWOPI);
    float x = vPosition.x;
    float y = vPosition.y;

    bool black = false;
    float prevRingDist = RING_DISTANCE;
    for (int i = 0; i < MAX_RINGS; i++) {
        vec2 center = vec2(0.0, 0.7 - RING_DISTANCE * float(i)*1.2);
        float radius = 0.5 + RING_DISTANCE / (pow(float(i+5), 1.1)*0.006);
        float dist = distance(center, vPosition);
        dist = pow(dist, 0.3);
        float ringDist = abs(dist-radius);
        if (ringDist < RING_DISTANCE*prevRingDist*7.0) {
            float angle = atan(y - center.y, x - center.x);
            float thickness = 1.1 * abs(dist - radius) / prevRingDist;
            float depthFactor = WAVE_DEPTH * sin((angle+rot*radius) * WAVE_COUNT);
            if (dist > radius) {
                black = (thickness < RING_DISTANCE * 5.0 - depthFactor * 2.0);
            }
            else {
                black = (thickness < RING_DISTANCE * 5.0 + depthFactor);
            }
            break;
        }
        if (dist > radius) break;
        prevRingDist = ringDist;
    }

    gl_FragColor = black ? BLACK : WHITE;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在WebGL中实现类似隧道的动画? [关闭] 的相关文章

  • 将 Javascript 对象的属性从 string 更改为 int

    我有一个对象数组 每个对象具有三个属性 年份 总计 人均 例子 0 Object per capita 125 8 total 1007 2 year 2009 这些属性是字符串 我想创建一个循环来遍历数组并将它们转换为 int 我尝试了以
  • 可能未处理的承诺拒绝(id 0)类型错误 GET 或 HEAD 请求不允许主体

    import React from react import FlatList ActivityIndicator Text View from react native export default class FetchExample
  • OpenGL/GLSL - 纹理过滤的实现

    我想在 GLSL 着色器中自己实现纹理过滤 min 和 magfilter 因为我想使用 image load and store 而不是采样器 而且我想以特殊方式处理未定义的像素 并且我正在寻找一篇文章或者这样讨论过滤过程 我记得如何从我
  • JavaScript 添加布尔值

    console log true true 2 console log typeof true true number console log isNaN true true false 为什么两个布尔类型相加会产生一个数字 我有点理解 如
  • 显示具有多个父代的 D3 树

    我目前有this http bl ocks org mbostock 4339083图已实现 我希望在描述具有多个父节点的子节点时保持结构和可折叠性 有没有办法做到这一点 我研究了力图 但我也想保留一组层次结构 这意味着 1 级的父级可以有
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • 如何在另一个自定义 Hook 中使用返回值的自定义 Hook?

    我正在使用 React native 其中有一个名为的自定义 HookuseUser使用以下方法从 AWS Amplify 获取用户信息Auth getUserInfro方法 然后获取返回对象的一部分并用它设置一个状态变量 我还有另一个名为
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • Vaadin 12 将对象传递给 JavaScript 函数:无法对类进行编码

    Vaadin 12 Kotlin 项目 In my myPage html我有JavaScript myObject redirectToCheckout sessionId 1111 2222 所以我需要调用javaScript函数red
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 在 R 中创建数字同心环递增的矩阵

    我需要在 R 中编写一个函数来创建一个由递增的同心数字环组成的矩阵 该函数的参数是层数 例如 如果 x 3 矩阵将如下所示 1 1 1 1 1 1 2 2 2 1 1 2 3 2 1 1 2 2 2 1 1 1 1 1 1 我不知道该怎么做
  • 在 WooCommerce 电子邮件模板中获取产品名称和描述

    我试图在 WooCommerce 电子邮件模板中发送电子邮件时获取产品描述和产品名称 我能够获取产品 ID order id trim str replace order gt get items 使用此代码 但是当我试图获取它的描述和产品
  • 在 Symfony 应用程序/控制台中启用 Doctrine DBAL 命令

    当使用 Bare Bone Doctrine 和开箱即用的命令行时 有两个命令可用 但在 Symfony 和 Doctrine 中使用时似乎不可用 app console dbal dbal import Import SQL file s
  • MVC3 razor 创建 HtmlButtonExtension 时出错

    我正在尝试使用在我的页面上创建一个自定义 html 按钮this https stackoverflow com questions 5955571 theres no html button public static class Htm
  • oci8、php7 和 Oracle 10.1 兼容性

    我必须从以下版本升级系统php5 6 to php7 2 该系统使用一个oracle 10 1数据库 现在我尝试收集所有信息 但仍然对之间的兼容性感到困惑php oci8 instant client和数据库 我读到 对于 php7 我至少
  • ASCII 码实际上是 7 位还是 8 位?

    我的老师告诉我 ASCII 是一种 8 位字符编码方案 但它仅定义为 0 127 代码 这意味着它可以容纳 7 位 那么难道不能说 ASCII 实际上是一个 7 位代码吗 当说 ASCII 是一个 8 位代码时 我们到底在说什么 ASCII
  • ESP32 上的 Web 服务器:如何自动更新和显示来自服务器的传感器值?

    我在 ESP32 上有一个网络服务器 在该服务器上有一个主页 我想每隔 x 秒自动更新主页上的传感器值 无需用户输入 我无法访问文件系统 该传感器直接连接到 ESP32 传感器值位于我的 C 程序中 存储在变量中并定期更新 变量是全局的 以
  • 使用 lambda 编写枚举函数

    我收到了这个练习 写一个函数enumerate它接受一个列表并返回一个列表 元组包含 index item 对于列表中的每个项目 我的问题是我无法将索引和值插入一个或多个for循环 这是我设法制作的代码 a a b c a b c inde
  • WELD-001409 类型 [EagerBeansRepository] ​​的依赖关系不明确

    我正在尝试将 JSF 应用程序迁移到 CDI 我实施了以下更改 添加一个空的 beans xml 文件到 WEB INF 将 ManagedBean 更改为 Named 将我拥有的所有范围更改为 CDI 范围 会话 视图 请求 将所有 EJ
  • 在 GCD 串行队列上调度和无效 NSTimers 是否安全?

    这样做的正确方法是什么 这NSTimer文档是这样说的 特别注意事项 您必须从以下线程发送此消息 安装了计时器 如果您从其他人发送此消息 线程中 与计时器关联的输入源可能不会被删除 从其运行循环中 这可能会阻止线程退出 适当地 Since
  • git bare 存储库中的“fetch --all”不会将本地分支同步到远程分支

    我正在尝试定期同步 git bare 存储库 我的本地分支是使用 track 选项创建的 这是我的配置 没有不必要的东西 core bare true remote origin url email protected cdn cgi l
  • 发出连续的 HTTP 请求是节点中的阻塞操作吗?

    请注意 与我的问题无关的信息将被 引用 像这样 随意跳过这些 Problem 我正在使用节点代表多个客户端发出有序的 HTTP 请求 这样 客户端最初需要加载几个不同的页面才能获得所需的结果 现在只需要通过我的服务器发出一个请求 我目前使用
  • Google App Engine 使用 Python 动态生成站点地图

    我有一个网站 我想为其创建动态站点地图 我将 Google App Engine 与 Python 和 Django 结合使用 我使用 PHP 开发了另一个网站 并且由于我在 Apache 服务器的 htaccess 上编写的重写规则 可以
  • xampp 找不到我的主文件夹 --Mac os x

    我正在尝试将 XAMPP 与 NetBeans for PHP 结合使用 当我将文件移至 htdocs 文件夹时 一切正常 但是 当它们位于主文件夹中时 XAMPP 无法找到它们 以下是 XAMPP 的说明 我遵循了它 但它不起作用 Whe
  • 等待 Selenium 中的页面加载

    你怎么做Selenium http en wikipedia org wiki Selenium 28software 292 0等待页面加载 您还可以使用以下代码检查页面加载情况 IWait
  • 为给定的正则表达式创建所有可能匹配的集合

    我想知道如何找到一组与给定正则表达式匹配且匹配数量有限的所有匹配 例如 所有这些例子你都可以假设它们是从 并结束于 hello gt hell hello 1 9 0 9 0 3 gt 1 2 3 9998 9999 My cat dog
  • 在 Android 模拟器上安装 Facebook apk

    有没有人成功做到这一点 我已经尝试过这个网站上的 sdk apk 的各种组合 但没有成功 https developers facebook com docs android downloads https developers faceb
  • Zend / Apache2:多次请求 url 时出现 302 Found

    我正在编程一个REST API with Zend框架 当多次调用 url 时 例如每秒 1 个请求 1000 次 大约0 2 的案例而不是得到200 OK作为我得到的回应302 Found 所以重定向到不同的页面 这是整个服务器响应 30
  • 最近执行的 SQL 不在 V$SQL 中

    什么情况下选择查询不会出现在V SQL视图中 例如 如果我运行这个 select findme from T 然后立即运行 select from v sql where sql text like findme 在什么情况下我不会返回任何
  • 如何在WebGL中实现类似隧道的动画? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在WebGL中实现类似隧道的动画