0

为了查看我的 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) 坐标,而无需使用扫描或类似的东西。

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

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

任何人?

4

2 回答 2

0

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

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

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

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

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

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

于 2013-07-29T11:25:29.170 回答
0

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

于 2013-07-29T09:48:21.643 回答