[英]Is there an easy way to rotate a 3d mesh by 90 degree in plotly?
雖然我不知道您究竟是如何創建 3d 網格矩形曲面的,但我可以通過將曲面四個角的 x、y、z 坐標以及 Delaunay 軸傳遞給go.Mesh3d
來重新創建它。 Delaunay 軸告訴 Plotly 垂直於您的表面的方向,以便構建網格。 您可以將 Delaunay 軸指定為'x'
或'y'
,並且將正確渲染表面:
import plotly.graph_objects as go
x = [11.5,11.5,14.5,14.5]
y = [19,19,13,13]
z = [436,441,436,441]
fig = go.Figure(data=[
go.Mesh3d(
x=x,
y=y,
z=z,
delaunayaxis='y'
)
])
fig.show()
當您旋轉平面以使其與 xy 平面平行時,平面底部的兩個原始 z 坐標將保持固定,但可以使用垂直向量的屬性計算兩個新平面的坐標。
考慮下圖(矢量未准確繪制,但希望以下解釋有意義)。 當您將 3d 網格平面向下旋轉到 z=436 時,新的藍色矢量必須垂直於綠色矢量並且長度為 5(在您繪制的原始 3d 網格平面中從 436 到 441 的距離相同)。 綠色向量可以分解為紅色表示的 x 和 y 分量。 如果綠色向量具有方向(v_x, v_y)
,則藍色向量將具有方向(-v_y, v_x)
。 然后我們可以對這個向量進行歸一化(除以它的長度)並乘以 5 得到最終的向量。 將此向量添加到點a
和b
,我們得到新的坐標c
和d
。
使用一些基本的 numpy 操作來幫助我們,我們可以將上面的內容轉換為代碼( a
和b
是網格的底部坐標,旋轉后將保持不變, c
和d
是新坐標)。 此外,當您添加旋轉的 3d 網格時,您需要將 Delaunay 軸更改為 z,因為 z 軸垂直於我們的新曲面:
import numpy as np
## make points a and b the bottom two points
a = np.array((x[0], y[0], z[0]))
b = np.array((x[2], y[2], z[2]))
v = b-a
## create a perpendicular unit vector
v_perp_unit = np.array([-1*v[1], v[0], v[2]]) / np.linalg.norm(v)
v_length = max(z) - min(z)
v_perp = v_length*v_perp_unit
## calculate the coordinates of the final two points
c = a+v_perp
d = b+v_perp
x_new = [a[0],b[0],c[0],d[0]]
y_new = [a[1],b[1],c[1],d[1]]
z_new = [a[2],b[2],c[2],d[2]]
fig = go.Figure(data=[
go.Mesh3d(
x=x_new,
y=y_new,
z=z_new,
delaunayaxis='z'
)
])
fig.show()
如果添加新旋轉的 3d 網格平面作為跡線,可以看到原來的並檢查兩個平面確實垂直:
fig.add_trace(
go.Mesh3d(
x=x_new,
y=y_new,
z=z_new,
delaunayaxis='z'
)
)
fig.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.