可以帮我写一段python3生成3d山脉效果图像的代码吗
时间: 2023-07-16 17:16:25 浏览: 157
当然可以,以下是一个简单的例子,使用Perlin Noise算法生成3D山脉效果图像。
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 生成3D山脉
def generate_mountain(size):
# 创建x,y平面的网格点
X, Y = np.meshgrid(np.arange(size), np.arange(size))
# 使用Perlin Noise算法生成高度图
noise = np.zeros((size, size))
octaves = 6
persistence = 0.5
for i in range(octaves):
freq = 2 ** i
amp = persistence ** i
noise += amp * perlin_noise(X / freq, Y / freq)
# 归一化高度值
noise = (noise - np.min(noise)) / (np.max(noise) - np.min(noise))
# 生成山脉
mountain = np.zeros((size, size, 3))
mountain[:, :, 1] = noise
return mountain
# Perlin Noise算法
def perlin_noise(x, y):
# 将x,y坐标缩放到0-255之间
X, Y = x.astype(int) % 255, y.astype(int) % 255
# 计算x,y坐标的小数部分
xf, yf = x - np.floor(x), y - np.floor(y)
# 计算x,y坐标的梯度
u, v = fade(xf), fade(yf)
p = permutation()
# 计算x,y坐标在梯度中的位置
A, AA = p[X] + Y, p[X+1] + Y
B, BA = p[A] + 1, p[AA] + 1
# 计算x,y坐标对应的梯度向量
grad_AA = grad(p[A], xf, yf)
grad_BA = grad(p[BA], xf-1, yf)
grad_AB = grad(p[A+1], xf, yf-1)
grad_BB = grad(p[BA+1], xf-1, yf-1)
# 计算x,y坐标的权重
x1 = lerp(grad_AA, grad_BA, u)
x2 = lerp(grad_AB, grad_BB, u)
return lerp(x1, x2, v)
# 缓和函数
def fade(t):
return 6*t**5 - 15*t**4 + 10*t**3
# 插值函数
def lerp(a, b, t):
return a + t * (b - a)
# 梯度向量
def grad(h, x, y):
h = h % 4
if h == 0:
return x
elif h == 1:
return -x
elif h == 2:
return y
else:
return -y
# 随机排列
def permutation():
p = np.arange(256, dtype=int)
np.random.shuffle(p)
return np.tile(p, 2)
# 生成山脉
mountain = generate_mountain(100)
# 显示3D图像
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(np.arange(mountain.shape[1]), np.arange(mountain.shape[0]))
Z = mountain[:, :, 1]
ax.plot_surface(X, Y, Z, cmap='terrain')
plt.show()
```
这段代码会生成一个100x100的3D山脉效果图像,你可以根据需要修改size参数来调整图像大小。
阅读全文