为了查看我的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)。所以我应该能够将等轴测的2Dx,y坐标转换成计算的3d (x,0,z)坐标,而不需要使用扫描或类似的东西。
我的数学并不差,但这似乎是我不能理解的。
编辑: IMO。在等轴测视图中,每个不同的(x,0,z)坐标对应一个不同的(x2,y2)坐标。所以我应该能够简单地计算出从(x2,y2)到(x,0,z)的方法。但是怎么做呢?
有没有人?
发布于 2013-07-29 17:48:22
有一种叫做project和unproject的东西可以将屏幕转换为世界,反之亦然……
发布于 2013-07-29 19:25:29
你似乎错过了这里的一些核心概念(自从我做这件事已经有一段时间了,所以包括一些小错误):
- **Scene (3D)** are the coordinates in your world
- **Projection (3D)** are those coordinates after being transformed by camera position and projection
- **Window (2D)** are the coordinates in your window. They are generated from projection by scaling x and y appropriately and discarding z (z is still used for “who’s in front?” calculations)
您可以使用矩阵从窗口到场景进行not变换,因为窗口中的每个点都对应于场景中的一整条线。如果需要(x,0,z)坐标,可以生成这条线并将其与y平面相交。
如果要手动执行此操作,请在投影中生成具有相同(x,y)和不同(任意)z坐标的两个点,并通过与投影变换的逆相乘将它们变换为场景。现在,将通过这两个点的直线与y平面相交,就完成了。
请注意,对于这个问题应该有一个“静态”的解决方案(一个单一的公式)--如果你在纸上解决了这个问题,你就应该得到它。
https://stackoverflow.com/questions/17920745
复制相似问题