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多边形三角剖分 的相关文章

  • iOS 的 Libgdx 项目在模拟器上通过 robovm 编译时显示 libgdx 启动画面?

    如何删除出现在 iOS 模拟器上但未出现在 Android 模拟器中的 libgdx 启动画面 我正在通过 robovm 编译我的 libgdx 项目 Thanks 您将需要替换 RoboVM iOS 项目的 数据 文件夹中的各种 默认 图
  • 谷歌是如何获得地图上邮政编码的轮廓的?

    例如 http g co maps 2dpkj http g co maps 2dpkj有邮政编码区域周围的轮廓 我知道这无法通过 API 获得 但我还可以从哪里获取此数据 例如 KML 格式 这是英国数据 最有可能的Google 与英国地
  • GdxRuntimeException:无法加载文件

    我正在关注this http code google com p libgdx wiki HelloWorldlibgdx 教程 我想做的是从 badlogic jpg 的副本加载纹理 副本称为 wawa jpg public class
  • 如何生成多个apk(使用gradle,libGDX)

    我试试这个 http tools android com tech docs new build system user guide apk splits 我想生成一些APK x86 armeabi v7a 为了减少Google Play中
  • LibGDX 将 BitmapFont 绘制到中间位置(spritebatch)

    我想使用 BitmapFont 绘制一些文本 临时位置 然后绘制该位置的一部分 到最后的精灵批次 我当时正在考虑画画 到临时 spritebatch 但不可能 将 spritebatch 绘制到另一个上 我怎样才能做到这一点 您可以使用帧缓
  • 程序在 LibGDX -desktop 上运行良好,但在 LibGDX - Android 上运行不佳?

    因此 我刚刚使用 Gradle 设置 Eclipse 来与 LibGDX 一起使用 安装后我发现Android软件包有问题 软件包旁边有一个红十字 当我进一步打开它时 src 旁边有一个红叉 然后是 com myname game andr
  • 在模拟器中运行时,libgdx 在 helloworld 应用程序上抛出异常

    我已经按照教程进行了操作并使用 libgdx 库创建了一个简单的应用程序 该应用程序具有红色背景 当我将其作为独立的桌面应用程序运行时 效果很好 但是当我运行 android 版本时 会引发以下异常 并且应用程序无法启动 02 04 18
  • Gdx.input.getY 被翻转

    我在 LibGDX 中遇到一个问题 当我调用 Gdx input getY 时 它会选择相对于屏幕中心位于应用程序另一侧的像素 public class Main extends ApplicationAdapter private Spr
  • LibGDX 文本字段输入导致崩溃

    所以我试图制作一个登录屏幕 现在的问题是 当我在文本字段中输入文本时 我的游戏崩溃了 这是我的主菜单类 import com badlogic gdx Gdx import com badlogic gdx Screen import co
  • 绘制可调整大小(不相交)的多边形

    我到处寻找但找不到答案 我 需要通过鼠标交互绘制可调整大小的多边形 但我 不希望出现不规则 重叠或相交的多边形 结尾 这是绘制可调整大小的多边形的简单示例http www wolfpil de polygon html http www w
  • 如何让proc更有效?

    有一个顶点集合 x1 y1 x2 y2 xn yn 我想改变这些坐标的中心 所以我尝试 proc changeCenter vertices X Y set myList list foreach element vertices lapp
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 分割多重多边形

    我可以直接取出零件并把它们取出来作为它们自己的功能吗 或者这会涉及更复杂的东西吗 我正在尝试将其中一张地图拆分为较小的部分以对它们进行索引 https github com simonepri geo maps https github c
  • 在 LibGDX 中保存和检索图像文件

    如何在 LibGDX 中保存和检索图像文件 我想将图像文件保存在 AndroidApplication 类的本地存储中 并在我的 Core 项目中检索它 Libgdx 中的文件处理在libGDX 维基 https github com li
  • 生成落在多边形或形状内的点网格的最快方法?

    我在 python 中使用 shapely 并尝试在网格中生成均匀间隔的点 这些点在最快的 O n 时间内落在形状内 形状可以是任何闭合多边形 而不仅仅是正方形或圆形 我目前的做法是 找到最小 最大 y 和 x 来构建一个矩形 给定间距参数
  • LibGDX dispose() 方法应该如何使用?

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

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • 在 box2d 主体顶部绘制字体

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

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 如何使用 LibGdx 在 Android 上设置地图大小

    我正在开发一个简单的游戏 但在设置地图大小时遇到 问题 我在用OrthographicCamera 我希望地图可见 我应该如何设置视口的正确大小new OrthographicCamera viewport width viewport h

随机推荐