Уравнение гравитации - Уравнение скорости | Почему это хорошо только в определенных FPS?

Размер перехода с этими уравнениями уменьшается по мере уменьшения количества обновлений в секунду. С дельта-значением, умножающим силу тяжести и величину, на которую сила прыжка уменьшается, а также с добавлением прошедшего времени к дельте на каждой итерации (дельта-значение — это количество миллисекунд, прошедших с момента последнего обновления), можно подумать, что это будет работать нормально.

//d is delta
...
if(isFalling||isJumping){

        elapsedTime +=d;
//the elapsed time is the total amount of time passed since one started jumping,
//so that's logical to add the amount of time since last update.

        long tesquared = (long) Math.pow(elapsedTime, 2);
//amount of time elapsed squared.

        jumpSpeed+=-0.0000005*elapsedTime*d;
//this is the amount that jumpspeed is taken down by every time. 

        if(jumpSpeed > 0){
            isJumping = true;
        } else {
            isJumping = false;
        }
        double fGravity = 0.0000001*tesquared*d;

// this is the equation for gravity, the amount that the player goes down

        yRend += jumpSpeed - fGravity;
    //the amount it goes up, minus the amount it goes down.
        xRend -= strafeSpeed;
        oldyRend = yRend;

    }

Чтобы начать прыжок, нужно добавить jumpSpeed ​​на любую величину.

Проблема в том, что когда количество обновлений в секунду уменьшается, скачки уменьшаются по продолжительности и величине. Я почти уверен, что значения дельты здесь в порядке, а это значит, что проблема должна быть в самих уравнениях.

Я думаю, что fGravity опережает jumpSpeed быстрее, когда дельта больше.

Итак, мой вопрос. Если проблема действительно в самих уравнениях, как правильно смоделировать восходящую силу игрока за вычетом нисходящей силы гравитации, отличной от

jumpSpeed+=-0.0000005*elapsedTime*d;

а также

double fGravity = 0.0000001*tesquared*d;?

Если проблема заключается в неправильном применении дельта-значения, то как правильно его применить?


person GlassZee    schedule 17.11.2012    source источник
comment
Я не понимаю, как ты это сделал. вертикальная скорость обычно представляет собой начальную вертикальную скорость минус сила тяжести * время, прошедшее. Итак, как можно уменьшить jumpSpeed ​​каждый кадр на timeElasped * delta? Ваши уравнения кажутся мне очень неправильными.   -  person Cyrille Ka    schedule 18.11.2012
comment
Да, я, по сути, спрашиваю, каковы правильные уравнения. Будет ли fGravity применимо к описанному вами уравнению (поместив его туда, где gravity), или оно также ошибочно?   -  person GlassZee    schedule 18.11.2012


Ответы (2)


В основном уравнение прыжка выглядит так:

гравитация действует вертикально и создает постоянную силу вниз. Таким образом, вертикальная скорость равна vy = vy0 - elapsedTime * g, где g — гравитационная постоянная, а vy0 — начальная скорость в начале прыжка.

Вам не нужно вычислять прошедшее время. Просто в каждом кадре вы делаете это:

vy -= g * dt; // dt is the elapsed time since last frame

y += vy * dt;
x += vx * dt; // vx doesn't change in the jump
person Cyrille Ka    schedule 17.11.2012
comment
Я предположил, что опубликованный вами код включает вертикальную скорость, которую вы написали в абзаце выше. Вы уверены, что значение дельты используется только в строке vy -= g * dt? Выглядит хорошо, но скачок по-прежнему сильно прерывается при небольшом количестве обновлений. - person GlassZee; 18.11.2012
comment
Мне очень жаль, я сделал глупую ошибку при обновлении x и y, забыл умножить и на dt. Сейчас должно быть намного лучше. - person Cyrille Ka; 18.11.2012

У игроков нет «восходящей силы» (кроме той самой точки, в которой они прыгают). Силы сообщают импульс, создавая скорость. Оказавшись в воздухе, они ощущают нисходящую силу (т. е. гравитацию), которая заставляет их замедляться, в конечном итоге создавая отрицательную скорость, возвращающую их на землю.

Если игрок начинает прыгать вверх со скоростью u, то в момент времени t после начала этого прыжка классическое уравнение для расчета положения будет y = ut + 0.5 * at^2.

В этом случае a — это сила тяжести (отрицательная, если y находится «вверху»), что дает y = u * t - 0.5 * g * t ^ 2

person Alnitak    schedule 17.11.2012