Python 从波阵面OBJ文件绘制网格3D图

Python 从波阵面OBJ文件绘制网格3D图,python,plot,3d,plotly,wavefront,Python,Plot,3d,Plotly,Wavefront,我正在尝试使用Plotly的Mesh3D 我使用了带有XYZ点的scatter_3d,通过以下方式展示了这一概念: fig = px.scatter_3d(df, x='x', y='y', z='z', opacity = 0.8) 但是,它看起来不像曲面。因此,我尝试了Mesh3d,使用: fig = go.Figure(data=[go.Mesh3d(x=x, y=y, z=z, color='lightpink', opacity=0.50)]) 显然,这一情节并不顺利。在渲染绘

我正在尝试使用Plotly的
Mesh3D

我使用了带有XYZ点的
scatter_3d
,通过以下方式展示了这一概念:

fig = px.scatter_3d(df, x='x', y='y', z='z', opacity = 0.8)

但是,它看起来不像曲面。因此,我尝试了
Mesh3d
,使用:

fig = go.Figure(data=[go.Mesh3d(x=x, y=y, z=z, color='lightpink', opacity=0.50)])

显然,这一情节并不顺利。在渲染绘图之前,我尝试对df进行排序,但没有任何帮助

重申一下,我正在寻找该XYZ数据的平滑曲面图

这是扫描结果

编辑:继续介绍曲面图的信息

我用下面的代码实现了曲面图。不幸的是,没有渲染绘图(也没有伴随错误)


我在这里找到了一个奇妙的答案:

作者使用了
go.Mesh3d
。但是,也许更重要的突破是它们的功能:

def obj_data_to_mesh3d(odata):
    # odata is the string read from an obj file
    vertices = []
    faces = []
    lines = odata.splitlines()

    for line in lines:
        slist = line.split()
        if slist:
            if slist[0] == 'v':
                vertex = np.array(slist[1:], dtype=float)
                vertices.append(vertex)
            elif slist[0] == 'f':
                face = []
                for k in range(1, len(slist)):
                    face.append([int(s) for s in slist[k].replace('//','/').split('/')])
                if len(face) > 3: # triangulate the n-polyonal face, n>3
                    faces.extend([[face[0][0]-1, face[k][0]-1, face[k+1][0]-1] for k in range(1, len(face)-1)])
                else:
                    faces.append([face[j][0]-1 for j in range(len(face))])
            else: pass


    return np.array(vertices), np.array(faces)
这是最后的情节:

那么你用过曲面图了吗@感谢回复!我花了一些时间潜入3D曲面图,但我真的很挣扎。我更新了帖子,如果你能再看一眼,我将不胜感激。谢谢你!我不太明白你的数据。为什么要旋转数据?另外,我不能运行你的代码,因为它似乎永远运行。据我所知,曲面图需要一个z值矩阵。轴创建z值的x x x y矩阵。代码也永远为我运行。你知道出了什么问题吗?给我们看看情节。slist[0]=“v”?我在你的链接文件中没有看到任何“v”和“f”。@MykolaZotko这是我的错!我应该在回答中说明转移注意力的方法。该函数将.obj文件转换为输入,而不是.xyz。这就是为什么该函数名为“obj_data_to_mesh3d”。
def obj_data_to_mesh3d(odata):
    # odata is the string read from an obj file
    vertices = []
    faces = []
    lines = odata.splitlines()

    for line in lines:
        slist = line.split()
        if slist:
            if slist[0] == 'v':
                vertex = np.array(slist[1:], dtype=float)
                vertices.append(vertex)
            elif slist[0] == 'f':
                face = []
                for k in range(1, len(slist)):
                    face.append([int(s) for s in slist[k].replace('//','/').split('/')])
                if len(face) > 3: # triangulate the n-polyonal face, n>3
                    faces.extend([[face[0][0]-1, face[k][0]-1, face[k+1][0]-1] for k in range(1, len(face)-1)])
                else:
                    faces.append([face[j][0]-1 for j in range(len(face))])
            else: pass


    return np.array(vertices), np.array(faces)