Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Спрайт неправильно вращается при малой угловой скорости (http://www.flasher.ru/forum/showthread.php?t=211350)

Bazel 10.08.2015 18:12

Спрайт неправильно вращается при малой угловой скорости
 
Вложений: 1
Добрый день, проблема такая.

Есть квадрат, мы вращаем его с малой скоростью, и спрайт съезжает с центра. Прилагаю swf там наглядно видно.
Проблемы когда скорость средняя или большая нет, но мне нужно чтобы он мог вращаться медленно и при это центр масс этого спрайта четко лежал там где нужно. Заранее спасибо!

П.С. Когда запустите, дайте ему покрутится минуту и увидите, что он уехал от координаты своего центра, опять же при больших скоростях такого нет. Не знаю что делать.

rectangle.swf   (15.4 Кб)

Tails 10.08.2015 18:29

Покажите как крутите, где-то ошибка накапливается.

Bazel 10.08.2015 18:43

Код AS3:

public function rotateAroundCenter(object:DisplayObject, t:Number):void // вращаем спрайт но не апдейтим вершины
{
 
 
    var matrix:Matrix = object.transform.matrix;
        //trace(matrix.tx, matrix.ty) ;
    var rect:Rectangle = object.getBounds(object.parent);
 
 
        var Znak : Number = 1 ;
        (t == 0 ) ? Znak=1 : Znak = Math.abs(t) / t ;
 
        W_t = Math.abs(t) * AngVel + ((Ftorq/Mass)/2) * t * t * Znak ;
        trace("W_t=",W_t) ;
 
 
    matrix.translate(-XX, -YY);
    matrix.rotate((W_t * Znak / 180.0) * Math.PI)
 
        trace("XX,YY",(rect.left + (rect.width / 2)), (rect.top + (rect.height / 2)));
        trace("true XX, YY=",XX,YY) ;
 
        matrix.translate(XX, YY);
 
 
 
    object.transform.matrix = matrix;
 
 
}

что заметил со временем, почему-то центр самого спрайта съезжает, это показывают сами логи, хотя сам центр масс неподвижен, координаты XX и YY константы

со временем получается такая ситуация :
XX,YY 295.5 291.425 // координата центра спрайта, считается как (rect.left + (rect.width / 2)), (rect.top + (rect.height / 2)))
true XX, YY= 300 300 //а это наш центр массы которые никто не трогает на протяжении всего движения
timer.currentCount= 253

Добавлено через 2 минуты
стоит добавить что вначале центр масс квадрата и спрайта совпадают, но со временем почему-то разъезжаются, угловая скорость(переменная AngVel) имеет значение 0.1

Tails 10.08.2015 18:48

Рассчитывать поворот нужно каждый раз из начальных параметров.
Вот тут тема освещена: http://www.flasher.ru/forum/showthread.php?t=175235

Bazel 10.08.2015 21:02

Вложений: 1
Спасибо! сейчас попробую

попробовал, спрайт почему-то начинает уменьшаться.. как бы код осознал, не понимаю..



Код AS1/AS2:

 public function pointRotate(object:DisplayObject, center:Point, angle:Number) : void
    {
        /* * * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
\* * * * * * * * * */

 
        // return to zero
        angle += object.rotation;
        var a0:Number = - object.rotation * Math.PI / 180;
        var s0:Number = Math.sin(a0);
        var c0:Number = Math.cos(a0);
        var dX0:Number = object.x - center.x;
        var dY0:Number = object.y - center.y;
 
        object.rotation = 0;
        object.x = Math.round(center.x + dX0 * c0 - dY0 * s0);
        object.y = Math.round(center.y + dX0 * s0 + dY0 * c0);
 
        // new rotation
        var r:Number = angle * Math.PI / 180;
        var s:Number = Math.sin(r);
        var c:Number = Math.cos(r);
        var dX:Number = object.x - center.x;
        var dY:Number = object.y - center.y;
 
        object.rotation += angle;
        object.x = center.x + dX * c - dY * s;
        object.y = center.y + dX * s + dY * c;
    }

код действительно работает, причина по которой уменьшается лежит в том что сначала вызывается функция перемещения объекта, а потом поворота.

Добавлено через 33 секунды
почему, сейчас буду выяснять..

Добавлено через 50 минут
а как перемещать при малых скоростях не подскажите? все работает при скорости по оси X большей пикселя
за 1/60 секунды но при малой скорости все криво, спрайт куда-то уходит не в ту сторону( по оси Y)

MAPUTO 11.08.2015 14:36

Попробуйте вставить вот такую строчку в Ваш исходный код:
Код AS3:

trace("left-top-height-width ", rect.left, rect.top, rect.height, rect.width);

И посмотрите меняются ли у Вас значения height и width

Дело в том что у Вас не написано в каком месте и сколько раз Вы вычисляете координаты XX и YY, но
вот тут:
Код AS3:

matrix.translate(-XX, -YY);

и вот тут:
Код AS3:

matrix.translate(XX, YY);

параметры XX и YY должны быть разные

Bazel 11.08.2015 15:39

поворачиваю теперь так
Код AS1/AS2:

public function pointRotate(object:DisplayObject, center:Point, angle:Number) : void
    {
        /* * * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
\* * * * * * * * * */

 
        // return to zero
        angle += object.rotation;
        var a0:Number = - object.rotation * Math.PI / 180;
        var s0:Number = Math.sin(a0);
        var c0:Number = Math.cos(a0);
        var dX0:Number = object.x - center.x;
        var dY0:Number = object.y - center.y;
 
        object.rotation = 0;
        object.x = Math.round(center.x + dX0 * c0 - dY0 * s0);
        object.y = Math.round(center.y + dX0 * s0 + dY0 * c0);
 
        // new rotation
        var r:Number = angle * Math.PI / 180;
        var s:Number = Math.sin(r);
        var c:Number = Math.cos(r);
        var dX:Number = object.x - center.x;
        var dY:Number = object.y - center.y;
 
        object.rotation += angle;
        object.x = center.x + dX * c - dY * s;
        object.y = center.y + dX * s + dY * c;
    }

сначала вызывается функция перемещения тела, затем поворота

так выглядит перемещение тела

Код AS3:

public function MoveTo ( X : Number , Y : Number) // перемещаем спрайт
{
 
        var matrix:Matrix = Rect.transform.matrix;
        //trace(matrix.tx, matrix.ty) ;
        var rect:Rectangle = Rect.getBounds(Rect.parent);
 
        var Dx : Number = X - this.XX ;
        var Dy : Number = Y - this.YY ;
 
        matrix.translate( Dx  , Dy );
        this.XX = ( rect.left + (rect.width / 2) + Dx) ;
        this.YY = ( rect.top + (rect.height / 2) + Dy) ;
 
        Rect.transform.matrix = matrix;       
}


alatar 11.08.2015 18:29

http://www.flasher.ru/forum/blog.php?b=704


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

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