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

如何模拟并展示盒中气体粒子运动?代码无动画输出求助

盒子粒子动画静态无效果的修复方案

核心问题分析

  1. 2D坐标轴不支持3D散点更新:你用默认的2D坐标轴创建散点,却试图更新3D偏移量,导致画面无法响应数据变化,只显示初始静态图。
  2. 每帧一次性跑完所有时间步:update函数里的for i in range(Nt)会在单帧内执行完所有演化,直接跳到最终状态,没有中间帧的动态过程。
  3. 碰撞处理逻辑漏洞:先移动粒子再修正碰撞的方式会导致位置计算偏差,且未处理底部墙体的碰撞边界。

修正后的代码

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

# 补充常量定义(根据需求调整数值)
N = 1000
Lz = 10.0
dz = 10.0
Tw = 1.0
dt = 0.01
Nt = 100  # 动画总帧数

# 创建3D画布与坐标轴
fig = plt.figure(figsize=(4, 4), dpi=80)
ax = fig.add_subplot(projection='3d')
# 设置坐标轴范围,匹配盒子尺寸
ax.set_xlim(0, dz)
ax.set_ylim(0, dz)
ax.set_zlim(0, Lz)

# 初始化粒子位置与速度
x = dz * np.random.random(N)
y = dz * np.random.random(N)
z = Lz * np.random.random(N)
vx = np.random.normal(0, Tw, N)
vy = np.random.normal(0, Tw, N)
vz = np.random.normal(0, Tw, N)

# 创建3D散点图
scatter = ax.scatter(x, y, z, s=0.1)

def update(frame):
    """每帧执行一次时间步演化"""
    global x, y, z, vx, vy, vz
    
    # 粒子漂移:按速度移动
    x += dt * vx
    y += dt * vy
    z += dt * vz
    
    # 处理顶部墙(z=Lz)镜面碰撞
    hit_top = z > Lz
    if np.any(hit_top):
        dt_ac = (z[hit_top] - Lz) / vz[hit_top]  # 碰撞后剩余时间
        vz[hit_top] = -vz[hit_top]               # 反转法向速度
        z[hit_top] = Lz + dt_ac * vz[hit_top]    # 修正碰撞后的位置
    
    # 补充底部墙(z=0)镜面碰撞处理
    hit_bottom = z < 0
    if np.any(hit_bottom):
        dt_ac = z[hit_bottom] / vz[hit_bottom]
        vz[hit_bottom] = -vz[hit_bottom]
        z[hit_bottom] = 0 + dt_ac * vz[hit_bottom]
    
    # 更新散点的3D位置
    scatter._offsets3d = (x, y, z)
    
    return scatter,

# 创建动画:每帧调用update,启用blit提升渲染效率
animation = FuncAnimation(fig, update, frames=Nt, interval=50, blit=True)

plt.show()

关键修改说明

  • 3D坐标轴支持:用add_subplot(projection='3d')创建3D坐标轴,确保散点能正确响应3D位置更新。
  • 单帧单步演化:移除全量时间步循环,让每帧对应一次dt的运动,动画会逐步展示粒子动态。
  • 完善边界碰撞:补充底部墙碰撞逻辑,修正位置计算时序,避免粒子穿透墙体。
  • 性能优化:启用blit=True,只更新画面中变化的部分,提升动画流畅度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:17:20