簡體   English   中英

有沒有一種簡單的方法可以在 plotly 中將 3d 網格旋轉 90 度?

[英]Is there an easy way to rotate a 3d mesh by 90 degree in plotly?

我使用 plotly.graph_objects.Mesh3d ZC1C425268E18385D14AB504F 在 plotly 中創建了 3d 網格。 請看下一張圖片。

在此處輸入圖像描述

有沒有一種簡單的方法可以將這個 3d 網格旋轉 90 度? 請看下一張圖片作為我想如何旋轉的指示。

在此處輸入圖像描述

雖然我不知道您究竟是如何創建 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 得到最終的向量。 將此向量添加到點ab ,我們得到新的坐標cd

![在此處輸入圖像描述

使用一些基本的 numpy 操作來幫助我們,我們可以將上面的內容轉換為代碼( ab是網格的底部坐標,旋轉后將保持不變, cd是新坐標)。 此外,當您添加旋轉的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM