我有一个Graphics3D对象。我想将其导出为位图,并计算某些3D点的位图像素坐标。
Mathematica显然在绘制3D图形时从3D对象投影到2D像素坐标。我怎样才能知道这个投影是什么?
我宁愿避免基于ViewVector和ViewAngle以及ImageSize和BoundingBox进行大量棘手的几何计算。有捷径吗?
戴蒙。
答案 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}]
要查找投影,您需要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}]]]
答案 1 :(得分:0)
渲染Graphics3D对象时,可以指定ViewMatrix选项。您可以设置变换(例如旋转),然后设置投影。
通过这种方式,您可以使用您对用于计算正确平面坐标的投影的明确了解。