0

我正在为具有平行(但可旋转)投影的 2.5D 游戏开发磁贴引擎。瓦片是平面四边形,其顶点已根据相机位置和 x/y 旋转进行调整和放置。没有偏航(z)。用 Starling 编写引擎。

摄像机的可视区域可以描述为落在任意旋转且任意高的固定宽度椭圆内的网格区域。

我现在想做的是在必须投影它们之前获取落在屏幕空间内的图块列表,而不必根据缩放半径/sin/cos 测试每个坐标集。只要它大于半径,这可能是一个脏集。但我正在寻找最不脏、最优化的解决方案。

4

3 回答 3

1

如果我正确理解您想要做什么,这类似于填充问题。

您在椭圆上覆盖了一个矩形网格,并且您想要列出在椭圆内至少有一个角的图块。通过适当的缩放,这与扫描填充椭圆相同。

将椭圆置于其隐式形式 中ax² + 2bxy + cy² + 2dx + 2ey + f = 0,坐标缩放/平移,以便网格点落在整数坐标处。您首先确定有用的y值范围。然后对于每条扫描线,您确定 的极值x

让我们修正一下,您在:y中有一个二次方程。xax² + 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。]

于 2014-09-24T09:01:02.780 回答
0

当瓷砖不移动时,您可以使用八叉树或 kd 树。

于 2014-09-20T18:30:06.370 回答
0

我这样做是为了我的(巨大的 DTM)地形网格渲染:

  1. 沿我的屏幕边缘投射少量光线(相机平截头体Z-近平面)

    • 在相机中那个像素的方向
    • 它与从焦点开始并穿过像素的线相同
  2. 计算椭球表面上射线和矿山地形网格之间的所有交点

    • 为每条使用的网格线保留最小值,最大值
    • 这将为您提供已使用单元格的列表
  3. 填空

    • 将最小最大行/列放大几个网格单元以确保
    • 如果缺少任何线(不是被射线击中,而是相邻的线),则也对其进行插值
    • 这将给出渲染所需的所有单元格的列表

它看起来像这样:

  • 全球概览:
  • 凸轮视图
  • Znear 平面细节(近表面相机位置向下查看):
  • 格击

  • 我有 6 个自由度,所以我需要沿着整个屏幕区域投射光线,而不仅仅是边界

  • 在你的情况下 4 射线应该足够了
  • 并且可以稍后添加椭圆蒙版
  • 或沿您的椭圆视图周长/周长投射更多光线

这就是渲染后的样子(朝向水平方向):

在此处输入图像描述

  • Hipparcos 星高达 +12 等
  • 地形 DTM 50m 小区网格大小
  • 从 NASA GeoCover Circa 1990/2000 SWIR 14.75m -> 50m DTM 对齐的纹理插值
于 2014-09-24T08:36:25.097 回答