Libgdx多边形三角剖分
好的,我有一个多边形(简单但凹面),我试图将其切割成三角形,使其与另一个多边形碰撞 我知道我的polygone是凹面的,所以我决定用LibGDX耳剪三角板将它切割成三角形 通过这段代码,我得到了三角形的顶点:Libgdx多边形三角剖分,libgdx,polygon,triangulation,convex,concave,Libgdx,Polygon,Triangulation,Convex,Concave,好的,我有一个多边形(简单但凹面),我试图将其切割成三角形,使其与另一个多边形碰撞 我知道我的polygone是凹面的,所以我决定用LibGDX耳剪三角板将它切割成三角形 通过这段代码,我得到了三角形的顶点: public void triangulate() { 向量三角形顶点=新向量(); ShortArray pointsCoords=新的ShortArray(); EarClippingTriangulator三角剖分器=新的EarClippingTriangulator(); //切成
public void triangulate()
{
向量三角形顶点=新向量();
ShortArray pointsCoords=新的ShortArray();
EarClippingTriangulator三角剖分器=新的EarClippingTriangulator();
//切成三角形
pointsCoords=triangulator.computeTriangles(this.getTransformerAdverties());
//做三角形
对于(int i=0;i
但当我试着画我刚画的三角形时,
他们只是在0,0坐标上叠加。。
所有的三角形看起来几乎都一样,这正常吗?我的意思是它们都有相同的方向
对于libgdx的这种转换使用,我没有找到太多的信息
你能帮忙吗
(对不起我的英语我是法国人,对不起没有照片,我在这里太年轻了)
编辑:这是我的多边形(在CCW中)
hitbox.setVertices(新浮点[]{
这个.getX()+13,这个.getY()-60,
这个.getX()+16,这个.getY()-74,
这个.getX()+39,这个.getY()-74,
这个.getX()+45,这个.getY()-105,
这个.getX()+81,这个.getY()-105,
这个.getX()+88,这个.getY()-74,
这个.getX()+108,这个.getY()-74,
这个.getX()+114,这个.getY()-61,
this.getX()+106,this.getY()-30,//右上角
这个.getX()+101,这个.getY()-29,
这个.getX()+101,这个.getY()-57,
这个.getX()+83,这个.getY()-62,
这个.getX()+75,这个.getY()-50,
this.getX()+65,this.getY()-4,//顶部中间
this.getX()+62,this.getY()-4,//Top-mid
这个.getX()+52,这个.getY()-50,
这个.getX()+44,这个.getY()-62,
这个.getX()+25,这个.getY()-56,
这个.getX()+25,这个.getY()-30,
this.getX()+19,this.getY()-30,//左上角
});
EDIT2:现在我得到了足够的点来显示多边形
问题在于您的循环:
// 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);
}
这里的问题是,
earcippingtriangulator.computeTriangles
返回的输出与您预期的不同。它返回一个索引数组,其中每个索引表示最初传入的数组中的一个顶点。因此,如果你传入一个大小为8的数组,它将代表4个顶点;返回的数组大小为6(三角形1为3个顶点,三角形2为3个顶点)
假设有一个2x3的矩形,左下角为(5,5)。您的顶点将是:
- 顶点0:(5,5)
- 顶点1:(7,5)
- 顶点2:(7,10)
- 顶点3:(5,10)
computeTriangles
中,如下所示:
[5,5,7,5,7,10,5,10]
返回的数组如下所示:
[0,3,2,2,1,0]
返回数组中三个索引的每个集合形成一个三角形。这些值中的每一个都表示传入数据中顶点的索引。在本例中,输出将告诉您使用以下顶点:
- 三角形1:顶点0、顶点3、顶点2
- 三角形2:顶点2、顶点1、顶点0
- 三角形1:(5,5)->(5,10)->(7,10)
- 三角形2:(7,10)->(7,5)->(5,5)
多边形
实例,尽管您可以对任何正确制定的顶点数组执行相同的操作:
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();
}
private void drawFilled多边形(多边形,颜色){
开始(shaperender.ShapeType.Filled);
设置颜色(颜色);
float[]顶点=多边形。getTransformedAdverties();
//注意:您可能不希望在每个帧中创建新的EarClippingTriangulator
ShortArray triangleIndices=新的EarClippingTriangulator().computeTriangles(顶点);
对于(int i=0;i
你能带上你有问题的多边形吗?我只是加了一个,事实上这是一个船坞你说得对,三角测量现在很好。唯一剩下的一个问题是它们的位置,我从多边形的变换顶点进行三角剖分,但三角形仍然在坐标0,0处,即使在平移之后是的,我最终没有使用耳剪裁三角剖分器。我自己把船切割成凸多边形,然后检查是否有碰撞。For exe
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();
}