我正在创造一个游戏世界由立方体组成(比如Minecraft),但只有一个小问题我无法指责。我创造了世界,玩家,相机移动和旋转(glRotatef和glTranslatef)。现在我一直在寻找玩家正在看的阻挡。
编辑:如果我没有让我的问题足够清楚,我不明白如何投射光线以检查与块的碰撞。我正在绘制的所有块都存储在一个3D数组中,包含块id(我知道我需要使用八叉树,但我只是想让算法工作,优化就在这里)
答案 0 :(得分:2)
OpenGL是一种绘图/渲染API,而不是某种游戏/图形引擎。你告诉它画东西,这就是它的作用。
您想要的测试不是OpenGL所涵盖的测试,您可以自己实现它们,也可以使用为此设计的库。在你的情况下,你想要在观看视锥体的情况下测试世界。通过进行射线几何相交测试可以找到玩家所看到的确切块,即您将玩家位置的光线投射到玩家看到的方向并测试哪些物体与该光线相交。使用空间细分结构有助于加快速度。在由立方体制成的世界的情况下,最简单和有效的结构是八叉树,即一个大的立方体,其被细分为包含立方体边长的一半的8个子立方体。然后将这些子立方体分开,依此类推。
遍历这样的结构很容易通过递归函数实现 - 不要担心堆栈溢出,因为已经像10个细分那样产生2 ^ 10 ^ 3 = 2 ^ 30 sub-sub -...- sub-多维数据集,要求使用8GB的数据来构建完整的详细网格。但是10个函数递归级别不是很深。
答案 1 :(得分:0)
首先想象一个来自你的眼睛的向量指向相机的方向,其长度等于玩家的“到达”。如果我没记错的话,我的Minecraft的范围大约是4个街区(或4米)。对于你的世界中每个可以与该向量相交的块(可以像在你的到达矢量的最小/最大x / y / z值所限定的块的立方体上的3D循环一样简单)在立方体上投射光线(如果它不是空气的话,看你是不是打了它。在AABB(轴对齐边界框)上进行光线投射非常简单,您可以使用Google算法。现在按距离对结果进行排序,然后返回首先击中光线的块。