Страницы

понедельник, 24 декабря 2012 г.

Параметры объектов Nape Продолжение

      Продолжим изучать возможности физического движка Nape на основании предыдущего примера.
      Тела в Nape всегда вращаются вокруг их центра, независимо от того где их центр масс находится. Поэтому важно, чтобы у динамических тел был свой центр масс, который находится в их локальных координатах (0, 0).
      У объектов Тел есть методы перевода Фигур в локальную систему координат, и наоборот метод переноса центра масс в координаты источника. (напр. localPointToWorld и worldPointToLocal).
      Фигурам Тел можно назначить материал (Material), который определяет коэффициенты динамического, статического трения (friction) и трения качения, а также эластичность и плотность. Плотность (density) используется в вычислениях массы, момента инерции и центра масс Тела. Другие параметры в совокупности участвуют в вычислении при контактах Тел и других вычислениях.
      Статическое и динамические трение это некая сила, которая проявляется при взаимодействии двух материалов. Статическое трение происходит между двумя не двигающимися объектами. Оно выражается как сила, которая предотвращает скольжение одного объекта на другом. Например, есть у вас блок который лежит на наклонной поверхности. Сила которая не дает блоку скользить по этой поверхности и есть выражение статического трения.
      Динамическое трение происходит между двумя объектами, которые двигаются. Это сила, которая затрудняет толкание тяжелой коробки по полу. Другими словами, это сила, которая пытается вернуть двигающийся объект в состояние покоя.
      Еще как пример этих двух сил можно привести такой пример. Есть тяжелая коробка, которая лежит на какой то поверхности. Она находится в состоянии покоя и ее пытаются сдвинуть. Как раз в этот момент и действует статическая сила и обычно надо приложить больше сил (чем при динамическом трении), чтобы победить статическое трение и заставить коробку двигаться.
      А когда коробка начала двигаться теперь в работу вступает динамическое трение, которое пытается вернуть ее в состояние покоя. В этом случае надо прилагать гораздо меньше усилий, чтобы поддерживать объект в движущемся состоянии. Надо помнить, что статическое трение всегда выше динамического.

      В Nape материал Фигур Тел можно менять в любое время, даже для статических Тел. Для нескольких типов материалов, таких как сталь, лед, резина и др. есть предустановленные значения. Их параметры можно посмотреть в API Nape.
      Пример назначения материала:

// Устанавливаем индивидуальные значения
circleShape.material.elasticity = 1;
circleShape.material.density = 4;

// Устанавливаем материал - резина
circleShape.material = Material.rubber();

Рассмотрим подробнее конструктор материала:


Constructor

function new(elasticity:Float = 0.0, dynamicFriction:Float = 1.0, staticFriction:Float = 2.0, density:Float = 1.0, rollingFriction:Float = 0.001)
- Construct a new Material object.
parameters
elasticity :: The coeffecient of elasticity for material.
dynamicFriction :: The coeffecient of dynamic friction for material.
staticFriction :: The coeffecient of static friction for material.
density :: The density of the shape using this material in units of g/pixel/pixel.
rollingFriction :: The coeffecient of rolling friction for material used in circle friction computations.
returns
The constructed Material object.

      Первым параметром задаем коэффициент эластичности материала. Его можно задать любым значением, даже очень большим. Коэффициенты эластичности объединяются в среднее зафиксированное значение между [0, 1]. При 1 объекты не теряют свою энергию.
      Вторым параметром задаем коэффициент динамического трения материала. Задается от 0 до любого положительного значения, чем выше значение тем быстрее объект замедляется при скольжении.
      Третьим параметром задается коэффициент статического трения. Может иметь значение от 0 и выше. Чем выше значение тем быстрее объект остановится и тяжелее его будет сдвинуть.
      Четвертым параметром задается плотность, которая измеряется в граммах/пиксель в квадрате. Чем выше плотность, тем больше масса тела.
      Пятым параметром задается трение кручения. Может иметь значение от 0 и выше, чем выше значение, тем быстрее крутящийся объект остановится при касании.
   
      Рассмотрим пример взаимодействия объектов разных материалов:

Кручение резинового шарика по резиновой поверхности:

package
{ 
    import flash.display.Sprite;
    import flash.events.Event;
    import nape.phys.Material;
 
    import nape.geom.Vec2;
    import nape.phys.Body;
    import nape.phys.BodyType;
    import nape.shape.Circle;
    import nape.shape.Polygon;
    import nape.space.Space;
    import nape.util.BitmapDebug;
    import nape.util.Debug;
 
    public class Main extends Sprite
    {
        private var space:Space;
        private var debug:Debug;
 
        public function Main():void
        {
            super();
 
            if (stage != null) {
                initialise(null);
            }
            else {
                addEventListener(Event.ADDED_TO_STAGE, initialise);
            }
        }
 
        private function initialise(ev:Event):void
        {
            if (ev != null) {
                removeEventListener(Event.ADDED_TO_STAGE, initialise);
            }
 
            var gravity:Vec2 = Vec2.weak(0, 400);
            space = new Space(gravity);
 
            debug = new BitmapDebug(stage.stageWidth, stage.stageHeight,
                stage.color);
            addChild(debug.display);
 
            setUp();
 
            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            }
 
        private function setUp():void
        {
            var w:int = stage.stageWidth;
            var h:int = stage.stageHeight;
 
            // Пол
            var floor:Body = new Body(BodyType.STATIC);
            floor.shapes.add(new Polygon(Polygon.regular(320, 100, 6, 0, false),
                Material.rubber()));
            
            floor.position.setxy(300, 300);
            floor.space = space;
 
            // Создаем динамический крутящийся шар посредством Circle с радиусом 30px
            // Установим  шару угловую скорость 50, когда он соприкоснется с полом
            // покатится вперед
            var ball:Body = new Body(BodyType.DYNAMIC);
            ball.shapes.add(new Circle(30, null, Material.rubber()));
            ball.position.setxy(80, 200);
            ball.angularVel = 50;
            ball.space = space;
        }
 
        private function enterFrameHandler(ev:Event):void 
        {
            space.step(1 / stage.frameRate);
 
            debug.clear();
            debug.draw(space);
            debug.flush();
        }
    }
}

      Тут можно посмотреть как взаимодействует резина с резиной. Если заменить материал пола на лед:

floor.shapes.add(new Polygon(Polygon.regular(320, 100, 6, 0, false),
    Material.ice()));
      То взаимодействие уже такое.

Комментариев нет:

Отправить комментарий