Форум 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=175235)

PlutDem 04.03.2012 17:20

Wolsh
Люфт? Что он из себя представляет? Вертел объект на 1 градус в цикле 360 000 раз и никакого изменения координат не было. Правда я храню координаты в отдельном Point и уже после всех манипуляций присваиваю его координаты объекту.

Wolsh 04.03.2012 19:51

Цитата:

Вертел объект на 1 градус в цикле 360 000 раз
В цикле? А при чем тут цикл? Покрути на 30° по ENTER_FRAME.
Надо было мне всетаки тест выложить, а не просто класс и SWF)) Скажем, если в этом тесте (SWF который я выложил) убрать из класса раунды, то через 2-5 секунд белая точка уползет из-под черной примерно на 5-10 пикселей.
Этот вопрос вообще такой неоднозначный оттого, что каждый тестит по-своему под свою задачу. Задачи действительно очень разные по смыслу. Кому-то надо один раз программно повернуть объект в момент отображения и так оставить. Кому-то надо постоянно крутить объект вокруг одной и той же точки, например стрелку часов. Кто-то представляет интерфейс как "rotation" а не "rotate", то есть считает удобным задать конечный угол "от нуля", а не "доворачивать" объект от его текущего состояния. Сажем, для инструмента в графическом редакторе, позволяющем поворачивать редактируемый объект относительно любой "центральной" точки (transformation point) необходим именно такой "доворот", поскольку он позволяет делать последовательное изменение положения и поворота относительно разных точек (см. SWF). Это наиболее общий по решаемой задаче код. Для конкретных ограниченных ситуаций он может быть сокращен и в три раза.

PlutDem 08.03.2012 13:42

После долгих раздумий решил вертеть так:
Код AS3:

public function objRotate(angle:Number) : void{
 
    var matrix:Matrix = bsMatrix.clone();
 
    matrix.translate( -objLocRotatingPoint.x, -objLocRotatingPoint.y );// смещаем начальную матрицу на локальные коордиаты
    matrix.rotate( (this.rotation+angle) * GL.RAD );// новое вращение = старое + доворот * Math.PI/180
    matrix.translate( objGlobRotatingPoint.x, objGlobRotatingPoint.y );//смещаем начальную матрицу на глобальные коордиаты
 
    this.transform.matrix = matrix;
}

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

Akopalipsis 15.01.2014 23:28

Вложений: 1
Целый день сегодня я пытался объяснить человеку, что мною позаимствованный в этой теме, код, работает без слётов, как часы. Но решив ускорить вращательный момент, чтобы приблизится к тому времени, по истечению которого, у человека, которому я пытался помочь, слетала картинка... И раз, она и вправду слетела. И теперь у меня точно такой же вопрос - правда чтоль не реально сделать вращение без слётов??)
Код использовал Wolsh'a.
rotate3.swf   (38.5 Кб)


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

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