Угол до полного поворота

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

Угол до полного поворота

Сообщение Leonin 12 янв 2018, 17:02

Вот задачка: имеется объект, который вращается только по одной оси (x, y или z) и эта ось параллельна мировой оси. Дана угловая скорость (может быть и отрицательной). Начальный угол может быть любым.
Как высчитать время, за которое остаток от деления угла на 90 станет равен 0. (т.е. все локальные оси объекта станут параллельными мировым осям).
Это было бы просто решить, если бы хитрый юнити не инвертировал две другие оси в процессе вращения так, что меняющийся был между от 270, 0 и 90 :\
Аватара пользователя
Leonin
UNец
 
Сообщения: 44
Зарегистрирован: 12 янв 2018, 16:59

Re: Угол до полного поворота

Сообщение Cr0c 12 янв 2018, 17:16

Vector3 transform.rotation.Euler есть. Бери из него ось вращения и считай остаток от деления на 90 - вот тебе и угол доворота.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Угол до полного поворота

Сообщение Leonin 12 янв 2018, 17:37

Большое спасибо! Я так понял, получать Эйлеровы углы лучше из transform.rotation?
Аватара пользователя
Leonin
UNец
 
Сообщения: 44
Зарегистрирован: 12 янв 2018, 16:59

Re: Угол до полного поворота

Сообщение Cr0c 12 янв 2018, 17:52

Это получение эйлеров из кватерниона
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Угол до полного поворота

Сообщение Leonin 12 янв 2018, 19:46

Cr0c писал(а):Это получение эйлеров из кватерниона

Нет, все таки, работает не так, как надо. уже голова закипает, не могу разобраться с этими углами... В каких-то случаях работает правильно, в каких-то нет. Я телепортирую падающий объект, вращающийся только по одной оси при падении, над точкой спавна. Надо высчитать время, за которое у него будет нормальный поворот в пространстве. На основе этого считаю высоту над спавном и телепортирую. Поэтому объект в теории должен падать так, что его углы при приземлении будут параллельны мировым осям с небольшими отклонениями.
Синтаксис:
Используется csharp
public static float GetAngleForCompliteRotation(Transform target, Vector3 rotationAxis)
{
        float deltaAngle = 0;

        if (rotationAxis == target.right || rotationAxis == -target.right)
                deltaAngle = target.eulerAngles.x;

        else if (rotationAxis == target.forward || rotationAxis == -target.forward)
                deltaAngle = target.eulerAngles.z;

        else if (rotationAxis == target.up || rotationAxis == -target.up)
                deltaAngle = target.eulerAngles.y;

        //MonoBehaviour.print(deltaAngle);
        //MonoBehaviour.print(target.eulerAngles);

        return deltaAngle % 90;
}
 
Аватара пользователя
Leonin
UNец
 
Сообщения: 44
Зарегистрирован: 12 янв 2018, 16:59

Re: Угол до полного поворота

Сообщение Cr0c 12 янв 2018, 21:11

А чего заранее не рассчитать поворот при спавне, чтобы внизу сошёлся?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Угол до полного поворота

Сообщение Leonin 12 янв 2018, 21:42

Cr0c писал(а):А чего заранее не рассчитать поворот при спавне, чтобы внизу сошёлся?

дело в том, что мой объект может зайти "за уровень" и начать падать. Когда уровень скрылся из виду, я телепортирую игрока, но этот момент может быть любым, следовательно, угол тоже. Для наглядности щас видео прикреплю.

Код:
Синтаксис:
Используется csharp
public static float GetAngleForCompliteRotation(Transform target, Vector3 rotationAxis, Rigidbody rb)
{
        float deltaAngle = 0;

        if (rotationAxis == -Utilites.RoundVectorTo(target.right, 1) ||
            rotationAxis == Utilites.RoundVectorTo(target.right, 1))
                deltaAngle = rb.rotation.eulerAngles.x;
        else if (rotationAxis == -Utilites.RoundVectorTo(target.forward, 1) ||
                rotationAxis == Utilites.RoundVectorTo(target.forward, 1))
                deltaAngle = rb.rotation.eulerAngles.z;
        else if (rotationAxis == -Utilites.RoundVectorTo(target.up, 1) ||
               rotationAxis == Utilites.RoundVectorTo(target.up, 1))
                deltaAngle = rb.rotation.eulerAngles.y;
       
        return deltaAngle;
}
 

Видюшка:
Скрытый текст:
Аватара пользователя
Leonin
UNец
 
Сообщения: 44
Зарегистрирован: 12 янв 2018, 16:59

Re: Угол до полного поворота

Сообщение samana 12 янв 2018, 23:04

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

Re: Угол до полного поворота

Сообщение Leonin 12 янв 2018, 23:15

samana писал(а):А если телепортировать игрока не с одним условием, как сейчас, когда уровень скрылся из виду, но и когда угол поворота кратный 90, чтобы приземлился корректно?

Я думал над этим, но вот если скорость вращения высока, то довольно сложно (точнее маловероятно) подобрать такой момент, что меняющийся угол был в окрестности (хотя бы +-3 градуса) кратного 90 градусам (т.е. от 87 до 93, от 357 до 3 и тд). Хотя, наверное можно отслеживать предыдущий остаток от деления: был 88, стал 1, ага, значит, куб перескочил нужный угол. Но сейчас пишу голословно: надо пробовать.
samana писал(а):Или вообще может не заморачиваться с этими условиями, а просто при соприкосновении с уровнем - довернуть куб если необходимо. Меньше секунды займёт и выключить на это время управление.

Довернуть можно, но выглядеть будет неестественно. Плюс еще один State придется добавалять, пусть и маленький :(

Как вариант телепортировать на такую фиксированную высоту, чтобы уровня не было видно и лерпить меняющийся угол так, чтобы это выглядело как Rotation Drag у риджид боди. так даже лучше будет. Но опять же это в теории.
Тем не менее, вопрос в силе. Если кто-нибудь понимает, как решать -- буду рад подсказкам)
Аватара пользователя
Leonin
UNец
 
Сообщения: 44
Зарегистрирован: 12 янв 2018, 16:59

Re: Угол до полного поворота

Сообщение Tolking 13 янв 2018, 00:04

телепортиш над точкой приземления
рассчитываеш в какое положение должен встать на точке приземления
лерпиш в позицию и поворот за удобное тебе время...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Угол до полного поворота

Сообщение Leonin 13 янв 2018, 02:54

Реализовал по совету Samana с доп. условием. Вполне пристойно работает :) Спасибо всем, кто помог.
В ютуб не стал заливать, но вот: https://vk.com/video219887374_456239134
Аватара пользователя
Leonin
UNец
 
Сообщения: 44
Зарегистрирован: 12 янв 2018, 16:59


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13