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

如何使用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_()

代码说明

  1. 数据处理:将CSV中的坐标转换为numpy数组,调整坐标轴顺序适配3D视图
  2. 播放控制:current_idx追踪当前播放位置,is_playing控制启停,按空格键可切换状态
  3. 渐隐轨迹:每次更新时截取最近10个点,给这些点设置从0到1的透明度渐变,实现轨迹渐隐效果
  4. 可视化增强:添加了中心的太阳(黄色大球)和当前位置的地球(蓝色小球),让轨道模拟更直观
  5. 循环播放:当播放到最后一个点时,自动回到起点循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:51:00