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);
{ 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);
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 градусов к основному.
Скрытый текст: