在Box2D项目中,我需要在用户双击的两个PolygonShaped体之间创建一个RevoluteJoint。
我有触摸点,以及两个形状中每个形状的顶点列表(显然设置为不相互碰撞。)如果我理解正确,触摸点就是世界位置,而且顶点描述的形状可以存在于任何世界中。但是我如何从一个“翻译”到另一个呢?
例如,用户双击(3.63,5.07)。
形状1的顶点为:[(0.37485206,-0.17777264),( - 0.2880008,-0.033603553),( - 0.1609711,-0.2395713),( - 0.04113376,-0.31708732),(0.26274818,-0.38661742),( 0.35696936,-0.29765773)]
形状2的顶点:[( - 0.015462875,0.24353802),( - 0.13529873,0.31698608),( - 0.36852637,0.4127499),( - 0.4136281,0.17009032),( - 0.2880008,-0.033603553)]
revoluteJoint:
RevoluteJointDef jd = new RevoluteJointDef();
jd.bodyA = touchedBodies.get(0);
jd.bodyB = touchedBodies.get(1);
jd.collideConnected = false;
jd.localAnchorA.set(?????);
jd.localAnchorB.set(?????);
world.createJoint(jd);
非常感谢任何帮助。
编辑:
我取得了一些进展,但仍然没有。我现在正在做的是根据形状的顶点找到一个“平均”位置。我正在进行第一个条目,并且知道顶点逆时针计算哪一个是中间顶点,并假设它距离第一个顶点最远。所以我正在做两个平均值,然后设置关节。
以下是代码:
Shape shape1 = touchedFixtures.get(0).getShape();
Vec2 oneAverage = null;
if(shape1.getClass() == PolygonShape.class) {
PolygonShape s = (PolygonShape)shape1;
Vec2[] vs = s.m_vertices;
List<Vec2> vsNonZero = new LinkedList<Vec2>();
for(int i=0; i<vs.length; i++) {
if(vs[i].x != 0 || vs[i].y != 0) {
vsNonZero.add(vs[i]);
}
}
Vec2 oneOne = vsNonZero.get(0);
Vec2 oneMiddle = vsNonZero.get(Math.round(vsNonZero.size()/2));
oneAverage = new Vec2((oneOne.x + oneMiddle.x)/2, (oneOne.y + oneMiddle.y)/2);
}
该联合的当地主播:
jointDef.localAnchorA.set(oneAverage);
我正在为关节的第二个身体做同样的事情。这找到了相当不错的接近度,但它并不完美,特别是如果形状更大。
知道如何更接近实际触摸点吗?我需要的是像shape.getTouchedPoint(),但API似乎没有提供它。
答案 0 :(得分:1)
您就是这样做的:
jd.localAnchorA = touchedBodies.get(0).getLocalPoint(locationWorld);
jd.localAnchorB = touchedBodies.get(1).getLocalPoint(locationWorld);
上面的touchbody是一个列表,其中包含两个被触摸的实体,因此上面的内容可以替换为:
jd.localAnchorA = bodyA.getLocalPoint(locationWorld);
jd.localAnchorB = bodyB.getLocalPoint(locationWorld);
感谢iforce2d在这里提供了这个答案(http://www.cocos2d-iphone.org/forum/topic/343137#post-507904),并提供了一些解释和C ++代码。
答案 1 :(得分:0)
局部锚点指的是关节在本地身体坐标中“连接”的位置。每个身体都有自己的坐标系,这是你在身体中定位形状时使用的系统。例如,当身体在世界中旋转时,形状在身体的局部坐标中处于相同的位置。
因此,localAnchorA是身体A的局部坐标系中与身体A的连接,对于身体B的B也是如此。
基本上,使用您在创建时提供的形状坐标在方格纸上绘制形状,然后使用该坐标系为关节的锚点选择一个点。
编辑:对于动态内容,请在正文对象上使用getLocalPoint
方法,或者使用getLocalPointToOut
方法进行冷却。类似的东西:
jd.bodyA.getLocalPointToOut(worldLocation, jd.localAnchorA);