Повернуть объект к плоскости с заданными параметрами

Общие вопросы о Unity3D

Повернуть объект к плоскости с заданными параметрами

Сообщение mastersmit 07 янв 2020, 02:35

Имеется - Объекты А и Б, Плоскости А и Б.
Задача - установить ротацию объекта Б к плоскости Б равную обратной ротации объекта А к плоскости А (может быть не совсем правильно выразился).
Скрытый текст:
Изображение

Пробовал взять разницу кватернионов плоскостей:
Синтаксис:
Используется csharp
var diffrenceQuaternions = planeB.rotation * Quaternion.Inverse(planeA.rotation);

Вроде все верно возвращает то, что надо.
Дальше по логике же надо умножить эту разницу на кватернион объекта А:
Синтаксис:
Используется csharp
objectB.rotation = diffrenceQuaternions * objectA.rotation


Но по факту чет не то получается.. Ротация не верна.
Помогите с этими кватернионами гребанными =)
При этом повороты обоих плоскостей могут быть любыми, как и поворот объекта А по всем осям..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 543
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение 1max1 07 янв 2020, 03:03

Задача - установить ротацию объекта Б к плоскости Б равную обратной ротации объекта А к плоскости А (может быть не совсем правильно выразился).

Давай конкретный пример, ничего не понятно.
Аватара пользователя
1max1
Адепт
 
Сообщения: 4955
Зарегистрирован: 28 июн 2017, 10:51

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение mastersmit 07 янв 2020, 06:13

1max1 писал(а):Давай конкретный пример, ничего не понятно.

Ну вот посмотри на приведенное изображение.. Надо, чтобы поворот объекта Б относительно Плоскости Б соответствовал инверсии поворота Объекта А относительно Плоскости А.
Просто изображение это по сути и есть пример. Даже если скрины с юнити покажу, то там будет тоже самое, только в 3Д =))

Во! Еще пример придумал. Игра Portal. Там игрок вносит куб в портал А, двойник которого выходит из портала Б. При этом поворот куба относительно портала А равен инверсии поворота его двойника относительно портала Б..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 543
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение 1max1 07 янв 2020, 14:11

Так?

Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    [SerializeField] Transform objA;
    [SerializeField] Transform objB;
    [SerializeField] Transform planeA;
    [SerializeField] Transform planeB;

    void Update()
    {
        var q = objA.rotation * planeA.rotation;

        objB.rotation = planeB.rotation * Quaternion.Inverse(q);
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 4955
Зарегистрирован: 28 июн 2017, 10:51

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение mastersmit 07 янв 2020, 17:34

1max1 писал(а):Так?

Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    [SerializeField] Transform objA;
    [SerializeField] Transform objB;
    [SerializeField] Transform planeA;
    [SerializeField] Transform planeB;

    void Update()
    {
        var q = objA.rotation * planeA.rotation;

        objB.rotation = planeB.rotation * Quaternion.Inverse(q);
    }
}


Не, вообще некорректно(
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 543
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение 1max1 07 янв 2020, 18:26

Окей, давай погадаем на кофейной гуще...
Что нибудь из этого подходит? Или хотя бы близко? Опиши на моем примере как должно быть.



Синтаксис:
Используется csharp
class asd : MonoBehaviour
{
    enum Type
    {
        One, Two, Three
    }

    [SerializeField] Transform objA;
    [SerializeField] Transform objB;
    [SerializeField] Transform planeA;
    [SerializeField] Transform planeB;
    [SerializeField] Type type;

    void Update()
    {
        var q = objA.rotation * planeA.rotation;

        switch (type)
        {
            case Type.One:
                objB.rotation = planeB.rotation * Quaternion.Inverse(q);
                break;

            case Type.Two:
                objB.rotation = planeB.rotation * q;
                objB.forward = -objB.forward;
                break;

            case Type.Three:
                objB.rotation = planeB.rotation * Quaternion.Inverse(q);
                objB.forward = -objB.forward;
                break;
        }

        Debug.DrawLine(objA.position, objA.position + objA.forward * 100.0f, Color.red);
        Debug.DrawLine(objB.position, objB.position + objB.forward * 100.0f, Color.green);
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 4955
Зарегистрирован: 28 июн 2017, 10:51

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение mastersmit 08 янв 2020, 03:51

1max1 писал(а):Окей, давай погадаем на кофейной гуще...
Что нибудь из этого подходит? Или хотя бы близко? Опиши на моем примере как должно быть.

Во во, второй вариант кажись то че надо =)
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 543
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение mastersmit 10 янв 2020, 02:31

А нет, не то.. =( когда плоскости располагаются, например, как у тебя в видео, то все хорошо. Когда в одной плоскости, все хорошо. Когда в противоположных плоскостях все хорошо. Но когда, например, плоскость Б расположена перпендикулярно плоскости А, то все косячно(
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 543
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение 1max1 10 янв 2020, 11:57

Я посмотрел твой видос. Мне кажется там проблема в том что, когда игрок заходит в 1 портал, его позиция меняется он получается уже на выходе из 2, но 2 портал его обратно сует в 1. Попробуй сделать так, что когда ты входишь в 1 портал, то все коллизии со вторым отключаются, либо заранее их отключи, походи сначала через 1, потом на 1 отключи все и походи через 2, чтобы исключить этот вариант.
Кстати, на игроке капсульный коллайдер же?
Аватара пользователя
1max1
Адепт
 
Сообщения: 4955
Зарегистрирован: 28 июн 2017, 10:51

Re: Повернуть объект к плоскости с заданными параметрами

Сообщение mastersmit 10 янв 2020, 12:35

1max1 писал(а):Я посмотрел твой видос. Мне кажется там проблема в том что, когда игрок заходит в 1 портал, его позиция меняется он получается уже на выходе из 2, но 2 портал его обратно сует в 1. Попробуй сделать так, что когда ты входишь в 1 портал, то все коллизии со вторым отключаются, либо заранее их отключи, походи сначала через 1, потом на 1 отключи все и походи через 2, чтобы исключить этот вариант.
Кстати, на игроке капсульный коллайдер же?

А все, решил вопрос уже, только по другому, работает отлично теперь, чему я несказанно рад :ymdaydream: и это не по той причине, что ты описал, там с определением где в каком сейчас находится игрок верно, там на видео сохраняю 1 портал в oldPassthrough, чтобы на выходе не было тобой описанной проблемы. Если интересно как работает, могу показать, там теперь хоть как залетай/вылетай в/из портал/-а - работает хорошо, хоть и несколько иначе, чем в оригинале, но пусть это будет своей фишкой ;)

На игроке да, капсюльный коллайдер с RB. По началу хотел делать на CC, но отказался, так как с ним мороки с некоторыми моментами побольше. Да и на откуп всего физике тоже возможно откажусь, пока все под вопросом еще..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 543
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 16