Skip to content

参数曲面 (Parametric Surface)

简介

参数曲面示例

参数曲面是数学可视化中最基础也最强大的场景类型之一。它将一对参数 映射到三维空间坐标 ,从而生成千变万化的曲面几何——从简单的球体、圆环,到复杂的螺旋面、莫比乌斯带,乃至丰饶角(Cornucopia)等令人惊叹的数学雕塑,都可以通过参数方程精确表达。

本场景支持两种渲染模式:粒子点云(POINTS)网格曲面(MESH),分别适用于不同的创作需求。粒子模式擅长展现流动效果和拖尾动画,让曲面"活"起来;网格模式则呈现光滑的曲面表面,支持填充、线框、材质和程序纹理,适合展示曲面的几何形态和光影效果。

说明:参数曲面场景与分形(Fractal)、映射吸引子(Map Attractor)、对称混沌(Symmetry Chaos)等场景共享部分 UI 组件(如相机控制、公式显示、调色板),但拥有独立的方程输入系统、参数域控制、渲染管线和动画控制器,专注于参数曲面的创建与探索。

核心能力:

  • 自由方程输入:支持在 x(u,v)、y(u,v)、z(u,v) 三个输入框中直接编写数学表达式,实时预览曲面形态
  • 双模式渲染:POINTS 模式支持粒子流动和拖尾效果;MESH 模式支持填充、线框、材质和程序纹理
  • CPU/GPU 双引擎:CPU 模式高精度渲染,支持拖尾效果;GPU 模式高性能渲染,支持百万级粒子
  • 自定义参数系统:在 Parameters 面板定义参数(如 a、R、r),在方程中直接引用,支持实时调节和动画驱动
  • 参数域与流动控制:精确控制 u、v 参数的取值范围,支持周期性边界和流动模式,创造完美循环动画
  • 专业调色板:支持手动、余弦和曲线三种渐变模式,配合闭环检测实现闭合曲面的无缝着色
  • 完整动画支持:参数振荡动画、相机动画、渐变动画、模式切换动画,通过时间线系统编排复杂动画序列

数学背景

什么是参数曲面?

参数曲面是微分几何中的基本概念。与隐式方程(如 定义球面)不同,参数曲面通过三个二元函数将二维参数域映射到三维空间,这种方式具有以下优势:

  • 直观性:每个参数值对应曲面上唯一的点,参数域与曲面之间的映射关系清晰
  • 可计算性:给定参数值即可直接计算坐标,无需求解方程
  • 可采样性:通过在参数域上均匀采样,可以方便地生成曲面的网格或点云表示
  • 可动画性:让参数随时间变化,可以创造粒子在曲面上流动的效果

参数曲面的数学定义

参数曲面由三个二元函数定义:

其中 构成参数域。可以想象参数域是一块"布料",参数方程定义了如何将这块布料"折叠"成三维空间中的曲面。

经典参数曲面

球面 (Sphere)

球面是最基本的闭合曲面。参数 u 控制经度(绕 Z 轴旋转),参数 v 控制纬度(从北极到南极):

其中 为球面半径。

圆环面 (Torus)

圆环面由一个大圆(主圆)和一个小圆(管截面)组合而成。参数 u 控制沿主圆的位置,参数 v 控制沿管截面的位置:

其中 为主半径, 为管半径。

螺旋面 (Helicoid)

螺旋面是极小曲面的经典例子,可以想象为一条直线绕轴旋转的同时沿轴方向匀速移动所扫过的曲面:

莫比乌斯带 (Möbius Strip)

莫比乌斯带是最著名的不可定向曲面——它只有一个面和一条边。将一条纸带扭转 180° 后首尾粘合即可得到:

其中

丰饶角 (Cornucopia)

丰饶角是一种螺旋喇叭形曲面,形似希腊神话中的丰饶之角。它通过指数函数实现半径的递增,创造出优雅的螺旋展开效果:

其中参数 控制横截面的增长率,参数 控制螺旋的展开速率。

参数域与曲面形态的关系

参数域的设置直接影响曲面的形态:

参数域设置适用曲面说明
, 球面u 绕经度一周,v 从北极到南极
, 圆环面两个参数都绕完整一圈
, 螺旋面u 控制径向范围,v 控制旋转
, 莫比乌斯带u 需绕两圈才能闭合

历史背景

参数曲面的研究可以追溯到数学发展的早期。18 世纪,欧拉(Leonhard Euler)率先系统地研究了曲面的参数表示。19 世纪,高斯(Carl Friedrich Gauss)在《关于曲面的一般研究》(Disquisitiones Generales circa Superficies Curvas, 1827)中奠定了曲面微分几何的基础,引入了高斯曲率等核心概念,证明了"绝妙定理"(Theorema Egregium)——曲率是曲面的内蕴性质。

黎曼(Bernhard Riemann)进一步推广了高斯的工作,提出了流形和黎曼几何的概念,为现代几何学奠定了基础。20 世纪,参数曲面成为计算机图形学的核心工具——贝塞尔曲面、NURBS 曲面等都是参数曲面的特例,广泛应用于 CAD 建模、动画制作和科学可视化领域。

支持的数学函数

公式编辑器支持以下标准数学函数:

类别函数说明
三角函数sin, cos, tan, asin, acos, atan角度以弧度为单位
双曲函数sinh, cosh, tanh双曲正弦、余弦、正切
指数对数exp, log, ln, log10, sqrtexp 为自然指数,log/ln 为自然对数
取整函数floor, ceil, round, signfloor 向下取整,ceil 向上取整
其他函数abs, pow, min, max, atan2atan2(y,x) 返回点(x,y)的幅角

内置常量PI(π ≈ 3.14159)、TWO_PI(2π ≈ 6.28318)

提示:在参数域输入框中,也可以使用表达式,如 2*TWO_PIPI/4 等。


界面概览

所有控制项位于右侧的属性面板(Inspector)中,分为六个主要部分:

  1. Geometry(几何):输入曲面方程、调整空间变换
  2. Settings(设置):选择渲染模式、曲面模式、配置参数域和模拟参数
  3. Camera(相机):控制观察视角
  4. Formulas(公式):在场景中显示数学公式和标注
  5. Appearance(外观):调整背景颜色和渐变调色板
  6. Parameters(参数):定义方程中使用的自定义常量

配置指南

1. Geometry(几何设置)

几何设置

方程输入

在 Geometry 面板中,通过三个公式输入框定义曲面的参数方程:

  • x(u,v):定义曲面在 X 轴方向的坐标函数
  • y(u,v):定义曲面在 Y 轴方向的坐标函数
  • z(u,v):定义曲面在 Z 轴方向的坐标函数

公式中可以使用变量 uv,以及自定义参数(在 Parameters 面板中定义)。例如,定义一个圆环面:

x = (R + r * cos(v)) * cos(u)
y = (R + r * cos(v)) * sin(u)
z = r * sin(v)

其中 Rr 是在 Parameters 面板中定义的自定义参数。

提示:公式输入框支持语法高亮和实时验证。输入无效的表达式时,输入框会显示红色边框和错误提示。

空间变换

  • Scale X/Y/Z:三维空间的缩放倍数,默认值 55.0
  • Offset X/Y/Z:三维空间的位置偏移,默认值 0.0

使用技巧

  • 通过调整缩放,可以控制曲面在场景中的大小
  • 通过调整偏移,可以将曲面放置在场景中的任意位置
  • 当场景中包含多个几何体时,使用偏移可以精确控制它们之间的相对位置

2. Settings(设置)

设置面板

渲染模式(Render Mode)

  • CPU:高精度渲染,支持拖尾效果和线宽调整,适合高质量视频导出
  • GPU:高性能渲染,支持数百万粒子,拖尾效果不可用适合实时预览和大规模点云

重要提示:GPU 模式下不支持拖尾效果。如需拖尾,请切换到 CPU 模式。

曲面模式(Surface Mode)

  • POINTS:粒子点云模式,支持流动动画和拖尾效果
  • MESH:网格曲面模式,支持填充、线框、材质和程序纹理
MESH 模式专属参数

网格分辨率

参数说明默认值最小值
u_segmentsU 方向网格分段数602
v_segmentsV 方向网格分段数602

提示:分段数越高,曲面越光滑,但渲染开销也越大。通常 60-100 的分段数已经足够光滑。

缝合控制(用于闭合曲面):

参数说明默认值
wrap_uU 方向首尾缝合关闭
wrap_vV 方向首尾缝合关闭
wrap_threshold缝合判定阈值0.25

重要提示:对于闭合曲面(如球体、圆环),必须启用 wrap_uwrap_v,否则网格会在接缝处出现断裂。wrap_threshold 控制缝合检测的灵敏度——当首尾两端点的距离小于阈值乘以网格对角线长度时,系统会自动将它们缝合。

填充与线框

参数说明默认值
fill启用网格填充开启
fill_opacity填充透明度90%
wireframe启用网格线框开启
wireframe_decoupled解耦线框密度关闭
wireframe_u_linesU 方向线框数量(解耦模式)与 u_segments 相同
wireframe_v_linesV 方向线框数量(解耦模式)与 v_segments 相同
wireframe_weight线框宽度1.0
wireframe_color线框颜色#FFFFFF

技巧:启用 wireframe_decoupled 后,可以独立控制线框的密度,不受网格分段数的限制。这在需要精细网格但稀疏线框时非常有用。

材质与纹理(仅 GPU MESH 模式):

参数说明范围
shininess材质光泽度,控制高光锐度0-100
ambient环境光颜色十六进制颜色值
specular高光颜色十六进制颜色值
procedural_texture程序纹理类型见下表
程序纹理说明
None无纹理,使用纯色填充
Checkerboard棋盘格纹理
Metal金属纹理
Ceramic陶瓷纹理
Carbon碳纤维纹理
POINTS 模式专属参数

分辨率

参数说明默认值
u_segmentsU 方向粒子数量60
v_segmentsV 方向粒子数量60

重要提示:粒子总数 = u_segments × v_segments。过高的分辨率会导致性能下降。建议 CPU 模式不超过 100×100,GPU 模式可达 200×200 或更高。

参数域(Domain)

参数说明示例
u_min / u_max参数 u 的取值范围球面:[0, 2π]
v_min / v_max参数 v 的取值范围球面:[0, π]

提示:参数域输入框支持数学表达式,如 2*TWO_PIPI/4-PI 等。

模拟参数(Simulation)

参数说明默认值
speed_u参数 u 的运动速度0
speed_v参数 v 的运动速度0
periodic_uU 方向周期性边界关闭
periodic_vV 方向周期性边界关闭
flowing_uU 方向流动模式关闭
flowing_vV 方向流动模式关闭

流动模式详解

  • flowing 关闭(乒乓模式):粒子在参数域边界处往返反弹,产生来回运动的效果
  • flowing 开启(流动模式):粒子单向流动并无缝循环,适合制作完美循环动画

重要提示flowing 模式必须配合 periodic 使用。如果曲面不是闭合的(如平面、螺旋面),请勿启用 periodic,否则会产生错误的视觉效果。只有当参数域首尾对应曲面上的同一位置时(如球面的 u 方向),才应启用 periodic


3. Camera(相机控制)

相机设置

调整观察视角和相机参数。与 2D 场景不同,参数曲面是真正的三维对象,相机控制尤为重要。

相机角度

参数说明单位示例
phi相机的方位角(水平旋转角度)弧度PI/4
theta相机的极角(垂直旋转角度)弧度PI/6
gamma相机的滚转角(旋转角度)弧度0

提示:相机角度输入框支持数学表达式,如 PI/4PI/3。也可以使用自定义参数,实现参数驱动的相机动画。

常用视角

视角phithetagamma说明
正面000从正前方观察
俯视PI/200从正上方俯瞰
45° 等距PI/4PI/40经典等距视角
侧面0PI/20从侧面观察

4. Formulas(公式显示)

公式设置

在场景中显示 LaTeX 数学公式,便于教学演示和文档制作。

主方程(Main Equation)

参数说明默认值
show_main_equation是否显示主方程关闭
x主方程显示位置的 X 坐标0
y主方程显示位置的 Y 坐标200
scale主方程的缩放比例1.0
color主方程的颜色#FFFFFF

提示:主方程通常用于显示当前曲面的数学定义。系统会根据当前方程自动生成 LaTeX 公式。

附加公式(Additional Formulas)

点击 Add Formula 按钮可以添加多个公式,每个公式包含:

参数说明示例
latexLaTeX 格式的公式内容x = r \cos(u) \sin(v)
x公式显示位置的 X 坐标0
y公式显示位置的 Y 坐标300
scale公式的缩放比例1.0
color公式的颜色#FFFFFF

应用场景

  • 分步展示数学推导过程
  • 显示多个相关公式
  • 添加注释和说明文字

注意:公式位置使用屏幕坐标,左上角为原点,X 轴向右为正,Y 轴向下为正。


5. Appearance(外观设置)

外观设置

背景颜色

  • background_color:场景背景颜色。深色背景(如黑色 #000000)通常能更好地突出曲面的细节和色彩。

粒子与线条(POINTS 模式)

参数说明默认值
dot_size粒子点的大小1.68
line_weight拖尾线条宽度1.0

拖尾效果(POINTS 模式,仅 CPU)

参数说明默认值建议范围
show_trails显示运动拖尾关闭
fade_trails拖尾渐隐效果关闭
trail_lifetime拖尾持续时间(秒)55-10 秒

重要警告trail_lifetime 超过 15 秒可能导致内存占用过高,建议控制在 5-10 秒范围内。

调色板(颜色渐变)

参数曲面使用 1D LUT(查找表)纹理进行着色,支持三种渐变模式:

  • Manual(手动模式)

    • 点击渐变条添加颜色控制点
    • 拖动控制点调整位置
    • 双击控制点修改颜色
    • 支持最多 25 个颜色控制点
    • 可选择随机策略(单色、类似色、互补色、分裂互补色)
  • Cosine(余弦模式)

    • 使用 IQ 余弦调色板公式:color(t) = a + b · cos(2π(c·t + d))
    • 分别控制 R/G/B 三个通道的偏移、振幅、频率和相位
    • 支持一键随机化和应用
    • 适合生成彩虹、金属等连续渐变效果
  • Curve(曲线模式)

    • 通过可编辑的贝塞尔曲线分别控制 R/G/B 三个通道
    • 提供最灵活的颜色控制
    • 支持一键随机化和应用

重要提示:对于闭合曲面,系统会自动检测并应用闭环渐变,确保颜色在接缝处平滑过渡。如仍有问题,可手动调整调色板,确保首尾颜色一致。


6. Parameters(自定义参数)

在此处定义自定义变量,可在几何公式中直接引用。每个参数包含:

  • Name:参数名称(如 aRr 等)
  • Value:参数值(支持小数)

添加参数:在底部输入框中输入参数名和初始值,点击添加按钮即可。

删除参数:点击参数右侧的删除按钮移除。

动态效果:修改参数值会实时更新曲面形状,可用于:

  • 探索参数对曲面形态的影响
  • 配合参数动画创建动态效果
  • 快速切换不同参数组合

动画和时间线

参数曲面支持丰富的动画类型,通过时间线系统可以编排复杂的动画序列。

1. 参数流动动画

通过设置 speed_uspeed_v,让粒子沿参数曲线流动,创造流体效果。

配置步骤

  1. 在 Settings 面板中设置 speed_uspeed_v 为非零值(如 0.15)
  2. 如果曲面闭合,启用 periodic_uperiodic_v
  3. 启用 flowing_uflowing_v(实现无缝循环)
  4. 调整 trail_lifetime 控制拖尾长度(CPU 模式)

应用场景:展示曲面上的流场、磁力线、等高线流动等

2. 参数振荡动画

通过时间线中的 paramStart / paramStop 动作,让自定义参数在指定范围内做周期性正弦振荡,实现曲面形态的动态演化。

工作原理

  1. 为每个参数指定振荡的步长(step)、范围(min, max)
  2. 参数值在 [min, max] 范围内做正弦振荡:value = mid + amp * sin(phase)
  3. 振荡速度由步长控制
  4. 可以启用/禁用单个参数的振荡

配置方法

在时间线中添加 paramStart 动作,然后在参数列表中添加要动画化的参数:

json
{
  "type": "animate",
  "duration": 10.0,
  "easing": "SINE_IN_OUT",
  "actions": [
    {
      "method": "paramStart",
      "args": [{
        "targetDomain": "SURFACE",
        "parameters": {
          "a": {
            "enable": true,
            "step": 0.01,
            "min": 0.02,
            "max": 0.08
          }
        }
      }]
    }
  ]
}

可动画化的参数

所有在 Parameters 面板中定义的自定义参数都支持动画。此外,还支持以下域参数:

参数说明默认振荡范围
scale整体缩放0.5 - 1.5
phaseDensity相位密度5.0 - 10.0
modDensity调制密度5.0 - 10.0
phaseSharpness相位锐度0.001 - 2.0
modSharpness调制锐度0.001 - 2.0

3. 相机动画

通过时间线系统实现环绕、缩放、平移等视角变化。

可用的相机动画方法

方法说明参数
rotatePhi旋转方位角delta(弧度增量)
rotateTheta旋转极角delta(弧度增量)
rotateGamma旋转滚转角delta(弧度增量)
rotateTo旋转到指定角度phi, theta, gamma
zoom缩放zoomLevel
focal调整焦距focalLength
track跟踪粒子index
stopTracking停止跟踪
ambient环绕旋转phi_speed, theta_speed, gamma_speed
stopAmbient停止环绕

4. 渐变动画

通过 gradientStart / gradientStop 动作,让调色板颜色随时间变化。

渐变动画模式

模式说明
HUE_ROTATE色相旋转,颜色沿色轮循环
OFFSET_CYCLE偏移循环,颜色沿渐变条循环移动
CROSS_FADE交叉淡入淡出
PALETTE_MORPH调色板变形

插值方式

方式说明
OKLABOKLAB 色彩空间插值(推荐,感知均匀)
OKLCHOKLCH 色彩空间插值
LINEAR线性 RGB 插值
RGB标准 RGB 插值

5. 模式切换动画

通过 SurfaceModeTransition 动画类型,可以在 POINTS 和 MESH 模式之间平滑过渡。

配置方法

在时间线中添加 SURFACE_MODE_TRANSITION 类型的片段,设置目标模式(POINTS 或 MESH)。

配置示例:Cornucopia 场景动画

以下是一个完整的时间线配置示例,展示了 Cornucopia 场景的动画编排:

json
{
  "timeline": [
    {
      "type": "wait",
      "duration": 4.0,
      "easing": "SINE_IN_OUT"
    },
    {
      "type": "animate",
      "duration": 10.0,
      "easing": "SINE_IN_OUT",
      "actions": [
        {"method": "rotatePhi", "args": [6.283]}
      ]
    },
    {
      "type": "animate",
      "duration": 0.5,
      "easing": "SINE_IN_OUT",
      "actions": [
        {"method": "ambient", "args": [0.3, 0.3, 0.3]}
      ]
    },
    {
      "type": "animate",
      "duration": 5.0,
      "easing": "SINE_IN_OUT",
      "actions": [
        {"method": "zoom", "args": [5]},
        {"method": "focal", "args": [3.8]}
      ]
    },
    {
      "type": "animate",
      "duration": 5.0,
      "easing": "LINEAR",
      "actions": [
        {"method": "zoom", "args": [0.8]},
        {"method": "focal", "args": [25]}
      ]
    },
    {
      "type": "animate",
      "duration": 0.5,
      "easing": "SINE_IN_OUT",
      "actions": [
        {"method": "stopAmbient", "args": []}
      ]
    },
    {
      "type": "align",
      "duration": 12.0,
      "easing": "LINEAR",
      "target_phi": 0,
      "target_theta": 0,
      "target_gamma": 1.5708
    }
  ]
}

经典参数曲面示例

丰饶角 (Cornucopia)

丰饶角是本场景的代表性示例,展示了指数函数如何创造优雅的螺旋曲面。

方程:
x = exp(b*v) * cos(v) + exp(a*v) * cos(u) * cos(v)
y = exp(b*v) * sin(v) + exp(a*v) * cos(u) * sin(v)
z = exp(a*v) * sin(u)

参数:a = 0.05, b = 0.055
参数域:u ∈ [-2*TWO_PI, 2*TWO_PI], v ∈ [0, TWO_PI]
渲染模式:CPU, POINTS
粒子数:33 × 28
流动速度:speed_u = 0.15, speed_v = 0.15
拖尾:开启,渐隐,5 秒

丰饶角示例

球面 (Sphere)

方程:
x = cos(u) * sin(v)
y = sin(u) * sin(v)
z = cos(v)

参数域:u ∈ [0, TWO_PI], v ∈ [0, PI]
渲染模式:GPU, MESH
网格分段:60 × 60
缝合:wrap_u = 开启, wrap_v = 关闭

圆环面 (Torus)

方程:
x = (R + r * cos(v)) * cos(u)
y = (R + r * cos(v)) * sin(u)
z = r * sin(v)

参数:R = 1.0, r = 0.4
参数域:u ∈ [0, TWO_PI], v ∈ [0, TWO_PI]
渲染模式:GPU, MESH
缝合:wrap_u = 开启, wrap_v = 开启

莫比乌斯带 (Möbius Strip)

方程:
x = (1 + t/2 * cos(u/2)) * cos(u)
y = (1 + t/2 * cos(u/2)) * sin(u)
z = t/2 * sin(u/2)

参数域:u ∈ [0, TWO_PI], t ∈ [-1, 1]
渲染模式:GPU, MESH
注意:莫比乌斯带不可定向,wrap_u 不应开启

螺旋面 (Helicoid)

方程:
x = u * cos(v)
y = u * sin(v)
z = 0.5 * v

参数域:u ∈ [-2, 2], v ∈ [0, TWO_PI]
渲染模式:GPU, MESH
流动效果:speed_v = 0.2, periodic_v = 开启, flowing_v = 开启

性能与最佳实践

推荐配置

目标渲染模式曲面模式分段数拖尾性能
高质量视频导出CPUPOINTS50-1005-10 秒30-60 FPS
实时流畅预览GPUPOINTS200+不可用60+ FPS
大规模点云GPUPOINTS300+不可用30-60 FPS
光滑曲面展示GPUMESH60-10060 FPS
教学演示CPUPOINTS30-505 秒60 FPS

性能优化技巧

  1. 渲染模式选择

    • 需要拖尾效果 → 使用 CPU 模式
    • 需要高分辨率粒子 → 使用 GPU 模式
    • 需要材质和纹理 → 使用 GPU MESH 模式
  2. 分辨率控制

    • 粒子总数 = u_segments × v_segments
    • CPU 模式建议不超过 100×100(10,000 粒子)
    • GPU 模式可达 200×200 或更高(40,000+ 粒子)
    • MESH 模式 60-100 分段通常已足够光滑
  3. 拖尾优化

    • trail_lifetime 不宜过长,建议 5-10 秒
    • 启用 fade_trails 可以让拖尾自然渐隐,视觉效果更好
    • 过长的拖尾会消耗大量内存
  4. 闭合曲面处理

    • 正确设置参数域范围(如
    • 启用 periodic_uperiodic_v(POINTS 模式流动时)
    • 启用 wrap_uwrap_v(MESH 模式缝合时)
    • 调整 wrap_threshold 优化接缝(默认 0.25)

常见问题

界面卡顿

问题:操作界面时出现卡顿或延迟

原因:粒子数量过多或拖尾时长过大

解决方案

  • 降低 u_segmentsv_segments
  • 降低 trail_lifetime
  • 切换到 GPU 模式(注意:GPU 模式不支持拖尾)

没有拖尾效果

问题:启用了 show_trails 但看不到拖尾

原因:处于 GPU 模式

解决方案:切换到 CPU 模式,并启用 show_trails

网格在接缝处断裂

问题:MESH 模式下,闭合曲面在接缝处出现缝隙

原因:未正确设置缝合选项

解决方案

  1. 检查参数域范围是否正确(如球面
  2. 启用 wrap_uwrap_v
  3. 调整 wrap_threshold 值(增大阈值可以缝合更大的缝隙)

曲面显示不完整

问题:曲面只显示了一部分

原因:参数域范围设置不当

解决方案

  • 检查 u_minu_maxv_minv_max 是否覆盖了完整的参数范围
  • 检查缩放(Scale)是否过大导致曲面超出视野
  • 调整偏移(Offset)将曲面移入视野

颜色在接缝处不连续

问题:闭合曲面的颜色在接缝处出现跳变

原因:调色板未应用闭环渐变

解决方案:系统会自动检测闭合曲面并应用闭环渐变。如仍有问题,可手动调整调色板,确保首尾颜色一致。

公式输入错误

常见错误

  • 函数名拼写错误(如 Sin 应为 sinCos 应为 cos
  • 参数名未定义(需在 Parameters 面板先定义后才能在方程中引用)
  • 括号不匹配
  • 除零或负数开方

解决方案:检查公式语法,确保所有参数已定义,避免数学上的非法操作。输入框会实时显示验证结果。

粒子流动方向不对

问题:启用了流动模式但粒子运动方向异常

原因flowing 模式未配合 periodic 使用,或曲面不闭合却启用了 periodic

解决方案

  • flowing 模式必须配合 periodic 使用
  • 只有闭合曲面(参数域首尾对应同一位置)才应启用 periodic
  • 非闭合曲面应使用乒乓模式(不启用 flowing

创作技巧

参数探索

  1. 从经典曲面开始:选择一个经典曲面(如球面、圆环面)作为起点,逐步修改方程
  2. 提取参数:将方程中的常数提取为自定义参数,便于调整和动画
  3. 小步修改:每次只修改一个参数或方程的一项,观察变化
  4. 混合方程:尝试将两个曲面的方程组合,创造新的形态

视觉调优

  1. 渲染模式选择

    • 需要展示曲面形态 → MESH 模式,启用填充和线框
    • 需要展示流动效果 → POINTS 模式,CPU 渲染,启用拖尾
    • 需要高粒子密度 → POINTS 模式,GPU 渲染
  2. 着色方案

    • 使用余弦调色板模式快速生成和谐的色彩方案
    • 深色背景配合高饱和度色彩通常效果最佳
    • 闭合曲面注意确保首尾颜色一致
  3. 相机角度

    • 45° 等距视角适合展示三维形态
    • 配合相机环绕动画可以全方位展示曲面
    • 使用焦距(focal)调整可以改变透视效果

动画设计

  1. 参数振荡

    • 为自定义参数设置振荡动画,观察曲面形态的连续变化
    • 不同参数以不同速率振荡,创造复杂的形态演变
    • 适合制作形态渐变的教学动画
  2. 粒子流动

    • 设置 speed_u 和 speed_v 让粒子在曲面上流动
    • 配合拖尾效果展示流场方向
    • 启用 flowing 模式实现完美循环
  3. 相机运动

    • 环绕动画(ambient)可以全方位展示曲面
    • 缩放动画可以揭示细节结构
    • 跟踪(track)可以让相机跟随特定粒子
  4. 渐变动画

    • 色相旋转(HUE_ROTATE)创造彩虹流动效果
    • 偏移循环(OFFSET_CYCLE)让颜色沿曲面流动
    • 配合 OKLAB 插值确保颜色过渡自然

公式编写技巧

  1. 使用自定义参数:将公式中的常数提取为参数,便于调整和动画
  2. 注意参数范围:确保公式在参数域内处处有定义,避免除零、负数开方等
  3. 利用周期性:对于周期函数,参数域可设为
  4. 分段函数:可使用 minmaxabs 等函数实现分段效果
  5. 指数函数exp() 函数可以创造递增/递减的螺旋效果(如 Cornucopia)

技术细节

渲染管线

参数曲面根据渲染模式和曲面模式使用不同的渲染管线:

POINTS + CPU 模式

  1. CPU 端计算每个粒子的位置
  2. 支持拖尾效果:记录粒子历史位置,绘制为线段
  3. 支持线宽调整和渐隐效果
  4. 适合高质量视频导出

POINTS + GPU 模式

  1. GPU 着色器并行计算粒子位置
  2. 使用纹理存储粒子状态
  3. 不支持拖尾效果
  4. 支持百万级粒子实时渲染

MESH 模式

  1. 根据分段数生成三角形网格
  2. 顶点着色器计算网格顶点位置
  3. 片段着色器处理光照、材质和纹理
  4. 支持填充、线框和程序纹理

缝合算法

对于闭合曲面,MESH 模式使用缝合算法消除接缝:

  1. 检测参数域首尾两端的网格顶点
  2. 当两端点的距离小于 wrap_threshold × 对角线长度 时,将它们识别为同一顶点
  3. 合并这些顶点,生成连续的三角形网格
  4. 自动调整纹理坐标,确保颜色在接缝处连续

参数动画系统

参数曲面的参数动画通过 SurfaceParameterAnimator 实现:

  • 支持自定义参数的正弦振荡动画
  • 每个参数独立控制步长、范围和启用状态
  • 动画参数通过 Uniform 变量传递给 GPU 着色器,无需重编译
  • 支持平滑启动和停止

进阶主题

理解参数曲面的几何性质

参数曲面的几何性质由第一基本形式和第二基本形式决定:

  • 第一基本形式:描述曲面上的度量(距离、角度、面积),由偏导数 的内积决定
  • 第二基本形式:描述曲面的弯曲程度,由曲面法向量和二阶偏导数决定
  • 高斯曲率,其中 是主曲率。高斯曲率为正的点是椭圆点(如球面),为负的点是双曲点(如马鞍面),为零的点是抛物点(如圆柱面)

创建自定义曲面

虽然系统提供了经典曲面的方程,但你可以通过修改方程创造全新的曲面形态:

  1. 变形:在现有方程基础上添加扰动项,如 x = ... + a * sin(3*u) * cos(2*v)
  2. 混合:将两个曲面的方程加权组合,如 x = t * f1(u,v) + (1-t) * f2(u,v)
  3. 参数化:将方程中的常数替换为可调参数,探索参数空间
  4. 复合:将一个曲面的输出作为另一个曲面的输入

CPU 与 GPU 模式的选择策略

考虑因素CPU 模式GPU 模式
拖尾效果✅ 支持❌ 不支持
粒子数量≤ 10,000≤ 400,000+
渲染精度
实时性
视频导出推荐可用
材质纹理❌ 不支持✅ 支持(MESH 模式)

更多效果展示

参数曲面示例 1参数曲面示例 2


参考资源

数学理论

  • Carl Friedrich Gauss - Disquisitiones Generales circa Superficies Curvas (1827)
  • Manfredo P. do Carmo - Differential Geometry of Curves and Surfaces
  • Erwin Kreyszig - Differential Geometry

在线资源

软件文档

  • OpenGL 着色器编程指南
  • GLSL 语言规范

All rights reserved.