使用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()
我期望实现的效果是带有自然起伏的流体曲面,参考示例图:
内容的提问来源于stack exchange,提问作者astral
相关产品推荐
相关产品推荐

