Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.08.2015, 18:12
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 1  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
По умолчанию Спрайт неправильно вращается при малой угловой скорости

Добрый день, проблема такая.

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

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

rectangle.swf   (15.4 Кб)
Вложения
Тип файла: swf rectangle.swf (15.4 Кб, 584 просмотров)


Последний раз редактировалось udaaff; 10.08.2015 в 18:30.
Старый 10.08.2015, 18:29
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Покажите как крутите, где-то ошибка накапливается.
__________________
Дети не должны знать о своих родителях

Старый 10.08.2015, 18:43
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 3  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
Код 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

Старый 10.08.2015, 18:48
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Рассчитывать поворот нужно каждый раз из начальных параметров.
Вот тут тема освещена: http://www.flasher.ru/forum/showthread.php?t=175235
__________________
Дети не должны знать о своих родителях

Старый 10.08.2015, 21:02
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 5  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
Спасибо! сейчас попробую

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



Код 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)
Вложения
Тип файла: swf rectangle.swf (15.9 Кб, 37 просмотров)


Последний раз редактировалось udaaff; 13.08.2015 в 19:35.
Старый 11.08.2015, 14:36
MAPUTO вне форума Посмотреть профиль Отправить личное сообщение для MAPUTO Найти все сообщения от MAPUTO
  № 6  
Ответить с цитированием
MAPUTO
 
Аватар для MAPUTO

Регистрация: Mar 2011
Сообщений: 38
Попробуйте вставить вот такую строчку в Ваш исходный код:
Код 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 должны быть разные
__________________
Если человек не задает вопрос - правильный ответ его ничему не научит © Joe Maputo


Последний раз редактировалось MAPUTO; 11.08.2015 в 15:10. Причина: Дополнение сообщения
Старый 11.08.2015, 15:39
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 7  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
поворачиваю теперь так
Код 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;	
}

Старый 11.08.2015, 18:29
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
http://www.flasher.ru/forum/blog.php?b=704
__________________
משיח לא בא
משיח גם לא מטלפן

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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