在Libgdx中旋转后获取Scene2D Actor的位置

时间:2014-05-13 14:38:04

标签: math geometry libgdx scene2d

我有以下旋转功能:

public void rotate( Actor a ) {
    float rotateBy = 30.0f,
          newX = ( a.getX() * ( float ) Math.cos( rotateBy ) ) - ( a.getY() * ( float ) Math.sin( rotateBy ) ),
          newY = ( a.getX() * ( float ) Math.sin( rotateBy ) ) + ( a.getY() * ( float ) Math.cos( rotateBy ) ),
          moveByX = a.getX() - newX, // delta
          moveByY = a.getY() - newY, // delta
          duration = 1.0f; // 1 second

    a.addAction(
        Actions.sequence(
            Actions.parallel(
                Actions.rotateBy( rotateBy, duration ),
                Actions.moveBy( moveByX, moveByY, duration )
            )
        )
    );
}

但似乎 moveByX moveByY 值不准确。

目标是弄清楚旋转后新的x,y是多少,并向上移动那么多,以便它仍然保持与旋转前相同的y。

Desired result

另外,我的演员的绘画方法:

    @Override
    public void draw( Batch batch, float parentAlpha ) {
        batch.draw( texture, getX(), getY(), getWidth()/2, getHeight()/2, getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation() );
    }

1 个答案:

答案 0 :(得分:1)

这就是我这样做的方式:首先,演员的原点必须是正方形的中心,然后在其中心旋转演员,你会看到类似的东西

problem

红线表示演员需要向上移动才能跟随发言权的y偏移量,因为你可以看到这个y偏移量的增加和减少(所以也许你不能使用Actions.moveBy因为这会沿着线性方式移动它而你的路径不是线性的,请看蓝线)所以

Vector2 pos = new Vector2();
public void rotate(float delta, Actor a) {
    a.rotateBy(angularSpeed*delta);
    pos.x += linearSpeed*delta;
    a.setPosition(pos.x,pos.y+yOffset(a.getRotation());
}

yOffset是根据方形旋转角度描述红线长度的函数:

public float yOffset(float angle) {
    angle %= Math.PI/2;
    return (float) Math.abs(squareSize*(Math.sin((Math.PI/4+angle))-Math.sin(Math.PI/4)));
}

所有角度都是弧度。