![]() |
Поворот объекта вокруг точки с помощью тригонометрических функций
Господа, есть ли способ повернуть объект с помощью свойства rotation, а затем вычислить его х и у координаты как будто бы он был повернут вокруг какой то точки?
|
|
Цитата:
|
А так?
http://flasher.ru/forum/showthread.php?t=152684 Добавлено через 8 минут http://flasher.ru/forum/showthread.php?t=146622 |
Использовал вашу функцию из второй темы- увы но при множественном вращении объект постепенно смещается к точке вращения. С матрицами - погрешности, без них - тоже. Это заговор какой то! :D
Код AS3:
|
Нет, почему заговор)) Там такой алгоритм, она не для множественного вращения, а для одного поворота. Перед другим поворотом надо возвращать (в первой теме, про "центр", та же история была - просто я писал эти функции для проекта, где нужно было вот так)) Для динамического поворота надо возвращать объект обратно и задавать новый угол. Возврат в дефолт как раз добавлен в теме про центральное вращение. Ну объедините как-нибудь)))
Добавлено через 6 минут Вы происходящее представьте? Когда объект уже смещен и повернут, а Вы пытаетесь его снова повернуть вокруг той же точки – для него эта точка уже в другом месте, его система координат повернута и смещена относительно той точки. |
То есть если:
1. Создали объект 2. Повернули его 3.Переместили его в точку Х Для корректного вращения нужно: 1.Обнулить вращение 2.Переместить объект в кординаты на момент создания 3.Повернуть на новый, желаемый угол 4. Вернуть его в точку Х Я вас правильно понял? |
Цитата:
|
Цитата:
|
В таком случае, новой точкой будет (координаты начального положения с новым вращением)+(разница координат текущего положения объекта с нулевым вращением между координатами начального положения)?
|
Ну в общем да, заговор, это твипсы. Т.е. реально object.x вы знаете с точностью до 0.05 только. Решение - хранить параллельно Point или что-то подобное, где будет более точное значение. Тут пацаны говорят что что-то куда-то возвращать надо, я этого не понял и у меня работает и так %) Я и собсно смещения не видел, если честно %) Но теоретически может быть вполне =) ну вот крутится, чо
Код AS3:
Код AS3:
|
-De-
Как ни прискорбно, но смещение есть. Такое же как и в дрругих примерах.:( |
Я чето тоже не понял - rotDiff для чего, если он не используется в итоге?
|
Цитата:
|
Здесь разделительное "и", если Вы не заметили. То есть матрицы И костыль – засовывание объекта в контейнер и поворот контейнера.
|
-De- Сейчас если переместить объект, а потом повернуть, то он перемещается обратно в свои изначальные координаты. Можно ли этого избежать? Сейчас ваш способ ничем не отличается от №3+начальная матрица, только кода больше
|
Чтобы переместить обьект надо сменить tx и/или ty у матрицы mOuter, а затем вызвать updateTransform(). Т.е. позиция обьекта - это не его x, y, а tx, ty матрицы mOuter. Наверное потому у вас возвращается.
№3 никак не меняет точку регистрации. Несколько разные задачи. |
Вложений: 1
Код AS3:
Во вложении тестовая свфка просто. Можно кликать и ставить точку, вокруг которой прямоугольник крутится. Черная точка ставится в стейдже, а белая - внутри самого прямоугольника, чтобы наблюдать люфт. |
Wolsh, можно создать простенькую игру - "Впиши вращающиеся фигуры в форму, меняя центр вращения/трансформаций";)
|
да, я уже с полчасика поиграл)))
|
Wolsh
Спасибо, добрый человек! А можно ли задавать точку вращения по локальной системе координат объекта, а то сейчас при при перемещении объекта точка, то на месте остается? Уже попробовал center = object.localToGlobal(center); и разумеется получил пресловутое смещение.:mad: |
Ниче не понял.
Вы хотите, чтобы точка, вокруг которой вращается объект, вращалась вместе с ним? Никакого парадокса не замечаете? |
Wolsh
Нет, нет:) Перемещалась вместе с ним. Т.е. сейчас если поставить точку вращения в центр объекта, то он будет вращаться вокруг своего центра, а если его после этого переместить, то точка вращения будет уже не в центре объекта и , соответственно, вращаться он будет уже по другому. |
Вам надо поспать.
Поворот объекта вокруг точки это любое изменение положения объекта, при котором данная точка объекта не меняет своего положения. |
Wolsh
Так я же говорю не про вращение, а про перемещение объекта! Если объект переместить на новые координаты, а точка останется на прежнем месте, то ее положение относительно объекта измениться и вращение будет происходить уже по другому. |
Если я правильно понял вам нужно положить вращающийся объект в контейнер, а потом уже перемещайте контейнер с объектом как душе угодно будет.
|
PlutDem, так что Вам мешает-то прибавить одно и то же число к Х объекта и Х точки, Y объекта и Y точки?
fish_r, для этого обязательно нужен контейнер?)) |
Цитата:
|
Wolsh
А зачем здесь использовать Math.round? У себя отключил, так как из за округления были проблемы, но черт его знает, может оно необходимо? Код AS3:
|
Разница безусловно есть, было бы терпение подождать. Но если у вас не критично, возникает ли люфт со временем (количеством) поворотов, то можете убрать – из-за необходимости обращения к Math здесь тратятся драгоценные миллисекунды.
MikroAcse Координаты на сцене округляются не до целых, и вкупе с погрешностями тригонометрии возникает накапливаемый люфт. В данном месте делается попытка восстановить начальные координаты объекта, при его свойстве rotation, равном нулю. Предполагается, что его координаты были целыми. Все это важно для множественных поворотов. Для одного-двух несущественно. |
Wolsh
Люфт? Что он из себя представляет? Вертел объект на 1 градус в цикле 360 000 раз и никакого изменения координат не было. Правда я храню координаты в отдельном Point и уже после всех манипуляций присваиваю его координаты объекту. |
Цитата:
Надо было мне всетаки тест выложить, а не просто класс и SWF)) Скажем, если в этом тесте (SWF который я выложил) убрать из класса раунды, то через 2-5 секунд белая точка уползет из-под черной примерно на 5-10 пикселей. Этот вопрос вообще такой неоднозначный оттого, что каждый тестит по-своему под свою задачу. Задачи действительно очень разные по смыслу. Кому-то надо один раз программно повернуть объект в момент отображения и так оставить. Кому-то надо постоянно крутить объект вокруг одной и той же точки, например стрелку часов. Кто-то представляет интерфейс как "rotation" а не "rotate", то есть считает удобным задать конечный угол "от нуля", а не "доворачивать" объект от его текущего состояния. Сажем, для инструмента в графическом редакторе, позволяющем поворачивать редактируемый объект относительно любой "центральной" точки (transformation point) необходим именно такой "доворот", поскольку он позволяет делать последовательное изменение положения и поворота относительно разных точек (см. SWF). Это наиболее общий по решаемой задаче код. Для конкретных ограниченных ситуаций он может быть сокращен и в три раза. |
После долгих раздумий решил вертеть так:
Код AS3:
|
Вложений: 1
Целый день сегодня я пытался объяснить человеку, что мною позаимствованный в этой теме, код, работает без слётов, как часы. Но решив ускорить вращательный момент, чтобы приблизится к тому времени, по истечению которого, у человека, которому я пытался помочь, слетала картинка... И раз, она и вправду слетела. И теперь у меня точно такой же вопрос - правда чтоль не реально сделать вращение без слётов??)
Код использовал Wolsh'a. |
| Часовой пояс GMT +4, время: 05:37. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.