来自 Wavefront OBJ 文件的 Plotly Mesh3d 图
Plotly Mesh3d plot from a Wavefront OBJ file
我正在尝试使用 Plotly 的 Mesh3D
绘制一条腿的 3D 扫描图。
我使用 scatter_3d
和 XYZ 点来展示这个概念,使用:
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 数据的平滑曲面图。
这是扫描的XYZ data。
编辑:关于曲面图介绍的续信息
我用下面的代码实现了曲面图。不幸的是,没有渲染图(也没有伴随错误)。
colnames = ['x', 'y', 'z']
df = pd.read_csv('sandbox\leg.txt', sep = ' ', header = None, names = colnames)
x, y = np.array(df['x'].tolist()), np.array(df['y'].tolist())
df2 = df.pivot(index = 'x', columns = 'y', values = 'z')
z = df2.values
fig = go.Figure(data=[go.Surface(z=z, x=x, y=y)])
fig.show()
我在这里找到了一个很棒的答案:https://plot.ly/~empet/15040/plotly-mesh3d-from-a-wavefront-obj-f/#/
作者使用了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)
这是最终情节:
我正在尝试使用 Plotly 的 Mesh3D
绘制一条腿的 3D 扫描图。
我使用 scatter_3d
和 XYZ 点来展示这个概念,使用:
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 数据的平滑曲面图。
这是扫描的XYZ data。
编辑:关于曲面图介绍的续信息
我用下面的代码实现了曲面图。不幸的是,没有渲染图(也没有伴随错误)。
colnames = ['x', 'y', 'z']
df = pd.read_csv('sandbox\leg.txt', sep = ' ', header = None, names = colnames)
x, y = np.array(df['x'].tolist()), np.array(df['y'].tolist())
df2 = df.pivot(index = 'x', columns = 'y', values = 'z')
z = df2.values
fig = go.Figure(data=[go.Surface(z=z, x=x, y=y)])
fig.show()
我在这里找到了一个很棒的答案:https://plot.ly/~empet/15040/plotly-mesh3d-from-a-wavefront-obj-f/#/
作者使用了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)