setAngularVelocity rotates really slowly

感情迁移 提交于 2019-12-11 09:16:46

问题


I am using the basic libgdx box2d to manage physics operations of a game. Everything is working properly, except the rotations: even when I set

anyobject.body.setAngularVelocity(someLargeConstant);

the object rotates really slowly(and almost at the same speed) no matter what the 'someLargeConstant' is. Except when I use small numbers for parameter, it can rotate slower. Thus I think I somehow have a maximum angular velocity constant inside my world object, which should be set to some small value.

(I also had a similar issue with linear velocity before and I solved it by adjusting the pixels/meter scale. So its unlikely that the problem is a scaling issue.)

How can I enable the objects to rotate faster?

Here is the code I use:

private static World world = new World(new Vector2(0, 0), true);   //Create a world with no gravity

to create an object I call another class

 public Object(World world, short category, short mask, float x, float y, float radius, Sprite image, 
        float maxSpeed, float frictionStrength, float linearDamping, float angularDamping, boolean movable,
        float elasticity, float mass){

    this.world = world; 
    this.category = category;
    this.mask = mask;
    // We set our body type
    this.bodyDef = new BodyDef();
    if(movable==true){bodyDef.type = BodyType.DynamicBody;}else{bodyDef.type = BodyType.StaticBody;}
    // Set body's starting position in the world
    bodyDef.position.set(x, y);
    bodyDef.linearDamping = linearDamping;
    bodyDef.angularDamping = angularDamping;
    // Create our body in the world using our body definition
    this.body = world.createBody(bodyDef);
    // Create a circle shape and set its radius
    CircleShape circle = new CircleShape();
    circle.setRadius(radius);
    // Create a fixture definition to apply our shape to
    fixtureDef = new FixtureDef();
    fixtureDef.shape = circle;
    fixtureDef.density = (float) (mass/(Math.PI*radius*radius)); 
    fixtureDef.friction = frictionStrength;
    fixtureDef.restitution = elasticity;
    fixtureDef.filter.categoryBits = category;
    fixtureDef.filter.maskBits = mask;
    // Create our fixture and attach it to the body
    this.fixture = body.createFixture(fixtureDef);
    // BodyDef and FixtureDef don't need disposing, but shapes do.
    circle.dispose();

    ... unrelated functions after that
    }

and here I just try to make it rotate fast:

    tempBall.body.setAngularVelocity(20000);

回答1:


angularvilocity is used to set the direction of the rotation when it comes to use it with an actionListener as like key or mouse lister , here is an example of use :

 case KeyEvent.VK_RIGHT:
              ball.setAngularVelocity(-20); // Directly set the angular velocity

case KeyEvent.VK_LEFT:
              ball.setAngularVelocity(20); // Directly set the angular velocity

like you can see here the code make the ball body rotate to the right in Key_Right pressed and to the left in Key_Left pressed , and i can play aroud with it's argument to increase or lower the rotation speed and it works pretty well for me , here is my body definition try to apply the same values and it must work with no problem :

private Body createObject(Shape shape, BodyType type, Vec2 position, float orientation, Sprite sprite) throws InvalidSpriteNameException {
           for(Sprite s:spriteList) {
            if(s.getName().equals(sprite.getName())) {
                throw new InvalidSpriteNameException(sprite.getName()+" already used.");
            }
           }
        Body body = null;
        FixtureDef fixDef = new FixtureDef();
        fixDef.shape = shape;
        fixDef.density = 0.1f;
        fixDef.isSensor = false;
        fixDef.restitution = 0.1f;

        BodyDef bodyDef = new BodyDef();
        bodyDef.type = type;

        bodyDef.angularDamping = 0.1f;
        bodyDef.linearDamping = 0.1f;

        bodyDef.fixedRotation = false;
        bodyDef.gravityScale = 1f;

        bodyDef.linearVelocity = new Vec2(0,0);
        bodyDef.angularVelocity = 0;
        bodyDef.position = new Vec2(position);
        bodyDef.angle = orientation;
        bodyDef.allowSleep = true;
        spriteList.add(sprite); // Save the sprite to the list (sprites must be serialiazed in the PhysicalWorld)
        bodyDef.userData = sprite; // Link the body and the sprite

        do {
            body = jBox2DWorld.createBody(bodyDef);
        } while(body== null); // Wait until the object is really created
        sprite.linkToBody(body); // Link the body to the sprite (this link is not serialiazed)
        body.createFixture(fixDef);
        return body;
    }



回答2:


I just found the problem, and it was pretty simple. Im just going to post this here for future googlers:

Object was actually rotating properly, the problem was in my drawing method, I didn't use conversion between radians to degrees in my batch.draw, and it interpreted everything in radians. I know, such an amateur mistake! Thanks a lot for your time.



来源:https://stackoverflow.com/questions/28546441/setangularvelocity-rotates-really-slowly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!