| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование игр, графики и искусственного интеллекта > Алгоритм веревки (Физика) |
| Автор: Jeronimator 12.1.2006, 21:44 |
| Многоуважаемый All! Уже много времени бьюсь "Как же все-таки написать симулятор болтающейся на ветру веревки, примерно как в известной игре GISH, в которой очень все отлично реализовано и не только веревка. Только сделать это надо на простом языке программирования, типа Бэйсик или что либо похожее (без использования движков и встроенных типов =вектор=)". А идея заключается вот в чем: Есть игра типа симулятор летающего корабля в 2D вид сбоку. И вот хотелось бы, чтобы этой самой веревкой он мог зацепляться за что нибудь, или хотя бы просто чтобы она висела и тупо качалась на ветру, причем в зависимости от скорости корабля, она начинала болтаться в ту или иную сторону. Я надеюсь, что все правильно объяснил, а еще больше надеюсь на то, что вы мне поможите! Пишу эту прогу я на BlitzMax (Не надо смеяться - мне важен сам алгоритм этой веревки, так что это не зависит от Языка). Заранее благодарен! |
| Автор: mr.DUDA 13.1.2006, 13:40 |
| Верёвка - это набор сегментов, каждый из которых связан с двумя соседними (кроме крайних). Один из двух крайних сегментов закреплён, и поэтому передвигается только под воздействием точки опоры (на чём он там висит), а второй - полностью свободен. Весь алгоритм заключается в последовательной передаче движения от закреплённого крайнего сегмента к незакреплённому крайнему, и обратно, с затуханием. Форму и размер сегментов можно выбирать как угодно; например, в виде прямолинейных отрезков, или шариков (так проще). Остальное - из курса физики: скорость, ускорение, момент. |
| Автор: Jeronimator 13.1.2006, 19:11 |
| Ну елки-палки, Дуда! У нас здесь урок литературы что-ли? Я впринципе догадывался, что ответ будет примерно таким, но все же надежда умирает последней. Так вот что я хочу тебе сказать - не надо думать, что я еще не открывал учебник физики и не понял, что она должна состоять из сегментов и что на каждый сегмент должна действовать свое ускорение и скорость... Вопрос не в том, как это объяснить словами, а в том, как это написать в Бэйсике. Ты мне написал то, что впринципе я знал год назад и из чего все началось. Так вот я заходил на эху в Фиде и мне там точно так же ответили и сказали типа "Да ты ламер физику не знаешь...", а потом я им просто сказал - раз так все просто, напишите мне этот код и я признаюсь, что я ламер... так вот они НЕ НАПИСАЛИ. При мне ни разу не было написано такого кода, хотя впринципе все бонально и просто (Но все бональное и простое на листке бумаге не всегда такое же простое на деле). Я понимаю, что прошу наверное слишком много, но все же: "Плз, напишите мне формулу, по которой (как вы выразились, мистер Dude (Цитирую)) будет происходить последовательная передача движения от закрепленного крайнего сегмента к незакреплённому крайнему, и обратно, с затуханием". Как я понял - это всего пару строк... но они бесценны для меня, а для вас, по ходу дела просто до гениальности! Заранее спасибо! |
| Автор: Jeronimator 14.1.2006, 14:28 |
| Пасиб Так не хочется помечать вопрос как решенный, может кто еще предложит вариант, как сделать именно веревку и не расстягивающуюся? |
| Автор: mr.DUDA 14.1.2006, 15:18 | ||||||||
Ввести коэффициент затухания, что-то типа:
Или выразить его прямо в силе.
Нужно ограничивать перемещения "шариков" так, чтобы концы сегментов находились на одном и том же расстоянии. Например, после того как все координаты расчитаны, пробежаться по верёвке от начала до конца и "стянуть" шарики вместе:
|
| Автор: Jeronimator 14.1.2006, 16:51 |
| Что-то не получается у меня, начинают все беспорядочно двигаться. Я думаю без типа "вектор" здесь не обойтись, причем BlitzMаx это позволяет. Напишу сегодня код с этим типом и постараюсь это все проделать уже с ним. Потом напишу сюда результат, ну а ежели нет, значит я в конец ламер |
| Автор: mr.DUDA 14.1.2006, 20:10 | ||
Пардон, последняя моя формула совсем неверна. Вот правильный вариант:
|
| Автор: Jeronimator 14.1.2006, 21:31 |
| Скажи, ты проверял этот код на каком либо языке? Запускал его? Если да, то пожалуйста - вышли мне код По логике я совершенно по-другому решал эту задачу. Я пытался хотя бы сэмулировать векторное представление всего этого, т.е. я брал силу натяжения к прошлому сегменту и к следующему, а потом все это дело складывал по проекциям с помощью синусов и косинусов. Правда че-то тож ничего не получалось, но хотя бы болталась что-ли |
| Автор: mr.DUDA 14.1.2006, 21:45 | ||||
Нет, не пробовал и не запускал, и думаю, этот алгоритм нерабочий на 50%, т.к. в нём отражена только общая идея - как прикрутить физику к отрисовывающему движку.
Ну вот, значит ты мыслишь в нужном направлении |
| Автор: Jeronimator 14.1.2006, 21:49 |
| Могу ли я в этой теме попросить тебя дать хотя бы пару ссылок, где можно по этой теме разобраться. Может есть сайтик где люди и занимаются тем, что физику на комп переводят? Было бы очень как полезно, или это ОффТопик? |
| Автор: mvdr 14.1.2006, 22:05 | ||
Набери в поисковике "физический факультет" и сначинай исследовать просторы. |
| Автор: mr.DUDA 14.1.2006, 22:51 | ||
Есть очень крутой бесплатный open-source движок http://ode.org/, есть аналог - http://www.physicsengine.com/, есть http://www.tokamakphysics.com/. Во всех этих физических движках реализован API, позволяющий создать и управлять объектами типа "верёвка" и не только. |
| Автор: Jeronimator 14.1.2006, 23:16 |
| Я не знаю, что такое API и не освоил пока С++, так что сижу на BlitzMax, а перешел сюда с Паскаля и Бэйсика. Так что движок для меня тяжело |
| Автор: mr.DUDA 14.1.2006, 23:24 | ||
Дык он же платный, этот BlitzMax, или я не прав Можешь зайти http://www.devmaster.net/engines/ и выбрать любой бесплатный движок по вкусу, там есть как минимум http://www.devmaster.net/engines/list.php?fid=6&sid=6 на BASIC-языке. |
| Автор: Jeronimator 14.1.2006, 23:41 |
| Он у меня крякнутый, но наполовину, т.е. работать он мне дает, а вот обнавляться через инет не хочет А про движки я говорил... дело в том, что для меня важно не то, что это можно сделать и чтоб оно работало, а чтобы я понял, как это пишется на языке программирования. Вот в чем смысл! Пока не узнаю, дальше не пойду |
| Автор: $tatic 20.1.2006, 22:10 |
| Может быть, что для веревки и не надо делать никаких движков? Любая веревка / провод / т.д. прогибается под действием силы тяжести по закону гиперболического косинуса (y=cosh x). Надо только правильно рассчитывать функцию для конкретного момента времени. |
| Автор: mr.DUDA 21.1.2006, 12:34 | ||
Вот бы ещё конкретный пример... |
| Автор: Innuendo 25.1.2006, 18:33 |
| веревка это кусок граффика. подойди к училки математики (если ты с ней в ладах, и ты ещё в школе), и пораспрашивай. там короче на граффиках всё взаимосвязано... каждая переменная за что-то отвечает (за наклон, отступ от осей, угол разъежания и т.д и т.п). В твоём случае это может быть кусок параболлы, а может быть кусок гипперболы. Поэксперементируй, выясни какая именно часть больше подходит, какая формула граффика, и в зависимости от чего будет изменяться наклон и направления. ну и те значения уже будут изменяться взависимости от движения твоего корабля. |
| Автор: mr.DUDA 25.1.2006, 22:10 |