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

Plotly技术问询:如何基于标签绘制带颜色的四面体体积

四面体带颜色绘制的两种可行方案

方案一:拆分四面体为三角面适配Mesh3d

Mesh3d仅支持三角面渲染,将每个四面体拆分为4个三角面即可完整展示,同时给每个面绑定对应四面体的tag颜色,保证同一四面体的所有面颜色统一。

实现思路

  1. 每个四面体包含4个顶点,固定拆分为4组三角面(比如取(0,1,2)、(0,1,3)、(0,2,3)、(1,2,3)这四组顶点组合)
  2. 为每个三角面赋予对应四面体的tag颜色
  3. 按照Mesh3d的格式要求组织顶点和面数据

代码示例(Python + Plotly)

import plotly.graph_objects as go

# 示例输入数据
points = [[0,0,0], [1,0,0], [0,1,0], [0,0,1], [1,1,1]]  # XYZ点集合
tetras = [[0,1,2,3], [1,2,3,4]]  # 四面体顶点索引(对应points的下标)
tags = [0.2, 0.8]  # 每个四面体的颜色标签(可映射到颜色条)

# 拆分四面体为三角面,生成Mesh3d所需的面数据
faces_i = []
faces_j = []
faces_k = []
face_colors = []

for tet_idx, (v0, v1, v2, v3) in enumerate(tetras):
    # 生成当前四面体的4个三角面
    triangles = [
        (v0, v1, v2),
        (v0, v1, v3),
        (v0, v2, v3),
        (v1, v2, v3)
    ]
    # 填充面数据和颜色
    for tri in triangles:
        faces_i.append(tri[0])
        faces_j.append(tri[1])
        faces_k.append(tri[2])
        face_colors.append(tags[tet_idx])

# 创建Mesh3d图表
fig = go.Figure(data=[go.Mesh3d(
    x=[p[0] for p in points],
    y=[p[1] for p in points],
    z=[p[2] for p in points],
    i=faces_i,
    j=faces_j,
    k=faces_k,
    intensity=face_colors,
    colorscale='Viridis',
    opacity=0.7,
    flatshading=True
)])

fig.show()

方案二:体素化转换为Volume格式

如果必须使用Volume/Isosurface组件,需要先将四面体网格体素化,把tag值映射到三维体素网格中,但这种方法仅适合规则或密集的网格,否则会丢失细节。

实现步骤

  1. 计算所有点的包围盒,确定体素网格的范围和分辨率
  2. 遍历每个体素,通过点在四面体内的判定算法,确定体素所属的四面体
  3. 将体素的数值设为对应四面体的tag值
  4. 用Volume或Isosurface组件渲染体素网格

注意事项

  • 体素化会引入精度损失,分辨率越高计算量越大
  • 重叠区域的体素tag需要提前定义优先级规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:45:34