如何使用pyqtgraph实现地球轨道3D动态绘制?
解决方案:3D动态轨道绘制(带渐隐轨迹)
针对你的需求,我们可以修改代码实现随时间迭代绘制轨迹点,同时保留最近10个点的渐隐效果,并通过Qt定时器控制播放启停。以下是完整实现:
核心修改点
- 新增状态变量追踪当前播放位置、轨迹保留长度
- 每次定时器触发时,推进播放进度,截取最近的轨迹点
- 给轨迹点设置渐变透明度(最新点不透明,最旧点完全透明)
- 添加太阳和当前地球的可视化标识
- 支持键盘空格控制播放启停
完整代码
from pyqtgraph.Qt import QtCore, QtGui, QtWidgets import pyqtgraph.opengl as gl import numpy as np import pandas as pd app = QtWidgets.QApplication([]) w = gl.GLViewWidget() w.opts['distance'] = 50 w.show() w.setWindowTitle('地球绕太阳轨道模拟') # 添加坐标轴 ax = gl.GLAxisItem() ax.setSize(50, 50, 50) w.addItem(ax) # 加载轨道数据 df = pd.read_csv("Orbit.csv") # 转换为numpy数组,方便索引 time_array = df['TimeDiff'].values pos_array = df[['X', 'Y', 'Z']].values # 调整坐标顺序(匹配3D视图的坐标轴) pos_array = pos_array[:, [2, 0, 1]] # Z->X, X->Y, Y->Z # 播放控制参数 current_idx = 0 # 当前播放到的点索引 trail_length = 10 # 保留的渐隐轨迹长度 is_playing = True # 播放状态 speed = 1.0 # 播放速度倍率 # 添加太阳(中心黄色球体) sun = gl.GLScatterPlotItem(pos=np.array([[0, 0, 0]]), color=(1, 1, 0, 1), size=5) w.addItem(sun) # 初始化轨迹点和当前地球的绘制项 trail_points = gl.GLScatterPlotItem(pos=np.empty((0, 3)), color=np.empty((0, 4)), size=2) current_earth = gl.GLScatterPlotItem(pos=np.array([pos_array[0]]), color=(0, 0, 1, 1), size=3) w.addItem(trail_points) w.addItem(current_earth) def update(): global current_idx if not is_playing: return # 更新当前播放位置 current_idx += int(speed) if current_idx >= len(pos_array): current_idx = 0 # 循环播放 # 截取最近的trail_length个点 start_idx = max(0, current_idx - trail_length + 1) current_trail_pos = pos_array[start_idx:current_idx+1] # 设置渐隐颜色:最新点不透明,最旧点透明 color = np.ones((len(current_trail_pos), 4)) color[:, :3] = (0, 1, 0) # 轨迹用绿色 # 透明度从0到1渐变 alpha_values = np.linspace(0, 1, len(current_trail_pos)) color[:, 3] = alpha_values # 更新轨迹和当前地球的位置 trail_points.setData(pos=current_trail_pos, color=color) current_earth.setData(pos=np.array([pos_array[current_idx]])) # 定时器设置 timer = QtCore.QTimer() timer.timeout.connect(update) timer.start(50) # 每50ms更新一次,可调整速度 # 键盘事件控制启停 def keyPressEvent(event): global is_playing if event.key() == QtCore.Qt.Key_Space: is_playing = not is_playing w.keyPressEvent = keyPressEvent if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtWidgets.QApplication.instance().exec_()
代码说明
- 数据处理:将CSV中的坐标转换为numpy数组,调整坐标轴顺序适配3D视图
- 播放控制:
current_idx追踪当前播放位置,is_playing控制启停,按空格键可切换状态 - 渐隐轨迹:每次更新时截取最近10个点,给这些点设置从0到1的透明度渐变,实现轨迹渐隐效果
- 可视化增强:添加了中心的太阳(黄色大球)和当前位置的地球(蓝色小球),让轨道模拟更直观
- 循环播放:当播放到最后一个点时,自动回到起点循环
内容的提问来源于stack exchange,提问作者Mingshuo Ji
相关产品推荐
相关产品推荐

