Йе-х-у! Всем привет!
Открыл репозиторий под демонстрационные программы с 2д-физикой от Box2d. В итоге, я надеюсь, в них любой желающий найдет для себя интересные физичные механизмы, сможет изучить код моей связки GlScene + Box2d, а также посмотреть на развитие демок как таковых. Open source, в общем :)
Почему вдруг решил обернуть маленькие демки в целый svn? Все началось с того, что я вносил небольшие изменения в проекты "Vehicles" (TestCar-1, TestCar-2), а также начал делать третью демку. В общем, пока я ковырялся с этим, чуточку здесь подправил, чуточку там - ну знаете, как это бывает. В итоге решил все-таки обзавестись репозиторием под эти демки, так должно быть проще. Хотя, думаю, исходники особо смотреть все-равно никто не будет. Но это и не важно, мне самому проще программировать, когда можно быстро посмотреть свои изменения; можно не бояться удалять блоки кода - все равно они сохранятся в репозитории и можно в любой момент откатиться до нужной версии.
Что нового.
1. Обновил b2Physics.dll, туда добавились новые функции:
b2_World_RaycastOne(),
b2_Body_GetLinearVelocityFromWorldPoint(),
b2_Body_GetLinearVelocityFromLocalPoint(),
b2_Body_SetLinearDamping(),
b2_Body_GetLinearDamping()
названия стараюсь делать "говорящие" во избежание различных разночтений.
2. Добавил заливку debug-объектов, чтобы было более ясно, где и какие объекты располагаются. Выглядит это так:
3. Появилось событие TBox2d_DebugRenderer.OnAfterCanvasDraw, описание у него такое:
property OnAfterCanvasDraw: TOnCanvasDrawEvent
TOnCanvasDrawEvent = Procedure (aGlCanvas: TExtGlCanvas)of object;
где TExtGlCanvas - это класс (сейчас находится в uBox2dGLDebug.pas), наследованный от TGLCanvas, в котором реализована заливка debug-объектов.
4. Добавил 3ью демку, хотел сделать существо, с четырьмя лапами, как у vap'а:
но у меня пока получается ужасно, понял, что я не дорос до таких физических выкрутасов и немного отложил создание передвижения такого существа до "лучших времен", когда в голове будет ясность, как такие процедурные анимации делаются в принципе (если у Вас есть идеи, статьи или еще какая-либо информация по этому поводу - делитесь, я всегда рад!)
5. При моделировании жука из 3ей демки появилась необходимость в !!!raycast'е!!! от кончика лапки вниз, к поверхности, по которой он движется. С ужасом обнаружил, что способа пустить луч из одной точки в другую я пока не внес в dll. Оперативно исправил этот недочет, выгрузив пока только RaycastOne() - то есть нахождение ближайшего объекта. Для проверки верности расчетов в короткие сроки завел Демо-4 для демонстрации луча и наглядной проверки происходящего. Выглядит это так:
Как скачать все исходники.
Для начала установите любой svn-клиент. Советую для начала обзавестись черепахой. Удобна, встраивается в explorer, ведет себя адекватно, выполняет все необходимые в работе вещи.
После установки, выберите папку, куда хотите загрузить исходники, нажмите правой кнопкой мыши, найдите подпункт Svn Checkout, вбейте путь
и, если все пройдет успешно, то можно радоваться - после этой операции выгрузятся актуальные исходные коды, а также с этой папкой будет ассоциирован репозиторий на code.google. В дальнейшем, для обновления исходников, будет достаточно выбирать пункт Svn Update.
Сейчас 9ть ревизий, о новых дополнениях и коммитах буду сообщать по мере их появления...
Вот и все, собственно. Вроде основное написал, ничего не забыл.
Очень интересно, как реализовывал RayCast ? У тебя на скрине красной линией выведен сам луч, но я не понимаю как задать его с помощью формулы. Недавно встретился с проблемой вычисления расстояние до объекта, а не к точке и очень заинтересовался этим вопросом. каков принцип ?
ОтветитьУдалитьAero, здесь RayCast от Box2d идет, я только портирую из/в dll...
ОтветитьУдалить"проблема", видимо, возникла в связи с геометрическими задачами от timus?!))
конкретно по поводу RayCast'инга - обычно делается так: перебираются все отрезки многоугольников, ищутся пересечения с заданным лучом (сам луч задается двумя точками и дополнительным условием) со всеми отрезками-сторонами многоугольников, из этих всех пересечений и выбирается ближайшая точка...
то есть для RayCast'инга достаточно уметь пересекать луч с отрезком!
вообще, слова для поиска на эту тему - "компьютерная геометрия"... например, вот тут адекватно написано:
http://compgraph.ad.cctpu.edu.ru/Geometry_2D.htm
но там много общего, я бы посоветовал использовать параметрические задания геометрических фигур (особенно отрезков, лучей и прямых), тогда все становится предельно ясно!
помню, была прикольная книга с осликом на обложке, но она здоровая, там по всем сразу разделам информация, и стоила она слишком дорого для меня, поэтому я мог ознакомиться с ней только при пролистывании в книжном магазине... если найду в интернете - кину ссылку, там вроде про геометрию тоже много полезного!
а вообще, достаточно в гугле набить "пересечение луча и отрезка" и первая ссылка уже будет содержать ответ)) только что проверил!
также когда-то давно я решил выпендриться в конкурсе на igdc, чтобы не прикомпиливать лишнюю dll, и всю "физику" сделал руками, там есть и пересечение отрезков, и всякие перепндикуляры и "выталкивание" одного прямоугольника из другого...
http://igdc.ru/viewpage.php?page_id=62
можешь исходники глянуть, вроде uCollision модуль назывался))
уф... вот как-то так!