很难解释这个问题所以我录制了一个视频来说明问题。 [Video here]
我在box2d对象(body)中有图像。当用户拖动一个演员时,下面的身体也会移动,以便图像跟随物理。当身体没有完全旋转时,一切都按预期工作(拖放),但是当旋转发生时,运动变得疯狂,从而产生无限旋转的不良效果。
这是我的方法:
在构造函数中:
for(final Brick b : map.list){
stage.addActor(b.img);
Vector3 v = new Vector3(b.box.getPosition().x,b.box.getPosition().y,0);
camera.project(v);
b.img.setPosition(v.x-b.img.getWidth()*0.5f, v.y-b.img.getHeight()*0.5f);
b.img.setOrigin(b.img.getWidth()*0.5f, b.img.getHeight()*0.5f);
b.img.setRotation((float) Math.toDegrees(b.box.getAngle()));
b.img.addListener((new DragListener() {
public void touchDragged (InputEvent event, float x, float y, int pointer) {
float newPosX =b.img.getX() + x;
float newPosY = b.img.getY() + y;
b.img.setPosition(newPosX-b.img.getWidth()*0.5f,newPosY-b.img.getHeight()*0.5f);
b.box.setTransform(newPosX, newPosY, b.box.getAngle());
}
}));
}
其中map.list是包含可以拖动的所有实体的列表。
在渲染功能中:
for(final Brick b : map.list){
b.img.setVisible(true);
b.img.setPosition(b.box.getPosition().x-b.img.getWidth()*0.5f, b.box.getPosition().y-b.img.getHeight()*0.5f);
b.img.setOrigin(b.img.getWidth()*0.5f, b.img.getHeight()*0.5f);
b.img.setRotation((float) Math.toDegrees(b.box.getAngle()));
}
提前多多感谢!
答案 0 :(得分:0)
我认为你的问题是你没有错误地设置旋转原点。
b.img.setOrigin(b.img.getWidth()*0.5f, b.img.getHeight()*0.5f);
只要尸体完全没有旋转,一切正常。假设你的身体位置在身体的中心,这应该是
b.img.setOrigin(v.x, v.y);
尝试使用Box2dDebugRenderer快速检查身体是否真的移动得如此奇怪,或者你是否只是错误地绘制图片。