Graphics3D对象的2d投影

时间:2011-07-18 23:29:18

标签: wolfram-mathematica

我有一个Graphics3D对象。我想将其导出为位图,并计算某些3D点的位图像素坐标。

Mathematica显然在绘制3D图形时从3D对象投影到2D像素坐标。我怎样才能知道这个投影是什么?

我宁愿避免基于ViewVector和ViewAngle以及ImageSize和BoundingBox进行大量棘手的几何计算。有捷径吗?

戴蒙。

2 个答案:

答案 0 :(得分:5)

您可以使用GeometricTransform选项"Transformation" -> "Perspective"。假设您的预计棋盘看起来像这样

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 chessboard

要查找投影,您需要img中至少4个控制点的坐标,您知道{x,y}坐标。可能有一些方法让Mathematica自动找到这些坐标,但您可以通过右键单击img并选择“获取坐标”来手动选择它们。单击您选择的控制点(在这种情况下,我选择了棋盘的4个角)和 将其坐标复制/粘贴到新行。你应该得到像

这样的东西
controls = {{13.5`, 151.5`}, {235.5`, 68.5`}, 
   {332.5`, 206.5`}, {139.5`, 262.5`}};

然后投影函数和矩阵成为

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方格中位于{x,y} = {4-1 / 2,6-1 / 2},你可以做类似的事情

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

marker

答案 1 :(得分:0)

渲染Graphics3D对象时,可以指定ViewMatrix选项。您可以设置变换(例如旋转),然后设置投影。

通过这种方式,您可以使用您对用于计算正确平面坐标的投影的明确了解。