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

如何用Python实现5D多面体的可交互5维旋转可视化?

5维多面体的交互式5D旋转可视化实现

5维多面体(5D Polytopes)在弦理论(比如论文《Modularity of strings on F-theory backgrounds》)中有着重要作用,论文《A completely unambiguous 5-polyhedral graph》提供了这类多面体的绘制思路。通过将5D空间投影到3D的方式可实现基础可视化,但要达成真实的5维旋转交互效果,需每次操作时先在5D空间旋转顶点,再重新执行5D到3D的投影,而非仅在3D空间旋转模型。

核心实现思路

实现真实5D旋转交互的关键:

  • 针对5D空间的不同轴对(比如第0-1维、2-3维、4-0维等)生成旋转变换矩阵
  • 通过交互控件触发旋转参数更新,重新计算旋转后的5D顶点,再执行投影和3D网格渲染

适配给定顶点的Python代码

以下是基于Plotly实现的完整代码,适配提供的5D顶点数组:

import numpy as np
import plotly.graph_objects as go
from scipy.spatial import ConvexHull

# 原始5D顶点数组
V_5D = np.array([[-1,0,1,1,-1], [0,1,-1,-1,1], [0,-3,-1,1,0], [-1,0,0,-1,0], [-1,1,-1,-1,1], [0,-1,1,1,0], [0,0,0,-1,0]])

def nsphere_projection(mat, target_dim=3):
    """保留原有的5D到3D的球面投影逻辑"""
    projected_mat = []
    for vec in mat:
        # 归一化5D向量
        vec_normalized = vec / np.linalg.norm(vec)
        z = vec_normalized[target_dim:].sum()
        # 投影到3D空间
        projected_vec = vec_normalized[:target_dim] / (1. - z)
        projected_mat.append(projected_vec)
    return np.array(projected_mat)

def generate_5d_rotation_matrix(axis_pair, angle):
    """生成5D空间中绕指定轴对旋转的变换矩阵"""
    i, j = axis_pair
    rot_matrix = np.eye(5)
    # 旋转矩阵的核心元素
    rot_matrix[i, i] = np.cos(angle)
    rot_matrix[i, j] = -np.sin(angle)
    rot_matrix[j, i] = np.sin(angle)
    rot_matrix[j, j] = np.cos(angle)
    return rot_matrix

def update_plot(angle_01, angle_23, angle_40):
    """根据三个轴对的旋转角度,更新3D模型"""
    # 组合三个旋转变换
    rot_01 = generate_5d_rotation_matrix((0,1), np.radians(angle_01))
    rot_23 = generate_5d_rotation_matrix((2,3), np.radians(angle_23))
    rot_40 = generate_5d_rotation_matrix((4,0), np.radians(angle_40))
    # 对原始5D顶点执行旋转
    V_rotated = V_5D @ rot_01 @ rot_23 @ rot_40
    # 投影到3D
    V_3D = nsphere_projection(V_rotated)
    # 计算凸包
    hull = ConvexHull(V_3D)
    # 更新3D网格数据
    mesh3d = go.Mesh3d(
        x=V_3D[:,0], y=V_3D[:,1], z=V_3D[:,2],
        i=hull.simplices[:,0], j=hull.simplices[:,1], k=hull.simplices[:,2],
        opacity=1.0, flatshading=True, color="#ce6a6b",
        lighting=dict(ambient=0.5, diffuse=1, fresnel=4, specular=0.5, roughness=0.5)
    )
    return [mesh3d]

# 创建初始图
fig = go.Figure(update_plot(0,0,0))

# 设置布局
fig.update_layout(
    width=600, height=600,
    title_text='5D Polytope Projection', title_x=0.5,
    scene=dict(
        xaxis=dict(showticklabels=False, ticks='', title=''),
        yaxis=dict(showticklabels=False, ticks='', title=''),
        zaxis=dict(showticklabels=False, ticks='', title='')
    ),
    # 添加滑块控件控制三个轴对的旋转角度
    sliders=[
        dict(
            active=0,
            currentvalue={"prefix": "0-1轴旋转角度: "},
            pad={"t": 50},
            steps=[dict(method="update", args=[update_plot(angle,0,0)], label=f"{angle}°") for angle in range(0, 360, 10)]
        ),
        dict(
            active=0,
            currentvalue={"prefix": "2-3轴旋转角度: "},
            pad={"t": 100},
            steps=[dict(method="update", args=[update_plot(0,angle,0)], label=f"{angle}°") for angle in range(0, 360, 10)]
        ),
        dict(
            active=0,
            currentvalue={"prefix": "4-0轴旋转角度: "},
            pad={"t": 150},
            steps=[dict(method="update", args=[update_plot(0,0,angle)], label=f"{angle}°") for angle in range(0, 360, 10)]
        )
    ]
)

fig.show()

代码说明

  1. 5D旋转矩阵生成:针对5D空间的任意轴对生成旋转矩阵,确保顶点在5D空间中真实旋转
  2. 投影逻辑复用:保留原有nsphere投影方法,保证投影一致性
  3. 交互控件:通过三个滑块分别控制不同轴对的旋转角度,每次拖动滑块都会重新执行「5D旋转→3D投影→凸包计算→网格更新」的完整流程,实现真实的5D旋转交互效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:45:08