wolfram-mathematica - Graphics3D 对象的二维投影

标签 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}]

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

关于wolfram-mathematica - Graphics3D 对象的二维投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740640/

相关文章:

unix - 在 Mathematica 后台运行程序

wolfram-mathematica - 数学 : Labels and absolute positioning

wolfram-mathematica - 防止在衍生输出中重新排序?

wolfram-mathematica - 数学 : Joining line segments

wolfram-mathematica - 当我使用 Mathematica ListPlot 数据表时如何避免渐近线?

algorithm - 关于优化例程/使用约束的建议

arrays - 有没有什么有效的简单方法可以用 Mathematica 比较两个长度相同的列表?

parsing - 如何在粘贴时自动转换 Part [[ 双括号 ]]?

c - 在c中按运算符、标识符等拆分字符串

wolfram-mathematica - 在 Mathematica 中自动生成和