You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Matplotlib创建Bezier曲面模拟流体的单轴高度异常问题

使用Bezier曲面模拟流体的问题

我尝试用Bezier曲面模拟流体(水),但当前实现存在问题:生成的曲面在某一轴上所有点高度一致,既不符合流体形态,也不具备标准Bezier曲面的特征。

以下是我的代码:

import numpy as np
import matplotlib.pyplot as plt

n = 10 # 网格大小
X = np.arange(0, 1, 1/n)
Y = np.arange(0, 1, 1/n)
X, Y = np.meshgrid(X,Y)
Z = np.zeros((n,n))
# 尝试生成连续的随机控制点以得到自然曲面
Z[0] = np.random.random()
for i in range(n - 1):
    Z[i + 1] = Z[i] * (1 + 0.5 * np.random.normal())
for i in range(n):
    for j in range(n - 1):
        Z[i][j + 1] += Z[i][j] * (1 + 0.5 * np.random.normal())

d = 2*n # 细分数量(每个控制点对应2个细分点)

u, v = np.linspace(0, 1, d), np.linspace(0, 1, d) # 参数变量

binome = lambda n, k : np.math.factorial(n) / (np.math.factorial(k) * np.math.factorial(n - k))
bernstein = lambda n, k, t : binome(n, k) * t**k * (1 - t)**(n-k)

def bezier(X,Y,Z):
    xBezier = np.zeros((d, d))
    yBezier = np.zeros((d, d))
    zBezier = np.zeros((d, d))

    for i in range(n):
        for j in range(n): # 计算Bezier曲面
            xBezier += bernstein(n - 1, i, u) * bernstein(n - 1, j, v) * X[i, j]
            yBezier += bernstein(n - 1, i, u) * bernstein(n - 1, j, v) * Y[i, j]
            zBezier += bernstein(n - 1, i, u) * bernstein(n - 1, j, v) * Z[i, j]

    return(xBezier, yBezier, zBezier)

xBezier, yBezier, zBezier = bezier(X, Y, Z)

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.plot_surface(xBezier.T, yBezier, zBezier, cmap=plt.cm.Blues, vmin=zBezier.min() * 0.8)
ax.scatter(X, Y, Z, edgecolors = 'face', color='tab:red')
plt.show()

我期望实现的效果是带有自然起伏的流体曲面,参考示例图:
带有自然起伏的流体Bezier曲面


内容的提问来源于stack exchange,提问作者astral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:27:27