Войти
ПрограммированиеФорумГрафика

Скорость масштабирования O_o

#0
16:37, 21 мар 2014

Если честно, я даже не совсем представляю как сформулировать вопрос, но постараюсь.

Я рисую нечто плоское, т.е. 2D. Не важно использую я GDI, OpenGL или DirectX.

Этот плоский объект я масштабирую, с постоянной скоростью. Пускай к примеру все это делается по формуле scale = 1.0f + maxScale * T; T лежит в пределах от 0 до 1.

Т.е. все линейно! Но визуально при T -> 1 скорость падает, только визуально! Я понимаю что это связано с восприятием.

Как сделать так что бы визуально, моя плоская фигура увеличивалась с одинаковой скоростью?

#1
17:02, 21 мар 2014

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

#2
17:21, 21 мар 2014

Да, я по этому пути и иду. Но что то не очень получается.


Крайнее условия:
  при Т = 0, scale = 1;
  при Т = 1, scale = 1 + maxScale;

#3
17:32, 21 мар 2014

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

#4
17:33, 21 мар 2014

В общем я посчитал, у меня этот someK = sqrt(maxScale - 1f)

и в итоге scale = 1f + (sqrt(maxScale - 1f) * T) ^ 2; (в моем простейшем случае maxScale = 2, в результате чего мы получаем scale = 1f + T ^ 2; но га экране совсем не то что нужно, в начале масштабирование просто стоит, и потом начинает разгонятся )

Я наверное не совсем корректно назвал переменную maxScale.

#5
17:38, 21 мар 2014

Давай примем что 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


зы. я сегодня не совсем выспался и вероятно туплю. но все делаю как ты пишешь.

#6
17:56, 21 мар 2014

Все, разобрался! Спасибо!

+ на - : scale = (1.0f + (sqrt(1.0f + MaxScale) - 1.0f) * T )^2

#7
20:13, 21 мар 2014

kalach
а, тьфу, ну да, я криво единицу перенес в попыхах

#8
15:57, 23 мар 2014

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

В любом случае твой подход работает :)

#9
19:33, 23 мар 2014

Надо брать экспоненту:

scale = exp(alpha * T) = (maxScale + 1)^T, alpha = ln(maxScale + 1)
#10
19:54, 23 мар 2014

У меня на + делается scale *= 1.3f, на - делается scale -= 1.3f, как-то так.

ПрограммированиеФорумГрафика

Тема в архиве.