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

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

СообщениеДобавлено: 18 окт 2018, 12:40
NOVA
Здравствуйте. Уравнения отсюда.
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 градусов к основному.
Скрытый текст:
Изображение Изображение

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

СообщениеДобавлено: 09 ноя 2018, 22:46
Kabanelloo
Вы хотите реализовать именно по этим уравнениям? Если это что-то банальное типа вращение камеры во круг свой оси, то зачем ломать себе голову и тратить на это время? С начала решите этот главный вопрос. Много решений с более простой реализацией в одну- две строки кода.