Box2D プロジェクトでは、ユーザーがダブルタップした正確なポイントで、2 つの PolygonShaped ボディ間に RevoluteJoint を作成する必要があります。
接触点と、2 つの形状のそれぞれの頂点のリストがあります (明らかに、互いに衝突しないように設定されています)。私の理解が正しければ、接触点は世界の位置に関するものであり、頂点は説明しています。どんな世界にも存在できる形。しかし、あるものから別のものに「翻訳」するにはどうすればよいでしょうか。
たとえば、ユーザーが (3.63,5.07) をダブルタップしたとします。
形状1の頂点は次のとおりです。 0.29765773)]
形状 2 の頂点: [(-0.015462875,0.24353802), (-0.13529873,0.31698608), (-0.36852637,0.4127499), (-0.4136281,0.17009032), (-0.2880008,-03.0533)]
回転ジョイント:
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);
どんな助けでも大歓迎です。
編集:
私は少し進歩しましたが、まだそこにはいません。私が今行っているのは、形状の頂点に基づいて「平均的な」位置を見つけることです。私は最初のエントリを取り、頂点が反時計回りに移動することを知っているので、どれが中央の頂点であるかを計算し、それが最初の頂点から最も遠いと仮定します。だから私は2つの平均をやっていて、そこにジョイントを設定しています.
コードは次のとおりです。
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);
ジョイントの 2 番目のボディについても同じことを行っています。これはかなり適切な近接性を見つけますが、特に形状が大きい場合は完全ではありません。
実際のタッチポイントに近づく方法はありますか? 私が必要とするのは shape.getTouchedPoint() のようなものですが、API はそれを提供していないようです。