### 3D 动态圣诞树 Python 实现
使用 `matplotlib` 和 `numpy` 可以创建一个动态旋转的 3D 圣诞树。以下代码结合参数化曲面与动画功能,生成一个绿色锥形树体,并添加装饰点和动态旋转效果[^1]。
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
# 参数设置
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_zlim(0, 10)
ax.set_facecolor('black')
ax.grid(False)
ax.axis('off')
# 生成圣诞树的点云
def generate_christmas_tree(u, v):
u = u * 2 * np.pi
v = v * 4
x = v * np.cos(u) * (1 - v / 10)
y = v * np.sin(u) * (1 - v / 10)
z = v
return x, y, z
# 装饰物(随机分布的小球)
decoration_angles = np.random.rand(15) * 2 * np.pi
decoration_heights = np.random.rand(15) * 6 + 2
decoration_colors = np.random.choice(['red', 'gold', 'blue', 'silver'], size=15)
u = np.linspace(0, 1, 20)
v = np.linspace(0, 1, 20)
U, V = np.meshgrid(u, v)
X, Y, Z = generate_christmas_tree(U, V)
tree_surface = ax.plot_surface(X, Y, Z, color='forestgreen', alpha=0.9, edgecolor='none', shade=True)[^1]
# 添加装饰点
deco_x = decoration_heights * np.cos(decoration_angles) * (1 - decoration_heights / 10)
deco_y = decoration_heights * np.sin(decoration_angles) * (1 - decoration_heights / 10)
deco_z = decoration_heights
scat = ax.scatter(deco_x, deco_y, deco_z, color=decoration_colors, s=50, edgecolors='white', linewidth=1.2)[^1]
# 动画更新函数
angle = 0
def update(frame):
global angle
angle += 1
ax.view_init(elev=20, azim=angle)
return tree_surface, scat[^1]
ani = FuncAnimation(fig, update, frames=np.arange(0, 360, 2), interval=50, blit=False)
plt.show()
```
该实现中,树的形状通过极坐标参数方程构建,形成逐渐收窄的锥形结构。装饰点随机分布在树的不同高度上,模拟彩球效果。动画通过不断更新视角方位角实现自动旋转视觉效果[^1]。
### 光效增强版本(可选)
可通过添加闪烁灯光效果进一步提升视觉表现:
```python
# 模拟闪烁灯光
lights_x = []
lights_y = []
lights_z = []
lights_color = []
for _ in range(30):
h = np.random.rand() * 8
angle_light = np.random.rand() * 2 * np.pi
r = h * 0.6 * (1 - h / 10)
lights_x.append(r * np.cos(angle_light))
lights_y.append(r * np.sin(angle_light))
lights_z.append(h)
lights_color.append(np.random.choice(['yellow', 'red', 'cyan', 'magenta']))
light_points = ax.scatter(lights_x, lights_y, lights_z, color='yellow', s=30, alpha=0.8)[^1]
def update_with_lights(frame):
ax.view_init(elev=20, azim=frame)
# 随机改变部分灯光颜色或透明度
new_colors = np.random.choice(['yellow', 'red', 'cyan'], size=len(lights_x))
light_points.set_color(new_colors)
light_points.set_alpha(np.random.rand() * 0.5 + 0.5)
return tree_surface, scat, light_points[^1]
ani = FuncAnimation(fig, update_with_lights, frames=np.arange(0, 360, 3), interval=100, blit=False)[^1]
plt.show()
```
此版本在树体表面添加了更多动态光源点,使其呈现闪烁效果,增强节日氛围[^1]。