我正在为具有平行(但可旋转)投影的 2.5D 游戏开发磁贴引擎。瓦片是平面四边形,其顶点已根据相机位置和 x/y 旋转进行调整和放置。没有偏航(z)。用 Starling 编写引擎。
摄像机的可视区域可以描述为落在任意旋转且任意高的固定宽度椭圆内的网格区域。
我现在想做的是在必须投影它们之前获取落在屏幕空间内的图块列表,而不必根据缩放半径/sin/cos 测试每个坐标集。只要它大于半径,这可能是一个脏集。但我正在寻找最不脏、最优化的解决方案。
我正在为具有平行(但可旋转)投影的 2.5D 游戏开发磁贴引擎。瓦片是平面四边形,其顶点已根据相机位置和 x/y 旋转进行调整和放置。没有偏航(z)。用 Starling 编写引擎。
摄像机的可视区域可以描述为落在任意旋转且任意高的固定宽度椭圆内的网格区域。
我现在想做的是在必须投影它们之前获取落在屏幕空间内的图块列表,而不必根据缩放半径/sin/cos 测试每个坐标集。只要它大于半径,这可能是一个脏集。但我正在寻找最不脏、最优化的解决方案。
如果我正确理解您想要做什么,这类似于填充问题。
您在椭圆上覆盖了一个矩形网格,并且您想要列出在椭圆内至少有一个角的图块。通过适当的缩放,这与扫描填充椭圆相同。
将椭圆置于其隐式形式 中ax² + 2bxy + cy² + 2dx + 2ey + f = 0
,坐标缩放/平移,以便网格点落在整数坐标处。您首先确定有用的y
值范围。然后对于每条扫描线,您确定 的极值x
。
让我们修正一下,您在:y
中有一个二次方程。x
ax² + 2(by + d)x + (cy² + 2ey + f) = 0
它的判别式是(by+d)- a(cy²+2ey+f) = (b²-ac)y² + 2(bd-ae)y + (d²-af)
。
求解这个二次方程y
可以得到值的范围y
;取最小的天花板和最大的地板。
然后对于这个范围内的每个整数,求解x
,你会得到水平范围。
[请注意,我对 At² + 2Bt + C= 0 形式的方程使用判别式 B²-AC。]
当瓷砖不移动时,您可以使用八叉树或 kd 树。
我这样做是为了我的(巨大的 DTM)地形网格渲染:
沿我的屏幕边缘投射少量光线(相机平截头体Z-近平面)
计算椭球表面上射线和矿山地形网格之间的所有交点
填空
它看起来像这样:
我有 6 个自由度,所以我需要沿着整个屏幕区域投射光线,而不仅仅是边界
这就是渲染后的样子(朝向水平方向):