Если честно, я даже не совсем представляю как сформулировать вопрос, но постараюсь.
Я рисую нечто плоское, т.е. 2D. Не важно использую я GDI, OpenGL или DirectX.
Этот плоский объект я масштабирую, с постоянной скоростью. Пускай к примеру все это делается по формуле scale = 1.0f + maxScale * T; T лежит в пределах от 0 до 1.
Т.е. все линейно! Но визуально при T -> 1 скорость падает, только визуально! Я понимаю что это связано с восприятием.
Как сделать так что бы визуально, моя плоская фигура увеличивалась с одинаковой скоростью?
kalach
> Если честно, я даже не совсем представляю как сформулировать вопрос, но
> постараюсь.
> Я рисую нечто плоское, т.е. 2D. Не важно использую я GDI, OpenGL или DirectX.
> Этот плоский объект я масштабирую, с постоянной скоростью. Пускай к примеру все
> это делается по формуле scale = 1.0f + maxScale * T; T лежит в пределах от 0 до
> 1.
> Т.е. все линейно! Но визуально при T -> 1 скорость падает, только визуально! Я
> понимаю что это связано с восприятием.
> Как сделать так что бы визуально, моя плоская фигура увеличивалась с одинаковой
> скоростью?
Наверное нужно за основу брать площадь, а не линейный размер.
scale = (1.0f + someK * T)^2
Нужно найти someK, при T=1 это будет MaxScale = (1.0f + someK) ^2
(1.0f + someK) = sqrt(MaxScale)
someK = sqrt(MaxScale) - 1.0f
Итоговая формула:
scale = (1.0f + (sqrt(MaxScale) - 1.0f) * T )^2
Да, я по этому пути и иду. Но что то не очень получается.
Крайнее условия:
при Т = 0, scale = 1;
при Т = 1, scale = 1 + maxScale;
kalach
> Да, я по этому пути и иду. Но что то не очень получается.
А чему там получаться то? Ну ок:
1.0f + MaxScale = (1.0f + someK) ^2
1.0f + someK = sqrt(1.0f + MaxScale)
someK = sqrt(1.0f + MaxScale) + 1.0f
Итоговая формула:
scale = (1.0f + (sqrt(1.0f + MaxScale) + 1.0f) * T )^2
В общем я посчитал, у меня этот someK = sqrt(maxScale - 1f)
и в итоге scale = 1f + (sqrt(maxScale - 1f) * T) ^ 2; (в моем простейшем случае maxScale = 2, в результате чего мы получаем scale = 1f + T ^ 2; но га экране совсем не то что нужно, в начале масштабирование просто стоит, и потом начинает разгонятся )
Я наверное не совсем корректно назвал переменную maxScale.
Давай примем что MaxScale = 2
А наши крайние условия теперь
при Т = 0, scale = 1;
при Т = 1, scale = 3;
>> scale = (1.0f + (sqrt(1.0f + MaxScale) + 1.0f) * T )^2
не работает и scale улетает далеко за 3
Scale: 2.9955997 T:0.2674891
Scale: 3.0679848 T:0.27509755
Scale: 3.1463044 T:0.28322932
Scale: 3.2201717 T:0.29080662
Scale: 3.2953055 T:0.2984252
зы. я сегодня не совсем выспался и вероятно туплю. но все делаю как ты пишешь.
Все, разобрался! Спасибо!
+ на - : scale = (1.0f + (sqrt(1.0f + MaxScale) - 1.0f) * T )^2
kalach
а, тьфу, ну да, я криво единицу перенес в попыхах
В общем для простых фигур понятно как делать, а вот для многоугольников, да и вообще сложных фигур в принципе квадратичная зависимость подходит но не совсем. Или мне кажется.
В любом случае твой подход работает :)
Надо брать экспоненту:
scale = exp(alpha * T) = (maxScale + 1)^T, alpha = ln(maxScale + 1)
У меня на + делается scale *= 1.3f, на - делается scale -= 1.3f, как-то так.
Тема в архиве.