![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2009
Сообщений: 42
|
доброго времени суток
кто хорошо знает Box2d - помогите, пожалуйсто. есть маятник: [IMG]http://img223.**************/img223/1923/22861726.jpg[/IMG] как его добавить на сцену и физический мир в таком виде - я представляю (один боди для груза, джоинт...) но как его повернуть на заданный угл? весь маятник, относительно крепежа, например так: [IMG]http://img223.**************/img223/1040/43299816.jpg[/IMG] ещё вопрос нить - джоинт является рисованным элементом как обновлять её положение(на экране)? создавать для неё body? спасиб за внимание, буду благодарен любым ответам по теме) Последний раз редактировалось wvxvw; 06.07.2010 в 20:47. |
|
|||||
|
Регистрация: Nov 2008
Сообщений: 88
|
Цитата:
При создании b2DistanceJoint вам нужно задать 2 тела и 2 точки, так: distanceJointDef.Initialize(body1,body2,point1,point2); joint=m_world.CreateJoint(distanceJointDef); Никаких проблем с поворотом маятника здесь нет, т.к. мы просто задаем 2 этих тела и 2 точки в глобальных координатах мира. Если ваш вопрос заключается в том чтобы создать b2DistanceJoint из спрайта (линии на экране), что намного удобнее чем вбивать координаты руками, то вот как у меня это получилось: var distanceJointDef:b2DistanceJointDef=new b2DistanceJointDef(); var length:Number=_length; var point1:b2Vec2=new b2Vec2(clip.x/m_physScale, clip.y/m_physScale); var point2:b2Vec2=new b2Vec2((clip.x+length*Math.cos(clip.rotation*Math.PI/180))/m_physScale, (clip.y+length*Math.sin(clip.rotation*Math.PI/180))/m_physScale); var body1:b2Body=GetBodyAtPoint(point1.x,point1.y); var body2:b2Body=GetBodyAtPoint(point2.x,point2.y); if(body1==null) body1=m_ground; if(body2==null) body2=m_ground; distanceJointDef.Initialize(body1,body2,point1,point2); joint=m_world.CreateJoint(distanceJointDef); Здесь приходится идти на такую уловку - рисовать shape линии горизонтально, далее преобразуем её в символ clip и только потом поворачиваем в нужную позицию. Иным способом поворот линии у меня по крайней мере получить не удалось. Хотя можно использовать и более простой способ - рисовать линию всегда под "\" наклоном и использовать width и height спрайта: var point1:b2Vec2=new b2Vec2(clip.x/m_physScale, clip.y/m_physScale); var point2:b2Vec2=new b2Vec2((clip.x+clip.width)/m_physScale, (clip.y+clip.height)/m_physScale); Цитата:
В доступном вместе с библиотекой Box2D примере TestBed в файле Test.as в закомментированном виде есть готовая функция DrawJoint. Её надо вызывать в Update следующим образом (в том же примере это также есть в комментариях): |
|
|||||
|
Регистрация: Jun 2009
Сообщений: 42
|
maklaus, спасибо, хоть уже до этого сам додумался
единственное - я забыл Math.PI/180 в углах) пишу игру... выходит не всё так просто для сложных объектов придётся выводить формулы - где что находится - не координаты же вбивать) к тому же формулы основанные на углах, ведь в редакторе уровней мы можем повернуть этот сложный объект... мда |
|
|||||
|
"выходит не всё так просто" мировая фраза.
|
|
|||||
|
Регистрация: Nov 2008
Сообщений: 88
|
Если под сложными объектами вы имеете ввиду неправильные многоугольники то рекомендую вам Box2d Flash World Construction Kit. После установки у вас в меню Commands появится команда Polygon Decomposition - Get Points. А дальше все просто - выделяете многоугольник (Shape) любой сложности, нажимаете Get Points и в Output вываливается массив координат (например [[[313.05, -53], [313.05, -41], [-301.95, -47], [-301.95, -54]], [[-301.95, -47], [313.05, -41], [182.55, -40.5], [-306.95, -47]], [[-306.95, 53], [-306.95, -47], [-91.95, 3], [-91.5, 53.5]], [[-91.95, 3], [-306.95, -47], [-71.95, -17]], [[-71.95, -17], [-306.95, -47], [182.55, -40.5], [58.05, -17]], [[78.05, 29], [78.05, 3], [117.05, 29]], [[78.05, 3], [58.05, -17], [182.55, -40.5], [117.05, 29]]]). Где массив самого высокого уровня (неправильный многоугольник) содержит массивы (правильные многоугольники), которые в свою очередь содержат массивы точек. А далее спокойно используете его в своих корыстных целях. =)
|
|
|||||
|
Регистрация: Jun 2009
Сообщений: 42
|
maklaus
благодарю есть ещё один вопрос как вращать груз относительно крепежа с желаймой скоростью? |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
оффтоп: как ужасно выглядит код b2!
__________________
Отряд Котовскага |
|
|||||
|
Регистрация: Jun 2009
Сообщений: 42
|
думаю мою задачу можно решить хитрее
крепёж можно заменить прямоугольником и к краю прямоугольника крепить дистанс джоинт а револют джоинт между землёй и крепежём - вращать как здесь http://www.emanueleferonato.com/2009...ints/#more-955 такой вариант мне не нравится Последний раз редактировалось bugizavr; 20.06.2009 в 01:50. |
|
|||||
|
Регистрация: Jul 2009
Сообщений: 14
|
Сделал маятник c distanceJoint. Тело, к которому крепится маятник, я перемещаю с помощью мыщи. Но при перемещении все начинает дергаться, и только когда прекращаешь водить мышкой. Тогда все вроде начинает приходить в норму. А мне нужно с помощью мышки раскручивать маятник. Подскажите, пожалуйста, в чем моя проблема?
|
|
|||||
|
Регистрация: Jul 2009
Сообщений: 14
|
Вроде исправил, но раскрутить маятник мышкой не удается. Изменяю частоту, тогда он начинает раскручиваться, но не реалистично. Скажите, быть может DistаnсеJоint не подходит для этой цели?
|
![]() |
![]() |
Часовой пояс GMT +4, время: 14:54. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|