![]() |
|
Модераторы: Rickert |
![]()
|
|
| Jeronimator |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.1.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Многоуважаемый All!
Уже много времени бьюсь "Как же все-таки написать симулятор болтающейся на ветру веревки, примерно как в известной игре GISH, в которой очень все отлично реализовано и не только веревка. Только сделать это надо на простом языке программирования, типа Бэйсик или что либо похожее (без использования движков и встроенных типов =вектор=)". А идея заключается вот в чем: Есть игра типа симулятор летающего корабля в 2D вид сбоку. И вот хотелось бы, чтобы этой самой веревкой он мог зацепляться за что нибудь, или хотя бы просто чтобы она висела и тупо качалась на ветру, причем в зависимости от скорости корабля, она начинала болтаться в ту или иную сторону. Я надеюсь, что все правильно объяснил, а еще больше надеюсь на то, что вы мне поможите! Пишу эту прогу я на BlitzMax (Не надо смеяться - мне важен сам алгоритм этой веревки, так что это не зависит от Языка). Заранее благодарен! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Верёвка - это набор сегментов, каждый из которых связан с двумя соседними (кроме крайних). Один из двух крайних сегментов закреплён, и поэтому передвигается только под воздействием точки опоры (на чём он там висит), а второй - полностью свободен. Весь алгоритм заключается в последовательной передаче движения от закреплённого крайнего сегмента к незакреплённому крайнему, и обратно, с затуханием. Форму и размер сегментов можно выбирать как угодно; например, в виде прямолинейных отрезков, или шариков (так проще). Остальное - из курса физики: скорость, ускорение, момент.
-------------------- ![]() |
|||
|
||||
| Jeronimator |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.1.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Ну елки-палки, Дуда! У нас здесь урок литературы что-ли? Я впринципе догадывался, что ответ будет примерно таким, но все же надежда умирает последней. Так вот что я хочу тебе сказать - не надо думать, что я еще не открывал учебник физики и не понял, что она должна состоять из сегментов и что на каждый сегмент должна действовать свое ускорение и скорость...
Вопрос не в том, как это объяснить словами, а в том, как это написать в Бэйсике. Ты мне написал то, что впринципе я знал год назад и из чего все началось. Так вот я заходил на эху в Фиде и мне там точно так же ответили и сказали типа "Да ты ламер физику не знаешь...", а потом я им просто сказал - раз так все просто, напишите мне этот код и я признаюсь, что я ламер... так вот они НЕ НАПИСАЛИ. При мне ни разу не было написано такого кода, хотя впринципе все бонально и просто (Но все бональное и простое на листке бумаге не всегда такое же простое на деле). Я понимаю, что прошу наверное слишком много, но все же: "Плз, напишите мне формулу, по которой (как вы выразились, мистер Dude (Цитирую)) будет происходить последовательная передача движения от закрепленного крайнего сегмента к незакреплённому крайнему, и обратно, с затуханием". Как я понял - это всего пару строк... но они бесценны для меня, а для вас, по ходу дела просто до гениальности! Заранее спасибо! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Спокойней, Jeronimator, без наездов. Как был задан вопрос - так и был сформулирован ответ.
Гм... там на самом деле не совсем "пара строк", достаточно глянуть на физ. движок типа ODE... Попробуем так. Каждый сегмент отрисовывается отрезком прямой линии, у которой есть начало, конец и середина. Начало совпадает с концом пред. сегмента, конец - с началом след. сегмента. Середину будем считать центром массы сегмента и назовём "шариком". Если представить все сегменты в виде таких "шариков", то можно заменить верёвку на шарики, связанные между собой силой притяжения F. Чем дальше друг от друга соседние шарики, тем выше F. Приняв массу всех шариков равной, получим ускорение шарика "a", равное равнодействующей сил (Fnext + Fprev) умноженной на приращение времени "t", где Fprev - сила, действующая от предыдущего шарика, Fnext - сила от следующего шарика. Обе силы - векторные величины, т.е. грубо говоря вычисляются отдельно по X и по Y. Ускорение расчитывается как частное от силы и массы (величина массы подбирается при отладке программы). Получив ускорение "a" и зная приращение времени "t", получаем приращение скорости шарика: dv = a * t. Это приращение добавляем к тек. скорости шарика. Скорость и ускорение - также векторные величины, как и сила. Наконец, зная текущую скорость шарика, умножаем её на "t" и получаем приращение по x и по y, которое даст изменение положения шарика по осям. Вкратце всё это можно написать вот таким псевдокодом:
Для первого и последнего шарика всё расчитывается отдельно, т.к. для последнего шарика нету x[i+1] и y[i+1], а для первого шарика x и y определяются сразу, по изменению координат точки опоры. Чтобы шарики не сжались в одну точку, нужно приравнивать Fx и Fy нулю при каком-то пороговом значении (x[i-1] - x[i]) и (y[i-1] - y[i]). Кроме того, если верёвка не находится "в космосе", на каждый шарик действует постоянная сила притяжения "Fm = massa * ускорение_свободного_падения", которую нужно добавлять к Fx и Fy. -------------------- ![]() |
|||
|
||||
| Jeronimator |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.1.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Пасиб
Так не хочется помечать вопрос как решенный, может кто еще предложит вариант, как сделать именно веревку и не расстягивающуюся? |
|||
|
||||
| mr.DUDA |
|
||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Ввести коэффициент затухания, что-то типа:
Или выразить его прямо в силе.
Нужно ограничивать перемещения "шариков" так, чтобы концы сегментов находились на одном и том же расстоянии. Например, после того как все координаты расчитаны, пробежаться по верёвке от начала до конца и "стянуть" шарики вместе:
-------------------- ![]() |
||||||
|
|||||||
| Jeronimator |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.1.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Что-то не получается у меня, начинают все беспорядочно двигаться. Я думаю без типа "вектор" здесь не обойтись, причем BlitzMаx это позволяет. Напишу сегодня код с этим типом и постараюсь это все проделать уже с ним. Потом напишу сюда результат, ну а ежели нет, значит я в конец ламер
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Пардон, последняя моя формула совсем неверна. Вот правильный вариант:
-------------------- ![]() |
|||
|
||||
| Jeronimator |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.1.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Скажи, ты проверял этот код на каком либо языке? Запускал его? Если да, то пожалуйста - вышли мне код
По логике я совершенно по-другому решал эту задачу. Я пытался хотя бы сэмулировать векторное представление всего этого, т.е. я брал силу натяжения к прошлому сегменту и к следующему, а потом все это дело складывал по проекциям с помощью синусов и косинусов. Правда че-то тож ничего не получалось, но хотя бы болталась что-ли |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Нет, не пробовал и не запускал, и думаю, этот алгоритм нерабочий на 50%, т.к. в нём отражена только общая идея - как прикрутить физику к отрисовывающему движку. Ну вот, значит ты мыслишь в нужном направлении -------------------- ![]() |
|||
|
||||
| Jeronimator |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.1.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Могу ли я в этой теме попросить тебя дать хотя бы пару ссылок, где можно по этой теме разобраться. Может есть сайтик где люди и занимаются тем, что физику на комп переводят? Было бы очень как полезно, или это ОффТопик?
|
|||
|
||||
| mvdr |
|
|||
|
физик ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1349 Регистрация: 31.12.2004 Где: Волгоград, Россия Репутация: нет Всего: 42 |
Набери в поисковике "физический факультет" и сначинай исследовать просторы. -------------------- Появляюсь редко, но часто метко Изображать идиота сложнее, чем изображать умного: полезнее и не каждому дано |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Есть очень крутой бесплатный open-source движок ODE, есть аналог - Newton engine, есть Tokamak. Во всех этих физических движках реализован API, позволяющий создать и управлять объектами типа "верёвка" и не только. -------------------- ![]() |
|||
|
||||
| Jeronimator |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.1.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Я не знаю, что такое API и не освоил пока С++, так что сижу на BlitzMax, а перешел сюда с Паскаля и Бэйсика. Так что движок для меня тяжело
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Дык он же платный, этот BlitzMax, или я не прав Можешь зайти сюда и выбрать любой бесплатный движок по вкусу, там есть как минимум 10 движков на BASIC-языке. -------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |