2015-02-26 2 views
1

В настоящее время я пытаюсь имитировать баллистику на объекте, который в противном случае не влияет на физику. Если быть точным, у меня есть ракетно-подобный снаряд, который следует за параболической дугой от источника к цели с помощью Lerp. Чтобы сделать его более реалистичным, я хочу, чтобы он не двигался с постоянной скоростью, но чтобы замедлить кульминацию и ускориться на своем пути назад.Перевернутый Smoothstep?

Я использовал функцию Mathf.Smoothstep, чтобы выполнить точную противоположность тому, что мне нужно на других объектах, то есть ослабление и выключение движения.

Так что мой вопрос: как мне получить перевернутый Smoothstep?

Я выяснил, что мне нужно будет на самом деле инвертированной формулой smoothstep [x * x * (3 - 2 * x)], но, будучи не совсем математическим гением, я понятия не имею, как это сделать , Все, что я получил от онлайн-калькуляторов, было довольно массивной новой функцией, которая, я боюсь, не была бы очень эффективной.

Возможно, есть функция, которая приближается к перевернутому плавному шагу, но не так сложна для вычисления.

Любая помощь на этом была бы оценена

Спасибо заранее,

Tux

ответ

0

Вы, кажется, хотите регулярный параболу. Смотрите график этой функции:

http://www.wolframalpha.com/input/?i=-%28x%2A2-1%29%5E2%2B1

Какой график, который, кажется, что вы хотите: - (х * 2-1)^2 + 1

Это идет от у = 0 к y = 1, а затем снова назад между x = 0 и x = 1, оставаясь немного в верхней части вокруг x = 0,5. Это то, что вы хотите, если я правильно понял.

Другие способов записать эту функцию, в соответствии с Wolfram Alpha, будет - (4 * (х-1) * х) и (4-4 * х) * х

Надеются, что это помогает.

+0

Во-первых, спасибо за ваш ответ. Но, поскольку я использую lerp-подобную функцию для измерения точки, на которой объект находится на своем пути от начала (0) до пункта назначения (1), мне нужна функция, которая начинается с 0 | 0 и заканчивается на 1 | 1, как и Smoothstep. Но вместо того, чтобы ослабляться тогда, мне нужно ослабить и снова войти, что является плавной функцией, отраженной на диагонали 45 °, ака-инвест. Вот что Wolfram Alpha дает в качестве перевернутой функции Smoothstep: http://www.wolframalpha.com/input/?i=the%20inverse%20function%20of%20x%20*%20x*(3%20-% 202 * x)% 20is Но мне нужна упрощенная форма этого – Tuxedomask

+0

@Tuxedomask обратная функция, которую вы только что отправили, не начинается с 0 | 0 и заканчивается на 1 | 1. – jbernardo

+0

@Tuxedomask. Можете ли вы послать мне график функции, которая делает то, что вы говорите? – jbernardo

1

Если вы перемещаете трансформации, часто полезно пользователю iTween или аналогичные библиотеки анимации вместо того, чтобы самостоятельно управлять анимацией. У них есть простой API, и вы также можете установить easing mode.

Но если вам это нужно, как функция математики, вы можете использовать что-то вроде этого:

y = 0.5 + (x > 0.5 ? 1 : -1) * Mathf.Pow(Mathf.Abs(2x - 1),p)/2 

Где р мера крутизны, что вы хотите. Вот как это выглядит:

graph

1

У меня была аналогичная проблема.Для меня, зеркальное отображение кривой в у = х работал:

enter image description here

Так пример реализации будет:

float Smooth(float x) { 
    return x + (x - (x * x * (3.0f - 2.0f * x))); 
} 

Эта функция не имеет зажим, так что, возможно, должны быть добавлены, если х может выйти за пределы от 0 до 1 интервала.

Wolfram Alpha example