簡體   English   中英

Graphics3D object 的二維投影

[英]2d projection of Graphics3D object

我有一個 Graphics3D object。 我想將其導出為 bitmap,並計算某些 3D 點的位圖像素坐標。

Mathematica 在繪制 3D 圖形時,顯然會從 3D 對象到 2D 像素坐標進行投影。 我怎樣才能知道這個投影是什么?

我寧願避免基於 ViewVector 和 ViewAngle 以及 ImageSize 和 BoundingBox 進行大量棘手的幾何計算。 有捷徑嗎?

達蒙。

您可以使用選項"Transformation" -> "Perspective"進行GeometricTransform 假設您的投影棋盤看起來像這樣

img = Image@
  Plot3D[0, {x, -1, 1}, {y, -1, 1}, Mesh -> 7, 
   MeshShading -> {{Black, White}, {White, Black}}, Boxed -> False, 
   AxesEdge -> {{-1, -1}, {-1, -1}, None}, AxesOrigin -> {-1, -1, 0}]

3D棋盤

要找到投影,您將需要img中至少 4 個控制點的坐標,您知道 {x,y} 坐標。 可能有一些方法可以讓 Mathematica 自動找到這些坐標,但您可以通過右鍵單擊img並選擇“獲取坐標”來手動 select。 單擊您選擇的控制點(在本例中,我選擇了棋盤的 4 個角)並將它們的坐標復制/粘貼到新行。 你應該得到類似的東西

controls = {{13.5`, 151.5`}, {235.5`, 68.5`}, 
   {332.5`, 206.5`}, {139.5`, 262.5`}};

投影 function 和矩陣則變為

transform = FindGeometricTransform[controls,
   {{0, 0}, {8, 0}, {8, 8}, {0, 8}}, 
   "Transformation" -> "Perspective"][[2]]
transfMat = TranformationMatrix[transform]

請注意,我選擇的棋盤是一個以 {4,4} 為中心的 8x8 正方形,但您可以選擇任何正方形。

棋盤上的點 {x,y} 現在將對應於img中的點,像素坐標為transform[{x,y}]或使用投影矩陣(transfMat[[{1,2}]].{x,y,1})/(transfMat[[3]].{x,y,1}) 因此,例如,要在 D6 上放置一個標記,即在我的 8x8 正方形中的 position {x,y}={4-1/2,6-1/2},您可以執行類似的操作

ImageCompose[img, Image[BoxMatrix[2]], Round[transform[{4 - 1/2, 6 - 1/2}]]]

標記

渲染 Graphics3D object 時,可以指定ViewMatrix選項。 您可以設置轉換(例如旋轉),然后設置投影。

通過這種方式,您可以使用您對用於計算正確平面坐標的投影的明確了解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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