在libgdx中创建一个圆形轨道

时间:2017-05-04 14:21:39

标签: java libgdx gravity orbit

我正在尝试在游戏中实现Gravity。 我目前有一个应该围绕行星运行的月球(在我的游戏中都使用了Cell类)。

使用(缩短)以下代码:

在课程单元格中:

private Cell graviator;
private Vector2 pos;
private Vector2 vel;
private Vector2 drg;
private int mass;
private float drgSpeed;
private GravityField grav=new GravityField(this);

public void move(){
    calculateDrag();
    if(orbiting){
        orbit();
    }
    pos.add(vel);
    pos.add(drg);
}

private void calculateDrag() {
    drg.scl(drgSpeed);
}

private void orbit(){
    Vector2 temp=new Vector2(drg.x,drg.y);
    temp.rotate90(0);
    temp.nor();
    speed=(float)Math.sqrt((mass+graviator.getMass())/getGraviatorDistance()); // v= sqrt((M*m)/r)
    temp.scl(speed);
    vel=temp;
}

GravityField课程:

private Cell cell;

public void computeGravity(Cell cell2) {
    float force = getForce(cell2);
    if (cell != cell2.getGraviator()) {
        if (cell2.getMass() < cell.getMass()) {
            if (force > cell2.getLargestForce()) {
                cell2.setGraviator(cell);
                cell2.setLargestForce(force);
                cell2.setDrg(getDragVector(cell2));
                cell2.setDrgAcc(getAcceleration(cell2));
            }
        }
    } else {
        cell2.setLargestForce(force);
        cell2.setDrg(getDragVector(cell2));
        cell2.setDrgAcc(getAcceleration(cell2));
    }
}

public Vector2 getDragVector(Cell cell2) {
    Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
    temp.nor();
    return temp;
}

public Vector2 getDirection(Cell cell2) {
    return new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
}

public float getDistance(Vector2 direction) {
    return direction.len();
}

public float getForce(Cell cell2) {
    Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
    return cell.getMass() * cell2.getMass() / (temp.len() * temp.len()); //f = M*m/r^2
}

public float getAcceleration(Cell cell2) {
    Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
    float force = cell.getMass() * cell2.getMass() / (temp.len() * temp.len());
    float acceleration = force / cell2.getMass(); // a= f/m
    return acceleration;
}

因此,使用我的GravityField,我基本上将一个dragVector应用于拉出的Cell。

在Cell中,使用

将细胞移向graviator
 pos.add(drg);

并朝着自己的moveVector vel

pos.add(vel);

在我的orbit()方法中,我试图找到并设置vel来制作一个圆形轨道。

我的问题是我不知何故无法完成一个完美的轨道。月亮仍然是微微的,缩小的距离逐渐加速到地球。

我无法弄清楚它为什么不起作用。我使用正确的公式吗?

写完我用过:

我的OrbitVector速度

v= sqrt((M*m)/r) f = M*m/r^2对于朝向地球的力量。a= f/m <select> <option value="volvo">Volvo (30.000)</option> <option value="saab">Saab (40.000)</option> <option value="opel">Opel (15.000)</option> <option value="audi">Audi (45.000)</option> </select> <select> <option value="dog">Dog (300)</option> <option value="cat">Cat (50)</option> <option value="fish">Fish (5)</option> </select>向地球加速

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这很简单。你需要2个纹理,你的轨道和月亮。你要做的就是让月球在轨道上旋转。

如果您正在使用精灵,您可以这样做:

sprite.setRotation(rotationVaue);
rotationValue+=1;

但这里要注意的一件非常重要的事情是图像应该具有相同的分辨率。

我最近做了同样的事情,我甚至在stackoverflow上问了一个关于它的问题,这里是链接:

Collision detection for an arc of a circle