Помогите решить проблему поворота вектора.

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

Помогите решить проблему поворота вектора.

Сообщение NOVA 18 окт 2018, 12:40

Здравствуйте. Уравнения отсюда.
http://grafika.me/node/82
Попытка вращения дочернего вектора при помощи этих уравнений.
Поворот вектора относительно CameraForward по x и по y;
Синтаксис:
Используется csharp
if (L1.y < 0)
            { L1A.x = -Vector3.Angle((Vector3.ProjectOnPlane(L1, Camera1.transform.right)).normalized, Camera1.transform.forward); }
            else
            { L1A.x = Vector3.Angle((Vector3.ProjectOnPlane(L1, Camera1.transform.right)).normalized, Camera1.transform.forward); }

            if (L1.x < 0)
            { L1A.y = -Vector3.Angle((Vector3.ProjectOnPlane(L1, Camera1.transform.up)).normalized, Camera1.transform.forward); }
            else
            { L1A.y = Vector3.Angle((Vector3.ProjectOnPlane(L1, Camera1.transform.up)).normalized, Camera1.transform.forward); }

            Debug.Log(L1A);


Поворот камеры по мировым осям без Z пока что
Синтаксис:
Используется csharp
//xrotation
            if (Vector3.Dot(-Camera1.transform.up, new Vector3(0, 0, 1)) >= 0)
            {
                FR.x = Vector3.Angle((Vector3.ProjectOnPlane(Camera1.transform.forward, new Vector3(1, 0, 0))).normalized, new Vector3(0, 0, 1));
            }
            else
            {
                FR.x = -Vector3.Angle((Vector3.ProjectOnPlane(Camera1.transform.forward, new Vector3(1, 0, 0))).normalized, new Vector3(0, 0, 1));
            }



            Lp.x = 0;
            Lp.y = Mathf.Sin((FR.x + L1A.x) * Mathf.Deg2Rad);
            Lp.z = Mathf.Cos((FR.x + L1A.x) * Mathf.Deg2Rad);


            //yrotation

            if (Vector3.Dot(-Camera1.transform.right, new Vector3(0, 0, 1)) >= 0)
            {
                FR.y = Vector3.Angle((Vector3.ProjectOnPlane(Camera1.transform.forward, new Vector3(0, 1, 0))).normalized, new Vector3(0, 0, 1));
            }
            else
            {
                FR.y = -Vector3.Angle((Vector3.ProjectOnPlane(Camera1.transform.forward, new Vector3(0, 1, 0))).normalized, new Vector3(0, 0, 1));
            }

            NLp.x = Lp.x*Mathf.Cos((FR.y + L1A.y) * Mathf.Deg2Rad) + Lp.z*Mathf.Sin((FR.y + L1A.y) * Mathf.Deg2Rad);
            NLp.y = Lp.y;
            NLp.z = -Lp.x * Mathf.Sin((FR.y + L1A.y) * Mathf.Deg2Rad) + Lp.z* Mathf.Cos((FR.y + L1A.y) * Mathf.Deg2Rad);
            Debug.Log(Vector3.Angle(Camera1.transform.forward, NLp));
            Debug.DrawRay(Camera1.transform.position, Camera1.transform.TransformDirection(LeftVector1).normalized, Color.white);


Там же прописаны эти уравнения.
Вроде работает но не точно. При повороте вектора вверх прямо вниз на 90 градусов. Отрисовывается точно. Стоит повернуть его по диагонали, начинает уходит от оригинала градусов на 5.
Что это может быть такое? На погрешность не похоже.
На изображениях красный вектор отрисовывается уравнением. Белый - оригинал, является дочерним. При повороте камеры красный вектор плавно меняет угол. От 0 до 5 градусов к основному.
Скрытый текст:
Изображение Изображение
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Помогите решить проблему поворота вектора.

Сообщение Kabanelloo 09 ноя 2018, 22:46

Вы хотите реализовать именно по этим уравнениям? Если это что-то банальное типа вращение камеры во круг свой оси, то зачем ломать себе голову и тратить на это время? С начала решите этот главный вопрос. Много решений с более простой реализацией в одну- две строки кода.
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea


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

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

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