Есть ли способ рассчитать линейную кривую AnimationCurve на основе ускорения AnimationCurve? - PullRequest
0 голосов
/ 14 мая 2019

Мне нужно сгенерировать клип Animation с помощью AnimationCurves, чтобы переместить объект в целевую позицию.Для этого я написал сценарий редактора, который генерирует анимационные клипы и настраивает все.

Теперь моя проблема: у меня есть кривая скорости, которая определяет КОГДА, КАК БЫСТРО, объект будет двигаться.(1 - TopSpeed, 0 - не движется) это выглядит так.https://i.imgur.com/44YDHrY.png

Что он генерирует https://i.imgur.com/kzsT8RL.png

Теперь я попробовал несколько способов создания кривой.где linearCurve - это кривая, предназначенная для интерполяции между начальной и конечной позициями, а speedCurve определяет кривую скорости, как упомянуто выше.

worldCurve - ожидаемый результат.

AnimationCurve linearCurve = AnimationCurve.Linear(0f, startZ, clipLength, destinationZ);
AnimationCurve speedCurve = distanceData.speedCurve;

AnimationCurve worldCurve = new AnimationCurve();
int sampleRate = 3;

float _scTime = 0f;
float _scValue = 0f;

for (int i = 0; i < speedCurve.length; i++) {
    //float scTime = (clipLength / sampleRate) * i;
    float scTime = speedCurve.keys[i].time;
    float scValue = speedCurve.keys[i].value;
    Debug.Log(String.Format("{0} hat {1}", scTime, scValue));
}

float lastZ = 0f;
for (int i = 0; i < speedCurve.length; i++) {
    //float scTime = (clipLength / sampleRate) * i;
    float scTime = speedCurve.keys[i].time;
    float scValue = speedCurve.keys[i].value;

    //Debug.Log(String.Format("{0} von {1}", scNow, scMax));

    //float sampleTime = /*linearCurve.length * */(_scTime + (Math.Abs(scTime - _scTime)));
    float calcZ = lastZ;
    float sampleTime = 0f;
    if (i > 0) {
        for (int j = 0; j < sampleRate; j++) {
            float tI = (float)((float)j / (float)sampleRate);
            float tTime = (scTime - _scTime) * tI;

            // speedCurve.keys.Last().time
            float sampleValue = linearCurve.Evaluate(scTime);

            sampleTime = clipLength * (i / speedCurve.length) + tTime;

            //float diffZ = linearCurve.Evaluate(scTime) - linearCurve.Evaluate(_scTime);

            //calcZ = lastZ + diffZ;
            Keyframe kf = new Keyframe(sampleTime, sampleValue);
            worldCurve.AddKey(kf);
        }
    }



    _scTime = sampleTime;// scTime;
    _scValue = scValue;
    lastZ = calcZ;
}

ac.SetCurve("World/Fake", typeof(Transform), "localPosition.z", worldCurve);

Он должен сгенерировать кривую так: https://i.imgur.com/pY8dm5g.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...