Hier sind einige Formeln, die häufig beim Erstellen von Animationen verwendet werden. Oder besser gesagt, es ist ein Memo. Es ist ein unvermeidlicher Ort, wenn Sie über andere interaktive Ausdrücke als das Spiel nachdenken.
Wenn Sie es in Swift implementieren, können Sie es mithilfe der zuvor veröffentlichten Formel Implementieren von EnterFrameBeacon in Swift animieren.
Kraft = Masse x Beschleunigung $ F = ma $
Beschleunigung = Masse / Kraft $ \displaystyle a = \frac{F}{m} $
Die Beschleunigung ist auch die Änderungsrate des Zeitablaufs.
$ \displaystyle a = \frac{dv}{dt} $
Mit anderen Worten, dies gilt auch.
$ \displaystyle \frac{dv}{dt} = a = \frac{F}{m} $
In ähnlicher Weise ist Geschwindigkeit die Änderungsrate der Position über die Zeit.
$ \displaystyle v = \frac{dx}{dv} $
Die aktuelle Zeit ist $ t $ $ Dt $ (Deltazeit) für die Zeitänderung des Schreibschrittgefühls
var t: Float = 0.0
let dt: Float = 1.0
var velocity: Float = 0.0
var position: Float = 0.0
let force: Float = 10.0
let mass: Float = 1.0
position = position + velocity * dt
velocity = velocity + (force / mass ) * dt
t = t + dt
Grundformel $ s = ut + 0.5at^2 $
struct State {
float x;
float v;
};
struct Derivative {
float dx; // dx/dt = velocity
float dv; // dv/dt = acceleration
};
/**
*/
float acceleration(const State &state, float t){
const float k = 10;
const float b = 1;
return -k * state.x - b * state.v;
}
/**
*/
Derivative evaluate(const State &initial, float t, float dt, const Derivative &d){
State state;
state.x = initial.x + d.dx * dt;
state.v = initial.v + d.dv * dt;
Derivative output;
output.dx = state.x;
output.dv = acceleration(state, t+dt);
return output;
}
/**
*/
void integrate(State &state, float t, float dt){
Derivative a, b, c, d;
a = evaluate(state, t, dt, Derivative());
b = evaluate(state, t, dt*0.5f, a);
c = evaluate(state, t, dt*0.5f, b);
d = evaluate(state, t, dt, c);
float dxdt = 1.0f / 6.0f * (a.dx + 2.0f*(b.dx + c.dx) + d.dx);
float dvdt = 1.0f / 6.0f * (a.dv + 2.0f*(b.dv + c.dv) + d.dv);
state.x = state.x + dxdt * dt;
state.v = state.v + dvdt * dt;
}