我是Box2D的新手(在这种情况下是JBox2d),我正在Android应用程序上创建一个滚轮菜单。 我想让用户选择一个菜单项,并且滚轮应自动旋转到所需的部分。 轮体是动态的,通过其中心的旋转接头连接到锚(静态) 我在车轮内的用户水龙头位置和位于车轮顶部的静态车身之间使用了一个距离接头。
我的问题在于关节的设置。我无法弄清楚长度/阻尼/频率的组合,所以我可以在最后以最小的振荡进行快速拉动。 另外,如果我选择了上部的一个元素,它们就会停在正确的位置。但是如果我在结尾点击一个,那么关节不会尊重我给它的0的长度,我最终得到了这个:
如果我使用长度0,dampRatio为1,频率Hz为0,结果是完美的,但我没有动画:它瞬间到达正确的位置。
在iOS上,我使用UIKit Dynamics做了相同的菜单,结果很好:https://www.dropbox.com/s/mb2i44geinw9yp6/iOS_wheel_rotation.mov?dl=0
提前感谢任何指导。
答案 0 :(得分:0)
我认为基本问题在于您尝试使用的关节类型。
距离关节假定两个连接点之间的距离是恒定的(一般来说,box2d关节的基本假设可以稍微弯曲这个规则,但仍然......)。
尝试使用MouseJoint并记住:
当您创建MouseJoint并将其附加到正文时(恰好在您创建MouseJointDef时),您指定一个target
,在此特定时刻(仅此而已)表示想要锚定MouseJoint的身体的一部分(再次指出 - 它在这个体内!)。因此,在您的情况下,此target
应指示您车轮的触摸部分。
当您完成创建关节时(所以在您致电<World_Object>.createJoint(<your_joint>)
之后)target
表示您希望之前设置的地点target
(<强烈的>在这个体内)被移动到(所以这个锚在方向盘的顶部)。
所以基本上你应该使用类似的代码创建你的鼠标关节:
MouseJoint wheelJoint;
MouseJointDef mouseJointDef = new MouseJointDef();
mouseJointDef.bodyA = <something>;
mouseJointDef.bodyB = wheelBody;
mouseJointDef.target.set(0 + chosenWheelPositionOffsetX, 0 + chosenWheelPositionOffsetY);
mouseJointDef.target.addLocal(wheelCenterX, wheelCenterY);
mouseJointDef.dampingRatio = <chosen_value>;
mouseJointDef.frequencyHz = <chosen_value>;
mouseJointDef.maxForce = <chosen_value>;
wheelJoint = (MouseJoint) mWorld.createJoint(mouseJointDef);
然后你应该打电话
wheelJoint.setTarget(topAnchorX, topAnchorY);
调整<chosen_value>s
,以便让您的观看工作完全符合预期。
我希望一切都清楚,如果不是,请告诉我。另外请告诉我,如果更改关节类型有助于解决您的问题。