Вращение объекта вокруг вектора

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Вращение объекта вокруг вектора

Сообщение NOVA 26 фев 2017, 15:20

Возможно ли как нибудь задать вращение в глобальных координатах не вокруг одной из оси XYZ а вокруг заданного вектора? Допустим вокруг vector3.right другого объекта.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Вращение объекта вокруг вектора

Сообщение Woolf 26 фев 2017, 15:32

Вам надавали уже уйму ссылок на статьи по матрицам, формулам вращения и векторной математике. Неужели так сложно прочитать?
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Вращение объекта вокруг вектора

Сообщение NOVA 26 фев 2017, 16:14

мне нужны стандартные решения юнити.
Вот например нагуглил FromToRotation. Сейчас буду тестить.
И если это решит мою проблему, я пойму что 2 недели я занимался полной фигнёй. Типа перемножения и сложения углов и векторов.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Вращение объекта вокруг вектора

Сообщение samana 26 фев 2017, 17:16

Я думаю вам подойдёт метод RotateAround. https://docs.unity3d.com/ScriptReferenc ... round.html
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Вращение объекта вокруг вектора

Сообщение NOVA 26 фев 2017, 17:56

samana писал(а):Я думаю вам подойдёт метод RotateAround. https://docs.unity3d.com/ScriptReferenc ... round.html

Я думал это вращает объект вокруг точки. А мне надо повернуть объект по оси вектора.
Rotates the transform about axis passing through point in world coordinates by angle degrees.
Скрытый текст:
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Вращение объекта вокруг вектора

Сообщение samana 26 фев 2017, 18:08

Да, вокруг любой точки, по любой оси.
А разве обычный поворот не подходит?
Синтаксис:
Используется csharp
transform.Rotate(otherObject.right, 3);
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Вращение объекта вокруг вектора

Сообщение samana 26 фев 2017, 18:13

Первый вариант работает нормально, то если во время игры поменять поворот другого объекта, то кручение становится не правильным.
Поэтому попробуйте всё таки
Синтаксис:
Используется csharp
transform.RotateAround(transform.position, otherObject.right, 3);

тогда работает корректно, даже когда другой объект вращается.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Вращение объекта вокруг вектора

Сообщение NOVA 26 фев 2017, 18:35

samana писал(а):Да, вокруг любой точки, по любой оси.
А разве обычный поворот не подходит?
Синтаксис:
Используется csharp
transform.Rotate(otherObject.right, 3);

Вращение вокруг точки и оси - это разные вещи. Если мы вращаем объект по оси Y значит он вращается в плоскости XZ. Если мы вращаем объект вокруг точки, он вращается как попало.
Вот это не подходит никак.
transform.Rotate(otherObject.right, 3)

Я думал вот это подойдёт.
transform.rotation = Quaternion.AngleAxis(30, Vector3.up);
Но юнити вечно выравнивает вращение объектов в глобальные оси.
Надо что-то типа этого, только transform.Rotate

Надо просто в глобальных координатах довернуть объект на угол, между совершенно другими векторами.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Вращение объекта вокруг вектора

Сообщение samana 26 фев 2017, 18:40

NOVA писал(а):Вращение вокруг точки и оси - это разные вещи.

Но я же не говорил, что это одно и то же.

NOVA писал(а):Если мы вращаем объект вокруг точки, он вращается как попало.

Поэтому нужно выбрать как точку, так и ось, чтобы вращалось в нужной точке по нужной оси.

NOVA писал(а):Но юнити вечно выравнивает вращение объектов в глобальные оси.
Надо что-то типа этого, только transform.Rotate
Надо просто в глобальных координатах довернуть объект на угол, между совершенно другими векторами.

Что-то я ничего уже не пойму из вашего задания. :-??
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Вращение объекта вокруг вектора

Сообщение NOVA 26 фев 2017, 18:53

samana писал(а):
NOVA писал(а):Вращение вокруг точки и оси - это разные вещи.

Но я же не говорил, что это одно и то же.

NOVA писал(а):Если мы вращаем объект вокруг точки, он вращается как попало.

Поэтому нужно выбрать как точку, так и ось, чтобы вращалось в нужной точке по нужной оси.

NOVA писал(а):Но юнити вечно выравнивает вращение объектов в глобальные оси.
Надо что-то типа этого, только transform.Rotate
Надо просто в глобальных координатах довернуть объект на угол, между совершенно другими векторами.

Что-то я ничего уже не пойму из вашего задания. :-??


Вот наглядное видео.
Скрытый текст:


Для направления на цель я вращаю кость спины на угол между дробовиком.transform.forward и вектором до прицела спроецированный параллельно земле от дробовика.
Влево право отлично наводится. А как мне довернуть кость спины вверх-вниз? Сначала я пробовал локально поворачивать по двум локальным осям на угол между дробовиком.transform.forward и вектором прицела.
Хорошо не получается. Как-то криво спина выворачивается.
Остаётся одно. Довернуть спину по оси перпендикулярной двум векторам дробовик.transform.forward и дробовикdown(этот вектор я получил разностью позиции дробовика и позиции его на земле y=0, он вертикальный)

Так как у кости спины одни локальные оси, у дробовика другие, то как-то не получается. Выходит, что спину надо вращать по осям Y,Z одновременно.


Логически можно это всё провернуть доворотом кости.
Для этого надо знать на сколько по каждой оси надо повернуть дробовик, чтобы довернуть спину в глобальных координатах. Но Vector3.Angle слишком примитивная функция для этого.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Вращение объекта вокруг вектора

Сообщение samana 26 фев 2017, 19:22

Теперь ситуация стала понятнее, хотя сложно быть уверенным в том, что там происходит внутри персонажа на 100 %.
Но насколько я вижу, у вас уже даже есть нужная ось, по которой можно вращать спину вверх-вниз, эта ось у вас рисуется зелёным, справа от персонажа. Почему вы используете её, она же идеально подходит.
По идее RotateAround всё таки должен подойти, за точку взять центр кости, а ось - ту зелёную линию, угол уже придётся высчитывать. Но со стороны всегда легко говорить, возможно всё сложнее, и я этого не понял.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Вращение объекта вокруг вектора

Сообщение NOVA 26 фев 2017, 19:29

samana писал(а): Почему вы используете её, она же идеально подходит.

Ну собственно об этом и тема. Это тот самый перпендикулярный вектор, который надо взять за ось и повернуть вокруг этой оси кость спины на определённый угол.
На счёт Rotate around как-то сомнительно.
transform rotation лучше вообще не использовать так как локальные оси костей не соответствуют глобальным.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Вращение объекта вокруг вектора

Сообщение samana 26 фев 2017, 19:45

NOVA писал(а):На счёт Rotate around как-то сомнительно.

Но вы даже не попробовали :)
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Вращение объекта вокруг вектора

Сообщение NOVA 26 фев 2017, 20:36

Спасибо наконец что-то выходит. Только вот вращение по оси "y" стало вибрировать. А может и не по оси y
Скрытый текст:


Вот строки. Пока не знаю в чём проблема.
Синтаксис:
Используется csharp
 void LateUpdate()//Pose2SpineRotationToAim

    {
        if (PoseBlend > 0.99f)
        {
           
                if (SpineBoneDirectionX > 0)
                {
                    SpineBoneRotateX += 0.1f* SpineBoneRotate.x*4;
                }
                if (SpineBoneDirectionX < 0)
                {
                    SpineBoneRotateX -= 0.1f* SpineBoneRotate.x*4;
                }
            if (SpineBoneDirectionY > 0)
            {
                SpineBoneRotateY += 0.1f * SpineBoneRotate.y * 4;
            }
            if (SpineBoneDirectionY < 0)
            {
                SpineBoneRotateY -= 0.1f * SpineBoneRotate.y * 4;
            }
            Spine.transform.Rotate(0, SpineBoneRotateX, 0,Space.World);
            Spine.transform.RotateAround(Spine.transform.position,GunRight, SpineBoneRotateY);
        }
    }

SpineBoneRotate.x это угол поворота до цели
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Вращение объекта вокруг вектора

Сообщение samana 26 фев 2017, 20:44

NOVA писал(а):Наконец что-то выходит.

Ух ты, я уже и не надеелся)

На счёт вибрации могу лишь догадываться:

Синтаксис:
Используется csharp
if (SpineBoneDirectionY > 0)
            {
                SpineBoneRotateY += 0.1f * SpineBoneRotate.y * 4;
            }
            if (SpineBoneDirectionY < 0)
            {
                SpineBoneRotateY -= 0.1f * SpineBoneRotate.y * 4;
            }


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

Попробуйте сначала сделать в этом случает не два if, а if и else if. Если не поможет, то надо будет подумать, как бы сюда прикрутить лерп.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 31


cron