【问题标题】:Picking in true 3D isometric view在真正的 3D 等轴测视图中拾取
【发布时间】:2013-07-29 09:44:54
【问题描述】:

为了查看我的 3D 环境,我使用“真实的”3D 等距投影(XZ 平面上的平面正方形,Y 为“始终”0)。我使用了维基百科上的解释:http://en.wikipedia.org/wiki/Isometric_projection 来了解如何进行这种转换: 投影矩阵是某个最小和最大坐标之间的正交投影矩阵。 视图矩阵是两次旋转:一次围绕 Y 轴(n * 45 度),一次围绕 X 轴(arctan(sin(45 度)))。 结果看起来还可以,所以我认为我做得对。

但现在我希望能够用鼠标选择坐标。我已经通过将坐标渲染到不可见的帧缓冲区然后获取鼠标光标下的像素来获得坐标来成功实现了这一点。虽然这很好用,但我真的很想看到一个数学解决方案,因为我需要它来计算边界框、屏幕上区域的平截头体和类似的东西。

我的直觉告诉我: - 从屏幕坐标转到 2D 投影坐标(或者你怎么说,我的意思是将屏幕坐标转换为两个轴的 -1 和 +1 之间的坐标,y 倒置) - 用视图矩阵的倒数取消变换坐标。 - 是的...用投影矩阵的倒数取消转换这个坐标,但正如我的直觉所告诉的那样,这不会起作用,因为所有东西都将具有相同的 Z 坐标。

虽然在等轴测视图上所有信息都完全可用(我知道 Y 值始终为 0)。所以我应该能够将等距 2D x,y 坐标转换为计算得到的 3d (x, 0, z) 坐标,而无需使用扫描或类似的东西。

我的数学还不错,但我似乎无法掌握。

编辑:IMO。每个不同的 (x, 0, z) 坐标对应于等轴测视图中的不同 (x2, y2) 坐标。所以我应该能够简单地计算出从 (x2, y2) 到 (x, 0, z) 的方法。但是怎么做呢?

有人吗?

【问题讨论】:

    标签: math view 3d 2d isometric


    【解决方案1】:

    有一种叫做projectunproject 的东西可以将屏幕转换为世界,反之亦然....

    【讨论】:

    • 根据我的经验,这对我来说从来没有用过。如果我理解正确,那只对光线拾取有用。我想我不需要在这里采光。
    【解决方案2】:

    您似乎在这里遗漏了一些核心概念(我做这些东西已经有一段时间了,所以包括一些小错误):

    • 这里涉及到3种坐标(还有更多,这些是相关的):Scene、Projection和Window

      • 场景 (3D) 是您世界中的坐标
      • 投影(3D)是经过相机位置和投影变换后的坐标
      • Window (2D) 是您的窗口中的坐标。它们是通过适当缩放 x 和 y 并丢弃 z(z 仍用于“谁在前面?”计算)从投影生成的。

    您可以使用矩阵从 window 转换为 scene,因为 window 中的每个点都对应场景中的一整行。如果需要 (x, 0, z) 坐标,可以生成这条线并将其与 y 平面相交。

    如果您想手动执行此操作,请在 projection 中生成两个具有相同 (x,y) 和不同 (任意) z 坐标的点,并将它们转换为 scene 乘以投影变换的倒数。现在将通过这两个点的线与您的 y 平面相交,就完成了。

    请注意,这个问题应该有一个“静态”解决方案(一个公式)——如果你在纸上解决了这一切,你应该得到它。

    【讨论】:

    • 我没有错过你写的核心概念,但我无法使用正确的术语,这可能导致阅读起来非常不清楚,所以谢谢你。如果我理解正确,您是在告诉我进行光线拾取,但不是搜索与对象的交点,我只需要找到 Y=0 的交点?
    • 是的,这将实现您的目标。您还可以求解一堆方程以获得screen(a,b) -> scene(x, 0, z) 函数。但除非速度真的很重要,否则使用现有的解决方案可能会更容易(假设编码比数学更适合你:)。
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多