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

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

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

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

СообщениеДобавлено: 12 янв 2018, 17:16
Cr0c
Vector3 transform.rotation.Euler есть. Бери из него ось вращения и считай остаток от деления на 90 - вот тебе и угол доворота.

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

СообщениеДобавлено: 12 янв 2018, 17:37
Leonin
Большое спасибо! Я так понял, получать Эйлеровы углы лучше из transform.rotation?

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

СообщениеДобавлено: 12 янв 2018, 17:52
Cr0c
Это получение эйлеров из кватерниона

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

СообщениеДобавлено: 12 янв 2018, 19:46
Leonin
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;
}
 

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

СообщениеДобавлено: 12 янв 2018, 21:11
Cr0c
А чего заранее не рассчитать поворот при спавне, чтобы внизу сошёлся?

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

СообщениеДобавлено: 12 янв 2018, 21:42
Leonin
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;
}
 

Видюшка:
Скрытый текст:

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

СообщениеДобавлено: 12 янв 2018, 23:04
samana
А если телепортировать игрока не с одним условием, как сейчас, когда уровень скрылся из виду, но и когда угол поворота кратный 90, чтобы приземлился корректно?
Или вообще может не заморачиваться с этими условиями, а просто при соприкосновении с уровнем - довернуть куб если необходимо. Меньше секунды займёт и выключить на это время управление.

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

СообщениеДобавлено: 12 янв 2018, 23:15
Leonin
samana писал(а):А если телепортировать игрока не с одним условием, как сейчас, когда уровень скрылся из виду, но и когда угол поворота кратный 90, чтобы приземлился корректно?

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

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

Как вариант телепортировать на такую фиксированную высоту, чтобы уровня не было видно и лерпить меняющийся угол так, чтобы это выглядело как Rotation Drag у риджид боди. так даже лучше будет. Но опять же это в теории.
Тем не менее, вопрос в силе. Если кто-нибудь понимает, как решать -- буду рад подсказкам)

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

СообщениеДобавлено: 13 янв 2018, 00:04
Tolking
телепортиш над точкой приземления
рассчитываеш в какое положение должен встать на точке приземления
лерпиш в позицию и поворот за удобное тебе время...

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

СообщениеДобавлено: 13 янв 2018, 02:54
Leonin
Реализовал по совету Samana с доп. условием. Вполне пристойно работает :) Спасибо всем, кто помог.
В ютуб не стал заливать, но вот: https://vk.com/video219887374_456239134