我有一个 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}]
要找到投影,您将需要
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}]]]
关于wolfram-mathematica - Graphics3D 对象的二维投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740640/