Skip to content

Instantly share code, notes, and snippets.

@tiye
Last active July 12, 2025 07:13
Show Gist options
  • Save tiye/b77db4c3b2488a01eea8e109d6de4e74 to your computer and use it in GitHub Desktop.
Save tiye/b77db4c3b2488a01eea8e109d6de4e74 to your computer and use it in GitHub Desktop.
用于 https://github.com/Triadica/CompositorDemo 计算粒子轨迹的脚本
基于卡拉比丘流形的卷曲几何特性,生成一组 3D 空间中的粒子轨迹。这些轨迹应在指定的三维区域内展现复杂且非周期性的卷曲图案,粒子速度在曲率较大的区域应略微减慢,并带有微弱的拖尾效果。注意保持在一定区域内移动.
利用四元数插值(Slerp或Squad)生成 3D 空间中粒子平滑的旋转轨迹。设计一条主曲线,粒子围绕这条主曲线以变速率进行局部旋转运动,形成类似螺旋或扭曲的路径。粒子颜色应随着旋转角度的变化而渐变。注意保持在一定区域内移动.
模拟花瓣的缓慢绽放过程,设计一组粒子轨迹。粒子从中心点沿着 Y 轴缓慢向上扩散,并同时向外弯曲展开,形成多层且逐渐增大的“花瓣”形状。粒子应具有透明度渐变和微弱发光效果。注意保持在一定区域内移动.
模拟台风的螺旋结构和眼部特征,设计 3D 空间中的粒子轨迹。粒子应从一个中心点向外螺旋扩散,形成一个逐渐增大的锥形或碗状结构,并在中心区域留有一个相对平静的“台风眼”。粒子速度应在外围区域更快,并伴有轻微的随机扰动。注意保持在一定区域内移动.
基于 Four-wing 吸引子(例如Rossler或Lorenz变体)的数学方程,生成 3D 空间中的粒子轨迹。确保粒子在吸引子周围以混沌但有界的方式运动,并展示其特有的翅膀状结构。粒子轨迹应具有一定的持久性,形成可见的“轨迹线”。注意保持在一定区域内移动.
模拟海浪在圆形岸边拍打的动态,设计 3D 空间中的粒子轨迹。粒子应以波浪状在环形路径上前进,并且在每个“拍打”点上粒子密度和亮度瞬间增加,随后扩散开来。整体运动应具有周期性。注意保持在一定区域内移动.
参考"Double Pendulum"的运动模式,生成 3D 空间中的粒子轨迹。粒子应模拟双摆臂末端的混沌运动,展示出复杂且非重复的路径。粒子应具有一定的拖尾,以可视化其路径历史。注意保持在一定区域内移动.
模拟猫行走的优雅“猫步”,设计 3D 空间中粒子的平滑轨迹。轨迹应呈 S 形或波浪形前进,并伴有轻微的重心上下摆动和左右摇摆。粒子运动应流畅且具有节奏感,粒子大小可随摆动略微变化。注意保持在一定区域内移动.
模拟原子核外电子云的概率分布和能级跃迁,设计 3D 空间中的粒子轨迹。粒子应在特定能量层(球壳或椭球体)内随机分布,并在特定时刻以瞬时加速/减速的方式在不同能级间进行“跃迁”,同时伴随着短暂的光芒闪烁。注意保持在一定区域内移动.
生成两个相互缠绕的螺旋线轨迹,模拟 DNA 的双螺旋结构。粒子应沿着这两条螺旋线以恒定速度前进,并可以在两个螺旋之间进行周期性的“跳跃”,模拟碱基对的连接。粒子颜色应在两个螺旋线上有所区分。注意保持在一定区域内移动.
在一个限定的圆柱形区域内,模拟流体涡旋的形成。粒子应从外部被吸入中心,并沿着不断缩小的螺旋路径运动,最终在中心区域形成一个密集的涡流。粒子速度应在接近中心时逐渐加快,并带有轻微的随机扰动。注意保持在一定区域内移动.
从中心点开始,生成一组基于斐波那契序列和黄金螺旋的粒子轨迹。粒子应以不断增大的半径沿着螺旋路径向外展开,保持其独特的自相似性。粒子间距应随着螺旋的展开而逐渐增大。注意保持在一定区域内移动.
从一个中心点向外扩散,设计粒子形成对称且分形结构的轨迹,模拟雪花晶体的生长。粒子应沿着六个主要方向生长,并在每个分支上生成更小的次级分支,最终形成一个复杂的六边形图案。粒子应具有半透明的冰晶效果。注意保持在一定区域内移动.
设计一条椭圆轨道,粒子模拟彗星围绕中心点(太阳)运动。当粒子接近中心点时,其速度应显著增加,并向外延伸出一条由大量微小粒子组成的“彗尾”,彗尾长度和密度应随主粒子速度而变化。注意保持在一定区域内移动.
模拟水滴落入平面时形成的同心圆涟漪。当一个粒子(水滴)与一个虚拟平面接触时,从接触点向外扩散生成一系列不断增大的同心圆粒子波纹。涟漪的高度应随着距离的增加而衰减。注意保持在一定区域内移动.
使用洛伦兹吸引子的经典方程生成 3D 空间中的粒子轨迹。粒子应在吸引子的两个“翅膀”之间来回跳跃,展示其敏感的初始条件依赖性和非周期性。粒子应具有随时间变化的颜色,以可视化其在相空间中的位置。注意保持在一定区域内移动.
从一个中心点开始,模拟烟花爆炸。粒子应向各个方向高速喷射,随后在重力作用下以抛物线轨迹下落。粒子应在初始喷射时亮度最高,并随着下落逐渐衰减并消失,模拟烟花的闪烁和熄灭。注意保持在一定区域内移动.
生成多个粒子,分别在 X-Y、Y-Z、X-Z 平面上基于不同频率和相位差的 Lissajous 曲线运动,然后将这些二维运动组合成 3D 轨迹。确保粒子轨迹的周期性,并可以通过调整频率比来生成各种复杂的图案。注意保持在一定区域内移动.
设计一个粒子沿着螺旋线运动,同时这条螺旋线能够周期性地伸长、缩短和扭曲。粒子应跟随螺旋线的动态变化,并保持与螺旋中心的相对距离。粒子颜色可随螺旋的压缩或拉伸而变化。注意保持在一定区域内移动.
从一个中心粒子开始,周期性地“分裂”出新的粒子。新粒子最初紧密围绕原粒子,随后逐渐向外扩散并形成自己的“细胞核”,重复分裂过程。粒子应具有柔和的边缘和半透明效果。注意保持在一定区域内移动.
尝试将 Mandelbrot 或 Julia 集的迭代过程映射到 3D 空间。粒子轨迹不应是简单的线条,而是根据迭代次数或发散速度来决定粒子在 3D 空间中的位置和颜色,形成类似分形的复杂结构。注意保持在一定区域内移动.
在一个中心黑洞周围,模拟大量粒子(恒星)在引力作用下的旋转轨迹。粒子应以不同速度和偏心率沿着椭圆或螺旋轨道运动,形成一个扁平的、旋转的盘状结构,中心粒子密度最高。注意保持在一定区域内移动.
设计粒子在 3D 空间中以快速的“8”字形或不规则螺旋形轨迹前进,模拟昆虫振翅产生的升力和推力。粒子应具有高速运动和短暂的悬停,并伴有微弱的气流扰动效果。注意保持在一定区域内移动.
粒子从一个中心点向外径向爆发,在球面上形成一个均匀分布的粒子群,随后粒子群又同步向中心点收缩。这个过程应具有周期性,并伴随着粒子大小和亮度的变化。注意保持在一定区域内移动.
在 3D 空间中设置一个或多个虚拟的磁极,粒子应沿着这些磁极产生的虚拟磁力线运动。轨迹应展现磁力线从一极发出并弯曲回到另一极的特性,粒子速度可随磁场强度而变化。注意保持在一定区域内移动.
设计粒子在 3D 空间中进行周期性的钟摆运动。可以是一个简单的单摆,也可以是两个或更多相互关联的摆动,展示复杂的周期或混沌行为。粒子应具有惯性,摆动幅度逐渐衰减。注意保持在一定区域内移动.
将外部音乐的实时频率或节拍映射到 3D 粒子运动上。例如,低频使粒子下沉,高频使粒子跳起;节拍触发粒子群的爆发或收缩。粒子颜色和大小也可随音乐变化。注意保持在一定区域内移动.
设定少量具有质量的粒子,让它们在 3D 空间中根据万有引力定律相互吸引和运动。轨迹应展现出复杂的轨道交织、碰撞或被“甩出”的效果,模拟微观星系的动态。注意保持在一定区域内移动.
粒子从底部向上升腾,形成火焰状的动态。粒子应向上运动,同时向外扩散并摇曳,最终在顶部逐渐消失。粒子应具有暖色调(红、橙、黄)和半透明效果,模拟热空气的扰动。注意保持在一定区域内移动.
粒子从一个根部开始,向上生长并周期性地分叉,形成一个具有自相似结构的分形树。每个分支的粒子数量和生长速度可根据迭代深度而变化。注意保持在一定区域内移动.
在 3D 空间中放置一个流线型物体(如飞机机翼),粒子模拟流体从一侧流过物体。粒子轨迹应沿着物体表面平滑弯曲,并在物体后方形成尾流或涡流。注意保持在一定区域内移动.
粒子从上方垂直下落,当接触到虚拟地面时,瞬间向四周溅射出更多小粒子,随后这些小粒子在重力作用下以抛物线轨迹消失。整个过程应具有随机性。注意保持在一定区域内移动.
设计一群粒子,它们能够遵循 Boids 算法(分离、对齐、凝聚)在 3D 空间中自主移动。粒子群应展示出整体的迁移方向,同时每个粒子又能保持相对独立的运动。注意保持在一定区域内移动.
粒子沿着莫比乌斯环的表面运动,展现其独特的单面特性。粒子应能无限循环,而无需“翻转”,并在通过扭曲点时颜色或速度发生微妙变化。注意保持在一定区域内移动.
在 3D 空间中心设置一个强大的引力源(如黑洞),粒子从远处被吸引,并以不断收紧的螺旋路径向引力源下落,最终被“吞噬”。粒子速度应在接近引力源时急剧增加。注意保持在一定区域内移动.
粒子从底部缓慢上升,形成球形气泡。当粒子达到顶部时,瞬间扩散并消失,模拟气泡破裂。粒子应具有半透明效果,并伴有轻微的晃动。注意保持在一定区域内移动.
两个粒子由一条虚拟的弹力绳连接。当两个粒子被拉远时,弹力绳产生张力将它们拉近;当靠近时又会相互推开,形成周期性的振荡和回弹。注意保持在一定区域内移动.
粒子在一个预定义的 3D 网格(晶格)点之间进行跳跃或小幅振动。跳跃应是离散的,而振动则是连续的,模拟原子或分子在晶体中的运动。注意保持在一定区域内移动.
设计粒子群以周期性的收缩和扩张方式在 3D 空间中缓慢移动,模拟水母的“钟罩”脉动。粒子应具有柔软的边缘和透明感,并可发出微弱的光。注意保持在一定区域内移动.
粒子从一个中心点开始,以均匀的速度向所有方向扩散,模拟宇宙的膨胀。粒子间的相对距离应随时间线性增加,且没有一个明确的“中心点”可被识别,所有粒子都是“等效”地远离彼此。注意保持在一定区域内移动.
/*
This file provides a compute function that can be dyanamically loaded
*/
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
typedef struct {
float time;
float elapsed;
int groupSize;
float3 viewerPosition;
float viewerScale;
float viewerRotation;
} ComputeParams;
struct CellBase {
float3 position;
float3 color;
float3 velocity;
};
/// some logic to move cells with compute shader,
/// cells are placed like sphere with fibonacci grid.
kernel void computeCellMoving(
device CellBase *attractor [[buffer(0)]],
device CellBase *outputAttractor [[buffer(1)]],
constant ComputeParams &params [[buffer(2)]],
uint id [[thread_position_in_grid]]) {
CellBase cell = attractor[id];
device CellBase &outputCell = outputAttractor[id];
bool leading = (id % (params.groupSize + 1) == 0);
if (!leading) {
// move along leading cell
outputCell.position = outputAttractor[id - 1].position;
outputCell.color = outputAttractor[id - 1].color;
// outputCell.velocity = outputAttractor[id - 1].velocity;
} else {
// The cells are initially positioned on a Fibonacci sphere, with adjacent
// cells having similar colors. The goal is to create a dynamic, wave-like
// motion, inspired by ocean waves, while keeping the movement within a
// confined spherical area. The motion should preserve the initial color
// coherence, ensuring that neighboring cells move together and maintain
// their similar colors. Avoid collapsing all cells into a single point.
float dt = params.elapsed * 2;
// --- START ----
// Get normalized position and index for Fibonacci spiral
float n = float(id);
float phi = (1.0 + sqrt(5.0)) / 2.0; // Golden ratio
float goldenAngle = 2.0 * M_PI_F / (phi * phi);
// Base spiral parameters with outward expansion
float expansionFactor = 1.0 + sin(dt * 0.3) * 0.5; // Breathing expansion
float baseRadius = sqrt(n) * 0.4 * expansionFactor; // Expanding radius
float currentAngle = n * goldenAngle + dt * 0.5;
// Generate expanding spiral position
float3 spiralOffset;
spiralOffset.x = baseRadius * cos(currentAngle);
spiralOffset.z = baseRadius * sin(currentAngle);
spiralOffset.y = sin(n * 0.1 + dt) * 0.3;
// Create splash-like outward bursts
float burstPhase = dt * 1.5 + n * 0.1;
float burstIntensity = max(0.0, sin(burstPhase)) * 2.0;
float3 burstDirection = normalize(spiralOffset + float3(0, 0.1, 0));
spiralOffset += burstDirection * burstIntensity * 0.8;
// Add secondary wave ripples for foam effect
float ripplePhase1 = currentAngle * 4.0 + dt * 3.0;
float ripplePhase2 = currentAngle * 8.0 - dt * 2.0;
float rippleAmplitude = 0.15 * (1.0 + sin(dt * 0.8));
spiralOffset.x += rippleAmplitude * cos(ripplePhase1) * sin(ripplePhase2);
spiralOffset.z += rippleAmplitude * sin(ripplePhase1) * cos(ripplePhase2);
spiralOffset.y += rippleAmplitude * 0.5 * sin(ripplePhase1 + ripplePhase2);
// Constrain to spherical boundary with soft expansion
float maxRadius = 3.5 + sin(dt * 0.4) * 1.0; // Dynamic boundary
float currentDist = length(spiralOffset);
if (currentDist > maxRadius) {
spiralOffset = normalize(spiralOffset) * maxRadius;
}
// Apply smooth interpolation for natural splash movement
float3 newPosition = mix(cell.position, spiralOffset, 0.04);
float3 deltaV = (newPosition - cell.position) * 0.15;
/// --- END ----
// write to cell
outputCell.position = newPosition;
outputCell.velocity = cell.velocity + deltaV;
outputCell.color = cell.color;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment