Libgdx多边形三角剖分

2024-02-28

好的,所以我有一个多边形(简单但凹形),我试图将其切成三角形以使其与其他多边形碰撞。

我知道我的多边形是凹的,所以我决定使用 LibGDX剪耳三角器设法把它切成三角形。

因此,通过这段代码,我得到了三角形顶点:

public void triangulate()
    {
        Vector<float[]> trianglesVertices = new Vector<float[]>();
        ShortArray pointsCoords = new ShortArray();
        EarClippingTriangulator triangulator = new EarClippingTriangulator();

        // Cut in triangles
        pointsCoords = triangulator.computeTriangles(this.getTransformedVertices());

        // Make triangles
        for (int i = 0; i < pointsCoords.size / 6; i++)
        {
            trianglesVertices.add(new float[] {
                    pointsCoords.get(i), pointsCoords.get(i+1),
                    pointsCoords.get(i+2), pointsCoords.get(i+3),
                    pointsCoords.get(i+4), pointsCoords.get(i+5),
            });
            Polygon triangle = new Polygon(trianglesVertices.get(i));
            triangles.add(triangle);
        }

        System.out.printf("Triangulation made %d triangles.\n", pointsCoords.size / 6);
    }

但是当我尝试绘制我刚刚制作的这些三角形时, 它们只是堆叠在 0,0 坐标中.. 而且,所有三角形看起来几乎相同,我的意思是它们都有相同的方向,这正常吗?

我没有找到太多关于 libgdx 的三角剖分使用的信息 你能帮我吗 ?

(抱歉我的英语我是法国人,抱歉没有照片,我在这里太年轻了)

EDIT:这是我的多边形(CCW)

hitbox.setVertices(new float[]{  
                this.getX() + 13, this.getY() - 60,
                this.getX() + 16, this.getY() - 74,
                this.getX() + 39, this.getY() - 74,
                this.getX() + 45, this.getY() - 105,
                this.getX() + 81, this.getY() - 105,
                this.getX() + 88, this.getY() - 74,
                this.getX() + 108, this.getY() - 74,
                this.getX() + 114, this.getY() - 61,
                this.getX() + 106, this.getY() - 30, // Top right
                this.getX() + 101, this.getY() - 29,
                this.getX() + 101, this.getY() - 57,
                this.getX() + 83, this.getY() - 62,
                this.getX() + 75, this.getY() - 50,
                this.getX() + 65, this.getY() - 4, // Top mid
                this.getX() + 62, this.getY() - 4, // Top mid
                this.getX() + 52, this.getY() - 50,
                this.getX() + 44, this.getY() - 62,
                this.getX() + 25, this.getY() - 56, 
                this.getX() + 25, this.getY() - 30,
                this.getX() + 19, this.getY() - 30,  // Top left
                });

EDIT2:现在我有足够的点来向你展示多边形了


这里的问题是EarClippingTriangulator.computeTriangles返回的输出与您预期的不同。它返回一个索引数组,其中每个索引代表您最初传入的数组中的一个顶点。因此,如果您传入一个大小为 8 的数组,则表示 4 个顶点;返回的数组大小为 6(三角形 1 有 3 个顶点,三角形 2 有 3 个顶点)。

假设您有一个 2 x 3 的矩形,其左下角位于 (5, 5)。你的顶点将是:

  • 顶点 0: (5, 5)
  • 顶点 1:(7, 5)
  • 顶点 2: (7, 10)
  • 顶点 3: (5, 10)

您可以将它们压平为一个数组并将它们传递到computeTriangles as:

[5,5,7,5,7,10,5,10]

返回的数组看起来像这样:

[0, 3, 2, 2, 1, 0]

Each 三件套返回数组中的索引形成一个三角形。这些值中的每一个都代表顶点索引在您传入的数据中。在此示例中,输出将告诉您使用这些顶点:

  • 三角形 1:顶点 0、顶点 3、顶点 2
  • 三角形 2:顶点 2、顶点 1、顶点 0

所以你需要绘制这些三角形:

  • 三角形 1:(5, 5) -> (5, 10) -> (7, 10)
  • 三角形 2:(7, 10) -> (7, 5) -> (5, 5)

请注意,这不一定是您通过我提供的输入获得的实际输出,它只是一个示例,旨在说明您应该如何使用返回的数据。

这是我最终得到的代码,它将正确绘制Polygon实例,尽管您可以对任何正确制定的​​顶点数组执行相同的操作:

private void drawFilledPolygon(Polygon polygon, Color color) {
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
    shapeRenderer.setColor(color);

    float[] vertices = polygon.getTransformedVertices();

    // NOTE: you probably don't want to create a new EarClippingTriangulator each frame
    ShortArray triangleIndices = new EarClippingTriangulator().computeTriangles(vertices);
    for (int i = 0; i < triangleIndices.size; i += 3) {
        shapeRenderer.triangle(
            vertices[triangleIndices.get(i) * 2], vertices[triangleIndices.get(i) * 2 + 1],
            vertices[triangleIndices.get(i + 1) * 2], vertices[triangleIndices.get(i + 1) * 2 + 1],
            vertices[triangleIndices.get(i + 2) * 2], vertices[triangleIndices.get(i + 2) * 2 + 1]
        );
    }

    shapeRenderer.end();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Libgdx多边形三角剖分 的相关文章

  • LibGDX 文本字段输入导致崩溃

    所以我试图制作一个登录屏幕 现在的问题是 当我在文本字段中输入文本时 我的游戏崩溃了 这是我的主菜单类 import com badlogic gdx Gdx import com badlogic gdx Screen import co
  • 尝试在 Genymotion 上使用 libgdx 运行 Android 游戏

    有人对 libgdx 和 genymotion 有经验吗 我正在尝试让 libgdx 游戏在 genymotion Android 模拟器上运行 http www genymotion com http www genymotion com
  • 如何让proc更有效?

    有一个顶点集合 x1 y1 x2 y2 xn yn 我想改变这些坐标的中心 所以我尝试 proc changeCenter vertices X Y set myList list foreach element vertices lapp
  • 确定线段是否与多边形相交

    如果我在 2D 平面上有一个向量 由 2 个点组成的线 我如何确定它是否穿过多边形 我知道我可以采用构成多边形的每条线并查看是否有相交 但有更好的方法吗 我读过这篇文章如何确定 2D 点是否在多边形内 https stackoverflow
  • 单击 libGDX 中的 Actor

    我的游戏中有一个覆盖层 其中包含屏幕图像和屏幕 上 的一组按钮 截屏 My Screen有一个Stage The Stage有一组Group对象 我将其视为图层 第一组具有背景 中间的组具有游戏元素 最前面的组具有屏幕覆盖 覆盖层由一个Im
  • 将 TextField 与 LibGDX 结合使用

    我正在使用 LibGDX 开发一款 Android 游戏 并且想要实现两个TextFields 登录到服务器 据我所知我需要使用Stage https libgdx badlogicgames com nightlies docs api
  • LibGDX dispose() 方法应该如何使用?

    我很不清楚如何dispose LibGDX 框架中的方法有效并且应该使用 据我所知 当你不需要某种资源后 你必须进行处置以确保你的程序运行最佳 我正在开发一个移动应用程序 并且我有一个AssetManager在启动时在特殊指定的加载屏幕中加
  • 如何使用 AssetManager 在 libGDX 中构建 ResourceManager

    我想在我的 Android 游戏中使用非静态 AssetManager 我有很多层次 我应该如何使用AssetManager 我应该为每个级别创建一个单独的 AssetManager 吗 因为如果我创建一个 AssetManager 它将在
  • 在 box2d 主体顶部绘制字体

    如何在静态 box2d 主体顶部绘制文本 字体 背景 我能够正确地在身体顶部绘制精灵 我通过拥有一个来做到这一点box2dSpriteBatch像这样投影在 box2dCamera 上box2dSpriteBatch setProjecti
  • libgdx SpriteBatch 渲染到纹理

    是否可以使用 libGdx 适用于 Android 桌面的 Java 引擎 中的 SpriteBatch 渲染到纹理 如果是这样 怎么办 基本上我想将所有内容渲染到 512 x 256 纹理的 320 x 240 区域 然后缩放区域以适合屏
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • DbGeography 多边形到 JSON

    我将 DbGeography 多边形存储在数据库中 我的控制器从数据库获取多边形 我需要将它们转换为 JSON var polygons db Areas Where x gt x Type type Select x gt new Vie
  • ProGuard SimException

    经过大约 4 个小时的随机尝试 我正在尝试让 ProGuard 正常工作 尝试让这个令人惊叹的软件正常工作 我的项目使用 LibGDX 和 KryoNet 这是我当前的 ProGuard 配置 verbose dontobfuscate d
  • 如何让用户从图库中选择一张图片在游戏中使用,LibGDX

    我是学习 LibGDX 的初学者 我正在 LibGDX 中开发我的第一个游戏 您可以用选定的图片 例如某人的头部 替换敌人的球 然后躲避敌人 在我的主菜单中 我有 stage2d 按钮 我想要一个按钮 让用户选择他想要在游戏中使用的图片 所
  • LibGDX纹理混合与OpenGL混合功能

    在 libGdx 中 我试图创建一个成形纹理 采用完全可见的矩形纹理并将其遮罩以获得成形纹理 如下所示 在这里我在矩形上测试它 但我想在任何形状上使用它 我调查过本教程 http www learnopengles com tag addi
  • 在哪里可以访问 Gdx.files.local()?

    我有一个预制的 json 文件 我想测试一下 这个 Json 文件将被修改 所以我想读 写 我注意到内部是只读的 所以我想将我的 Json 文件保存在本地存储中 通过 eclipse 或操作系统 windows 8 手动 以便我可以通过 f
  • Android 谷歌地图多边形点击事件[重复]

    这个问题在这里已经有答案了 我正在 Android 上开发地图应用程序 并且正在使用 Google Maps Android API V2 我从 Web 服务获取多边形数据 通过 XML 解析对其进行转换 然后可以毫无问题地将其显示在地图上
  • 运行 libgdx html

    我正在尝试理解这个伟大的库 当我尝试使用 run as gt web 应用程序运行 html 时 出现错误 这是控制台文本和 gwt 定义文件 Loading modules com me mygdxgame GwtDefinition L
  • 渲染和触摸输入之间的 libgdx 坐标系差异

    我有一个渲染 PNG 图像的屏幕 BaseScreen 实现了 Screen 接口 单击屏幕时 会将角色移动到触摸的位置 用于测试目的 public class DrawingSpriteScreen extends BaseScreen
  • libgdx 贴花动态文本

    我正在 Libgdx 中开发 3D 2 5D 应用程序 我发现贴花对于此目的非常有用 在我的应用程序中应该有包含动态文本的图层 现在我想知道通过贴花绘制文本的最佳方法是什么 目前我的实现是基于将 BitmapFont 绘制到 FBO 然后在

随机推荐