如何在Plotly_go的3D投影上绘制2D布局?实现3D射门与2D球场结合
解决方案:3D射门轨迹投影到2D足球场
核心思路
把3D轨迹的三维坐标(x, y, z)投影到2D球场的平面(通常取x-y平面,忽略高度z,或按需用正交/透视投影规则计算),再将投影后的2D点集与预先绘制的2D足球场背景叠加显示。
具体实现步骤(以Matplotlib为例)
绘制2D足球场底图
用matplotlib.patches构建标准足球场的边界、禁区、球门等元素,确保坐标范围匹配真实球场尺寸:import matplotlib.pyplot as plt import matplotlib.patches as patches # 创建画布与轴 fig, ax = plt.subplots(figsize=(12, 8)) # 绘制球场边界 field = patches.Rectangle((0, 0), 105, 68, linewidth=2, edgecolor='green', facecolor='none') ax.add_patch(field) # 补充绘制中线、中圈、禁区、球门(示例简化) ax.plot([52.5, 52.5], [0, 68], color='green', linewidth=2) center_circle = patches.Circle((52.5, 34), 9.15, linewidth=2, edgecolor='green', facecolor='none') ax.add_patch(center_circle) # 匹配球场坐标范围 ax.set_xlim(-5, 110) ax.set_ylim(-5, 73) ax.set_aspect('equal')处理3D轨迹的投影转换
从3D轨迹数据中提取x、y坐标作为正交投影结果;若需透视投影,可结合相机矩阵计算,足球场景下正交投影足够:# 替换为你的真实3D轨迹数据 trajectory_3d = [ (10, 34, 0.5), (20, 34, 1.2), (30, 34, 2.0), (40, 34, 1.8), (50, 34, 1.0), (60, 34, 0.3), (70, 32, 0.1) ] # 提取x、y生成2D投影点 x_proj = [point[0] for point in trajectory_3d] y_proj = [point[1] for point in trajectory_3d] z_values = [point[2] for point in trajectory_3d]叠加投影轨迹到2D球场
在同一轴上绘制轨迹线、关键节点,可通过颜色映射保留高度信息:# 绘制轨迹线 ax.plot(x_proj, y_proj, color='red', linewidth=2, label='射门轨迹投影') # 标记起点与落点 ax.scatter(x_proj[0], y_proj[0], color='blue', s=100, label='射门起点') ax.scatter(x_proj[-1], y_proj[-1], color='orange', s=100, label='射门落点') # 用颜色展示射门高度 scatter = ax.scatter(x_proj, y_proj, c=z_values, cmap='viridis', s=80) plt.colorbar(scatter, label='射门高度(m)') ax.legend() plt.show()
关键注意事项
- 确保3D轨迹坐标与2D球场坐标系统对齐:比如3D数据的x/y范围要和球场尺寸匹配,避免轨迹超出球场区域。
- 若使用现成球场图片作为背景,需通过
ax.imshow()导入后调整坐标映射,让轨迹坐标与图片像素坐标对应。
内容的提问来源于stack exchange,提问作者Aditya Bhargav
相关产品推荐
相关产品推荐

