Страница 1 из 1

Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 19:35
bomberest
Изображение
Помогите разобраться, как грамотно вращать объект.
Не предлагать вложенные объекты
Хотя, можно вложить в объект только на момент поворота :) (это и есть ответ, вроде). Может, кто без вложений предложит, просто через математику.
Думал, как определить направление угла и подумал, что можно использовать 2 разных вектора для определения Vector3.Angle. Таким образом можно понять, в какую сторону и на сколько нужно повернуть объект через transform.RotateAround()
Почему 2, а не 1? Т.к. Vector3.Angle() выдаёт float [0,180]

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 19:43
seaman
Transform.RotateAround

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 19:46
bomberest
seaman писал(а):Transform.RotateAround

Явно не тот ответ, который я ожидал :)

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 20:27
seaman
А чем Вам он не нравится? У Вас пивот водной точке, а Вам надо вращать вокруг другой. Именно для этого и сделана такая функция Transform.RotateAround Что Вас не устраивает?

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 20:48
bomberest
seaman писал(а):А чем Вам он не нравится? У Вас пивот водной точке, а Вам надо вращать вокруг другой. Именно для этого и сделана такая функция Transform.RotateAround Что Вас не устраивает?

Я про то, что нужно узнать угол, на какой нужно повернуть.

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:04
WereVarg
Похоже что нужно LookAt на вектор (цель минус псевдопивот)

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:05
seaman
Vector3.Angle(transform.forward, (target.transform.position - tempPivot))
tempPivot - точка вокруг которой поворачиваешь

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:12
bomberest
seaman писал(а):Vector3.Angle(transform.forward, (target.transform.position - tempPivot))
tempPivot - точка вокруг которой поворачиваешь

Angle возвращает [0, 180], т.е. вращаться всегда будет по часовой стрелке, а мне нужно, чтобы вращалось и против часовой, если это нужно.

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:37
seaman
Да, точно.
Quaternion.FromToRotation тоже не походит?

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:46
bomberest
seaman писал(а):Да, точно.
Quaternion.FromToRotation тоже не походит?

Кстати, да, если на время поворота засунуть в го, то можно использовать FromToRotation
Еще можно напрямую присваивать transform.forward.
Вообще, я создал топик, т.к. не хотел вложение объектов делать :) Что-то я запутался на пустом месте.

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:48
seaman
Да, а направление поворота определяется по знаку Dot(Cross, Cross):
Синтаксис:
Используется csharp
Vector3 cross = Vector3.Cross(a, b);
bool right = Vector3.Dot(cross, cross) > 0;

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:50
bomberest
seaman писал(а):Да, а направление поворота определяется по знаку Dot(Cross, Cross):
Синтаксис:
Используется csharp
Vector3 cross = Vector3.Cross(a, b);
bool right = Vector3.Dot(cross, cross) > 0;

Спасибо за функцию

Re: Псевдопивот и углы поворта

СообщениеДобавлено: 25 окт 2012, 21:54
seaman
Полный код:
Синтаксис:
Используется csharp
Vector3 tempPivot;  //Точка вокруг которой вертим
Vector3 target;       //Куда поворачиваем
Vector3 cross = Vector3.Cross(tempPivot, target);
int dir = Vector3.Dot(cross, cross) > 0 ? 1 : -1;
float angle = Vector3.Angle(transform.forward, (target.transform.position - tempPivot)) * dir;
Transform.RotateAround(tempPivot, cross, angle);