Libgdx 将多晶粒子一分为二会产生错误的旋转+;抵消?
我试图实现一种类似于水果忍者的分割效果,但必须在用户滑动的地方切割对象。我按照教程进行了操作,并在box2d实体上进行了拆分,但无法正确拆分精灵。所以我想要的是身体有一个精灵,精灵以与身体相同的方式分裂,我使用PolygonSprite,精灵以正确的形状分裂,并与身体同时移动,但是图像中有一个偏移量,而且每次我进行剪切时,它似乎只会剪切原始纹理而不旋转。以下是我得到的: 在我切之前:Libgdx 将多晶粒子一分为二会产生错误的旋转+;抵消?,libgdx,box2d,Libgdx,Box2d,我试图实现一种类似于水果忍者的分割效果,但必须在用户滑动的地方切割对象。我按照教程进行了操作,并在box2d实体上进行了拆分,但无法正确拆分精灵。所以我想要的是身体有一个精灵,精灵以与身体相同的方式分裂,我使用PolygonSprite,精灵以正确的形状分裂,并与身体同时移动,但是图像中有一个偏移量,而且每次我进行剪切时,它似乎只会剪切原始纹理而不旋转。以下是我得到的: 在我切之前: 第一次切割后(请注意,小三角形不是原始图像的右上角,并且图像未正确居中): 在我剪切小三角形后(注意它是如何
第一次切割后(请注意,小三角形不是原始图像的右上角,并且图像未正确居中):
在我剪切小三角形后(注意它是如何旋转回来的,没有剪切实际图像): 下面是我拆分对象的方法:
private void createSlice(数组顶点、整数垂直度、Body affectedBody){
Vector2中心=findCentroid(顶点,顶点.大小);
对于(int i=0;i
我的猜测是,我必须将顶点旋转到0度,进行切割,然后将它们旋转回来,但我不确定如何做到这一点
谢谢
private void createSlice(Array<Vector2> vertices, int numVertices, Body affectedBody) {
Vector2 center = findCentroid(vertices, vertices.size);
for (int i = 0; i < numVertices; i++) {
vertices.get(i).sub(center);
}
BodyDef sliceBody = new BodyDef();
sliceBody.position.set(center.x, center.y);
sliceBody.type = BodyDef.BodyType.DynamicBody;
PolygonShape slicePoly = new PolygonShape();
float[] verticesArray = new float[vertices.size * 2];
int j = 0;
for (int i = 0; i < verticesArray.length; i+=2) {
verticesArray[i] = vertices.get(j).x;
verticesArray[i+1] = vertices.get(j++).y;
}
slicePoly.set(verticesArray);
FixtureDef sliceFixture = new FixtureDef();
sliceFixture.shape = slicePoly;
sliceFixture.density = 1;
Body worldSlice = mWorld.createBody(sliceBody);
worldSlice.createFixture(sliceFixture);
for (int i = 0; i < numVertices; i++) {
vertices.get(i).add(center);
}
// create polygon sprite
float[] scaledVertices = new float[verticesArray.length];
for (int i = 0; i < verticesArray.length; i++) {
scaledVertices[i] = verticesArray[i] * Constants.BOX_TO_WORLD;
}
short[] triangles = mTriangulator.computeTriangles(scaledVertices).toArray();
TextureRegion bodyPolyTexReg = ((PolygonSprite) affectedBody.getUserData()).getRegion().getRegion();
PolygonRegion polyReg = new PolygonRegion(bodyPolyTexReg, scaledVertices, triangles);
PolygonSprite polySprite = new PolygonSprite(polyReg);
polySprite.setOrigin(0, 0);
// set the sprite as the body's user data
worldSlice.setUserData(polySprite);
}