2014-05-14 5 views
2

LibGDX를 사용하여 Box2D에서 자동 회전을 적용하는 방법은 무엇입니까? 이것은 현실적으로 보이지 않습니다 (그림 참조). 현실 세계에서 LibGDX + Box2D 로테이션

Screenshot

는 블록 회전 넘어하지만이 시뮬레이션에서하지 않는 것입니다. 메인 게임 클래스

PolygonShape pShape = new PolygonShape(); 
FixtureDef fDef = new FixtureDef(); 
BodyDef bDef = new BodyDef(); 
Body body; 

pShape.setAsBox(width, height); 
bDef.position.set(x, y); 
bDef.type = type; 
fDef.shape = pShape; 
fDef.density = 1.0f; 
fDef.friction = 0.3f; 
body = world.createBody(bDef); 
body.createFixture(fDef); 
body.setUserData(this); 
MassData md = new MassData(); 
md.mass = 5; 
body.setMassData(md); 

코드 :

세계는 -9.81에서 Y 중력을 (너무 떨어지고 좋은 작품 충돌) 나는 상자를 생성하는 곳의 코드가

public class Game implements ApplicationListener { 

public static int WIDTH; 
public static int HEIGHT; 

World world; 
Box2DDebugRenderer dr; 
OrthographicCamera cam; 
float time; 
final float P = 1/60f; 
final static int C = 100; 

public void create() { 
    Gdx.gl.glClearColor(.1f, .1f, .1f, 1.0f); 
    WIDTH = Gdx.graphics.getWidth(); 
    HEIGHT = Gdx.graphics.getHeight(); 
    world = new World(new Vector2(0, -9.8f), false); 

    dr = new Box2DDebugRenderer(); 
    cam = new OrthographicCamera(); 
    cam.setToOrtho(false, WIDTH/C, HEIGHT/C); 

    new Block(world, BodyType.StaticBody, 2,  HEIGHT,  0,   HEIGHT); 
    new Block(world, BodyType.StaticBody, 2,  HEIGHT,  WIDTH-40, HEIGHT); 
    new Block(world, BodyType.StaticBody, WIDTH, 2,   WIDTH,  HEIGHT); 
    new Block(world, BodyType.StaticBody, WIDTH, 2,   WIDTH,  0); 
} 

public void render() { 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    input(); 

    dr.render(world, cam.combined); 

    time += Gdx.graphics.getDeltaTime(); 
    while(time >= P) { 
     update(); 
     time -= P; 
    } 
} 

public void update() { 
    world.step(P, 5, 5); 
} 

public void input() { 
    if(Gdx.input.isTouched()) { 
     new Block(world, BodyType.DynamicBody, 50, 20, Gdx.input.getX(), HEIGHT-Gdx.input.getY()); 
    } 
} 

public void dispose() { } 
public void pause() { } 
public void resize(int arg0, int arg1) { } 
public void resume() { } 
} 
블록 클래스

코드 :

public class Block { 

public Block(World world, BodyType type, float width, float height, float x, float y) { 

    PolygonShape pShape = new PolygonShape(); 
    FixtureDef fDef = new FixtureDef(); 
    BodyDef bDef = new BodyDef(); 
    Body body; 

    pShape.setAsBox(width/Game.C, height/Game.C); 
    bDef.position.set(x/Game.C, y/Game.C); 
    bDef.type = type; 
    fDef.shape = pShape; 
    fDef.density = 1.0f; 
    fDef.friction = 0.3f; 
    body = world.createBody(bDef); 
    body.createFixture(fDef); 
    body.setUserData(this); 
    body.setFixedRotation(false); 
    MassData md = new MassData(); 
    md.mass = 5; 
    body.setMassData(md); 
} 
} 
+0

몸에 질량이 있습니까? –

+0

나는 그들의 가치를 인쇄했고 그들은 1kg의 질량을 가지고있다. – ViliX64

+0

중력을 설정 했습니까? 시체의 회전도 잠글 수 있습니다. 아마도 그렇게했을까요? – noone

답변

4
MassData md = new MassData(); 
,

은 회전 관성이 제로가되지 않으므로 md.I == 0이므로 상자가 회전하지 않습니다. 당신이

MassData md = body.getMassData(); 

을 할 경우

당신은 당신의 전류 밀도에 따라 질량과 회전 관성이있을 것이다.

질량을 변경하고 올바른 회전 관성이 얻을 수있는 가장 좋은 방법 -처럼, 새로운 질량을 따라 스스로를 계산 : 당신이 바로 회전 지점을 저장하고 물리적으로 정확한 관성을해야 그런 식으로

float massScale = [newMass]/md.mass;  
md.mass *= massScale; 
md.I *= massScale; 

.

+0

그래, 작동하는 것 같지만 StackOverflow는 일정 기간 (1 시간) 후에 현상금을 줄 수있는 것만을 알 수 있습니다. 그래서 anwser 주셔서 감사하고 인내. – ViliX64

+3

바운티도 좋은 선물이 될 것이지만 나는 당신을 돕기 위해 대답했다. 현상금이 아니라. 행운을 빕니다! – McBodik