Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Canvas, реализация веревки (https://javascript.ru/forum/misc/44236-canvas-realizaciya-verevki.html)

Dorian_bs 12.01.2014 12:01

Canvas, реализация веревки
 
Всем привет!
Встала интересная задача - реализовать по средствам Canvas веревку.
Обошел весь гугл возможными запросами, но нашел только одну статью, в которой показывают уже готовый пример реализации на C++, без описания того, как это было сделано :(

Конечно есть вариант убить уйму времени "переводя" язык на js, но все же хотелось бы додуматься логике самому.

Как я понимаю в общих чертах, нужно построить массив координат точек векторов. Конечная координата одного вектора - есть началом другого. Каждый вектор имеет свой вес, и так же мы будем учитывать его индекс в массиве, что позволит определить вес, всех предыдущих координат относительно него.



Если есть какие то мысли по этому поводу, формулы и пр. - напишите:)

kobezzza 12.01.2014 12:06

Цитата:

Конечно есть вариант убить уйму времени "переводя" язык на js
https://github.com/kripken/emscripten/wiki

Цитата:

Using Emscripten, you can

Compile C and C++ code into JavaScript and run that on the web
Run code in languages like Python as well, by compiling CPython from C to JavaScript and interpreting code in that on the web

Dorian_bs 12.01.2014 12:08

Цитата:

Сообщение от kobezzza (Сообщение 291724)

Спасибо:)

Dorian_bs 12.01.2014 12:15

Нашел комментарий одного из пользователей =)) :

Цитата:

XProger:
Верёвки и прочую soft-body (если постараться то и rigid-body) физику можно писать используя интегрирование Верле.
Вся теория завязана на том, что скорость — разница между текущим и предыдущим её положением.
Применительно к задаче реализация сводится к следующему (псевдокод):
Есть набор точек (joints) связанных пружинками (links).
Задача каждой точки — двигаться согласно скорости.

joint.update
tempPos = pos // запоминаем текущую позицию во временную переменную
pos += pos - lastPos // прибавляем скорость
pos += gravity // и вектор гравитации
lastPos = tempPos

Задача каждой пружинки — поддерживать нужное расстояние между её joint'ами.

link.update
delta = joint[1].pos - joint[0].pos // вектор в сторону второй точки
length = sqrt(delta.x^2 + delta.y^2) // текущее расстояние между точками
delta /= length // нормализация вектора
delta *= length - LINK_LENGTH // LINK_LENGTH - расстояние которое следует поддерживать
delta *= FORCE // FORCE - коэффициент упругости пружинки (0..1)
// расталкиваем точки в противоположных направлениях
joint[0].pos += delta * 0.5
joint[1].pos -= delta * 0.5

Сама организация цикла обновления сводится к обновлению всех joint'ов, и нескольким иттерациям обновления всех link'ов (для стабилизации).
Таким незамысловатым способом можно создавать верёвки, рэгдоллы (ограничить углы между link'ами), волосы и даже некий аналог твёрдотельной физики. Реализация простая и никаких физических движков не требует.
Пример работы такой физики.

Dorian_bs 12.01.2014 16:07

Нашел решение:)))
http://habrahabr.ru/post/178135/
Всем удачи!;)


Часовой пояс GMT +3, время: 07:45.