Dam*_*nJW 4 wolfram-mathematica
我有一个Graphics3D对象.我想将其导出为位图,并计算某些3D点的位图像素坐标.
Mathematica显然在绘制3D图形时从3D对象投影到2D像素坐标.我怎样才能知道这个投影是什么?
我宁愿避免基于ViewVector和ViewAngle以及ImageSize和BoundingBox进行大量棘手的几何计算.有捷径吗?
达蒙.
你可以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}]
Run Code Online (Sandbox Code Playgroud)

要找到投影,您需要至少4个控制点的坐标img,您知道{x,y}坐标.可能有一些方法让Mathematica自动找到这些坐标,但您可以通过右键单击img并选择"获取坐标" 来手动选择它们.单击您选择的控制点(在本例中我选择了棋盘的4个角)并将其坐标复制/粘贴到新线.你应该得到类似的东西
controls = {{13.5`, 151.5`}, {235.5`, 68.5`},
{332.5`, 206.5`}, {139.5`, 262.5`}};
Run Code Online (Sandbox Code Playgroud)
然后投影函数和矩阵变为
transform = FindGeometricTransform[controls,
{{0, 0}, {8, 0}, {8, 8}, {0, 8}},
"Transformation" -> "Perspective"][[2]]
transfMat = TranformationMatrix[transform]
Run Code Online (Sandbox Code Playgroud)
请注意,我选择的棋盘是一个以{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}]]]
Run Code Online (Sandbox Code Playgroud)
