Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] Как создать треугольник? (http://www.flasher.ru/forum/showthread.php?t=173532)

provigator 05.01.2012 13:57

Как создать треугольник?
 
Возникла необходимость создать треугольник. В примерах которые нашел создается либо прямоугольник либо круг. Знаю что надо описать координаты вершин, но примеров не нашел. Просьба скопировать весь код:
Код AS3:

от
bodyDef = new b2BodyDef()
до
body.SetMassFromShapes()

или ссылку на подробный пример
версия 2.0.2

GBee 05.01.2012 14:05

b2Polygon?

FieryWall 05.01.2012 14:08

point1,2,3 - вершины треугольника по типу b2Vec2.
Код AS3:

var polygon:b2PolygonShape = new b2PolygonShape();
var vec:Vector<b2Vec2> = new Vector<b2Vec2>;
vec[0] = point1;
vec[1] = point2;
vec[2] = point3;
polygon.SetAsVector(vec, vec.length);

далее по аналогии со всеми другими примерами.
Так же можно и различные многоугольники за несколькими критериями:
1.Не больше 8 вершин;
2.Точки должны быть выставлены по часовой стрелке;
3.Все углы должны быть выпуклые.

goodguy 05.01.2012 15:06

Цитата:

1.Не больше 8 вершин;
почему это?
Цитата:

2.Точки должны быть выставлены по часовой стрелке;
не имеет значения
Цитата:

3.Все углы должны быть выпуклые.
в треугольнике они по-любому все выпуклые

FieryWall 05.01.2012 15:39

1.В версии бокса 2.0.2 ограничение (по правде говоря не проверял но такое есть).
2.Наступал на эти грабли, в поисках решения проблемы где то прочитал не однократно что точки должны быть выставлены именно в таком порядке - в итоге все заработало. Вот вырезка с одного форума:
Цитата:

все-таки координаты задаются по часовой в "экранной" системе координат, т.к. ось y инвертирована, о чем написано в мануале, это также легко проверить посмотрев метод SetAsBox()
3.Логично, но в случаи других многоугольников все именно так :)

provigator 05.01.2012 18:32

в общем просмотрел уроки 2.0.2
получилась такая конструкция:
Код AS3:

var body:b2Body
var bd:b2BodyDef
bd = new b2BodyDef()
// ta1 - имя клипа
bd.position.Set(ta1.x/30, ta1.y/30)
var tr1:b2PolygonDef = new b2PolygonDef()
// количество вершин
tr1.vertexCount = 3
// координаты вершин
tr1.vertices[0] = -18/3016/30
tr1.vertices[1] =      0, -29/30
tr1.vertices[2]20/3016/30
tr1.density = 1.5        // плотность
tr1.friction = 0.5
tr1.restitution = 0.2
body = m_world.CreateBody(bd)
body.CreateShape(tr1)
body.SetMassFromShapes()

ошибки компиляции:
TypeError: Error #1006: value не является функцией.
at Box2D.Collision.Shapes::b2PolygonShape()
at Box2D.Collision.Shapes::b2Shape$/Create()
at Box2D.Dynamics::b2Body/CreateShape()

подскажите что делаю не правильно?

FieryWall 05.01.2012 18:46

возможно так:
Код AS3:

tr1.vertices[0] = new b2Vec2(-18/3016/30);
tr1.vertices[1] = new b2Vec2(0, -29/30);
tr1.vertices[2] = new b2Vec2(20/3016/30);

потому что так как у вас я вижу впервые

и точку с запятой после каждого рядка

provigator 05.01.2012 20:23

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

bodyDef=new b2BodyDef()
// t1 - имя клипа
bodyDef.position.Set(t1.x/30, t1.y/30)
var tr1:b2PolygonDef = new b2PolygonDef()
//количество вершин
tr1.vertexCount = 3
// координаты вершин
tr1.vertices[0] = new b2Vec2(-18/30, 16/30);
tr1.vertices[1] = new b2Vec2(0, -29/30);
tr1.vertices[2] = new b2Vec2(20/30, 16/30);
tr1.density = 0.5        // плотность
bodyDef.userData=t1
body = m_world.CreateBody(bodyDef)
body.CreateShape(tr1)
body.SetMassFromShapes()



Часовой пояс GMT +4, время: 16:02.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.