将动态物理体添加到绘制的线条
Adding a dynamic physic body to a drawn line
我正在开发一款与 libGDX (https://www.youtube.com/watch?v=avkacGQKWec) 上的 "Crayon Physics Deluxe" 机制类似的游戏。我坚持绘制的算法实现。问题是动力学体不适用于 EdgeShapes 和 ChainShapes。我曾尝试使用多边形化算法,但它的工作方式与 "Crayon Physics" 不完全一样,并且会产生很多错误。
有什么办法可以在画出来的时候加上动态的body吗?
终于,我解决了拼接矩形的问题。下面详细介绍该方法。该过程分为 3 个部分:
1.- 减少用户输入
为了提高性能,我定义了一个公差距离:每个点都必须按照定义的公差距离与之前的点分开。
2.- 平滑输入
为了避免尖峰和锯齿状拐角,我使用了 Chaikin 平滑算法的一次迭代。(http://www.idav.ucdavis.edu/education/CAGDNotes/Chaikins-Algorithm/Chaikins-Algorithm.html)
3.- 构建一行矩形
一旦我们处理并平滑了输入,最后一步就是构建物理 [=40=]。 body 将有多个矩形
固定装置。具体来说,NUMBER_OF_POINTS/2 fixtures,因为我们将每两个点构造一个矩形。下一张图说明了这个过程:
这就是实现它的代码:
private static Body createPhysicBodies(Array<Vector2> input, World world) {
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
Body body = world.createBody(bodyDef);
for (int i = 0; i < input.size - 1; i++) {
Vector2 point = input.get(i);
Vector2 dir = input.get(i + 1).cpy().sub(point);
float distance = dir.len();
float angle = dir.angle() * MathUtils.degreesToRadians;
PolygonShape shape = new PolygonShape();
shape.setAsBox(distance / 2, Constants.THICKNESS / 2, dir.cpy()
.scl(0.5f).add(point), angle);
body.createFixture(shape, 1.0f);
}
return body;
}
我正在开发一款与 libGDX (https://www.youtube.com/watch?v=avkacGQKWec) 上的 "Crayon Physics Deluxe" 机制类似的游戏。我坚持绘制的算法实现。问题是动力学体不适用于 EdgeShapes 和 ChainShapes。我曾尝试使用多边形化算法,但它的工作方式与 "Crayon Physics" 不完全一样,并且会产生很多错误。
有什么办法可以在画出来的时候加上动态的body吗?
终于,我解决了拼接矩形的问题。下面详细介绍该方法。该过程分为 3 个部分:
1.- 减少用户输入
为了提高性能,我定义了一个公差距离:每个点都必须按照定义的公差距离与之前的点分开。
2.- 平滑输入
为了避免尖峰和锯齿状拐角,我使用了 Chaikin 平滑算法的一次迭代。(http://www.idav.ucdavis.edu/education/CAGDNotes/Chaikins-Algorithm/Chaikins-Algorithm.html)
3.- 构建一行矩形
一旦我们处理并平滑了输入,最后一步就是构建物理 [=40=]。 body 将有多个矩形 固定装置。具体来说,NUMBER_OF_POINTS/2 fixtures,因为我们将每两个点构造一个矩形。下一张图说明了这个过程:
这就是实现它的代码:
private static Body createPhysicBodies(Array<Vector2> input, World world) {
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
Body body = world.createBody(bodyDef);
for (int i = 0; i < input.size - 1; i++) {
Vector2 point = input.get(i);
Vector2 dir = input.get(i + 1).cpy().sub(point);
float distance = dir.len();
float angle = dir.angle() * MathUtils.degreesToRadians;
PolygonShape shape = new PolygonShape();
shape.setAsBox(distance / 2, Constants.THICKNESS / 2, dir.cpy()
.scl(0.5f).add(point), angle);
body.createFixture(shape, 1.0f);
}
return body;
}