【问题标题】:libgdx 3d infinite scrolling floorlibgdx 3d 无限滚动地板
【发布时间】:2014-04-04 09:44:49
【问题描述】:

我正在制作一个 3D 游戏,并且正在寻找将平面作为 3D 一部分的最佳方法。如果你想象那些像 TempleRun 这样的游戏,但没有转弯,你向前移动,地板无限向后滚动(朝向用户)。

我已经让我的 3D 对象围绕 X 轴适当地移动(在固定的 Z 平面上),但现在正在考虑添加背景、地板等。

我一直在阅读DecalPlane,但不确定哪个是最好的方法。我会在每一层都有相同的地板结构,但有不同的纹理。未来会提供更多的可扩展性吗?例如,斜坡、山丘等。每个地板结构(无论是Decal 还是Plane)都会无休止地重复,我想看看我是否可以创建一个雾效果,使地板随着距离的增加而褪色。此外,它还具有可向后重复的可平铺纹理(例如草、停机坪、泥土)。

甚至可能是一个静态结构,然后简单地向后移动纹理?

任何想法都会很棒,谢谢。

【问题讨论】:

    标签: java android 3d libgdx


    【解决方案1】:

    我会说不要使用贴花,因为它们不会对 libgdx 的环境(灯光、阴影等)做出反应。而 Plane 只是一些代表平面的类,根本无法渲染。

    简单的解决方案:使用搅拌机或您选择的任何其他 3D 编辑工具创建一个平面并将您的可耕作纹理应用到它。

    将其导出为 .fbx 并将其转换为 .g3db(libGDX 的格式)。

    将其加载到您的游戏中并制作几个副本(模型实例)。 把它们一个接一个地放在地板上,这样就不会出现空隙,它们都形成了一个很好的重复场地。

    当您的角色向前移动时,检查其在 X 轴(或您想要移动的任何轴)上的位置,以及该位置是否大于您在地板上的最后一个平面的位置 - 比更新地板的距离如下:

    从地面移除第一架飞机并将其添加到您拥有的最后一架飞机之后。

    (使用 ModelBatch 渲染所有内容)

    如果你有足够多的这些飞机,玩家就不会注意到它们出现在远处。还可以使用雾来完全隐藏这种平面过渡。

    这不仅可以应用于飞机,还可以应用于重复山或任何其他可耕种的 3d 对象。

    【讨论】:

    • 感谢您注意避免因照明等原因贴花;有用。我已经创建了纹理矩形的各种实例
    • 不错的答案。你已经添加了我忘记说的所有内容。为此 +1
    【解决方案2】:

    您可以使用 meshpartbuilder (Like explained here) 制作一些 Planes,甚至可以使用 Blender 之类的应用程序制作 Model
    由于您可以从一个Model 中创建多个ModelInstances 并赋予它们不同的Materials,因此您可以一遍又一遍地使用相同的Model。因此,您可以在 XZ 平面上创建一个 4x4 米(例如)大 Model(它只会是 1 个面)。接下来创建,假设 10, ModelInstances 出来并将它们相互添加:

    • 第一个平面:x = 0-4m,y = 0-0,z = 0-4m
    • 第二个平面:x= 4-8m,y = 0-0,z = 0-4m

    等等。只要您的角色处于 X 位置 > 4,您就可以 translateModelInstance firstPlane 前进到第 10 个平面的末端。所以它的新x 将是 44-48 米。
    一旦你达到一个新的水平或另一个地面或任何你可以简单地改变MaterialModelInstance
    对于背景,我建议阅读有关SkyBoxes 的内容。

    希望能帮到你

    【讨论】:

    • 其实这很好用。我现在有 10 个实例,当它们落后于我的角色时,我 thisModelInst.transform.trn(0, 0, z) 将其转换回“堆栈”末端的距离。只需要看看现在让它有多宽(可能是某些级别的墙壁,或者可能只是一个宽阔的地板),然后是距离雾。感谢您的帮助
    • Walls 或多或少是相同的。实际上,它们会通过 XY 平面上的面(或 ZY 取决于您走的方向)。雾的想法也很好,所以你可以隐藏过渡。如果您仍然可以看到转换,您可以增加ModelInstances 的数量,直到性能下降。您甚至可以为渲染距离添加SettingModelInstances 的数量)。只是给你一些想法。
    • 是的,对于墙壁,我将使用上述相同的方法。对于“开放区域”,我只会将地板横向延伸。这可能需要一个单独的问题,但至于雾,有什么地方可以推荐如何完成的吗?搜索libgdx 和fog 的效果并不大。似乎该功能已从以前的版本中删除,现在有一种不同的、更现代的方法吗?
    • 我记得你只需要在环境中添加一个ColorAttribute 类型为ColorAttribue.Fog。 (libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/…)。我记得默认着色器会处理这个雾属性,但我不确定。如果它改变了,我仍然使用 Libgdx idk 的 0.9.9 版本......
    • 是的,我在玩它时没有运气,然后 Xoppa 提到这是我的 cfg.useGL20 = true。我最初有 False 。现在完美运行:)
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多