我正在使用平铺(但可旋转)投影的2.5D游戏的平铺引擎。瓷砖是平面四边形,其顶点经过调整,并根据摄像机位置和x / y旋转设置放置位置。没有偏航(z)。在Starling中编写引擎。
相机的可见区域可以描述为属于任意旋转且任意高度的固定宽度椭圆的网格区域。
我现在要做的是获取一个落在屏幕空间内的图块列表,然后再进行投影,而不必根据变焦半径/ sin / cos测试每个坐标集。只要它大于半径,这可以是脏集。但我正在寻找最不脏和最优化的解决方案。
答案 0 :(得分:1)
如果我理解你想要做什么,这类似于填充问题。
在椭圆上叠加矩形网格,并且要列出椭圆内至少有一个角的切片。通过适当的缩放,这与扫描填充椭圆相同。
将椭圆置于其隐式形式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
,您将获得水平范围。
[注意我使用判别式B²-AC表示At²+ 2Bt + C = 0形式的等式。]
答案 1 :(得分:0)
当瓷砖不移动时,您可以使用八叉树或k-d树。
答案 2 :(得分:0)
我为我的(巨大的DTM)地形网格渲染做到了这一点:
沿着我的屏幕边界(相机截头Z-近平面)投射几条光线
计算椭球面上光线和地形网格之间的所有交点
填写空格
看起来像这样:
我有6个自由度,所以我需要沿整个屏幕区域投射光线而不仅仅是边界
这就是它渲染后的样子(朝向视界):