CalcYawPitch

This commit is contained in:
ousttrue
2021-05-14 13:43:13 +09:00
parent 673aac40e3
commit ce8e0bff16
2 changed files with 49 additions and 114 deletions

View File

@@ -52,35 +52,36 @@ namespace UniVRM10
Handles.DrawLine(m_target.Source.position, m_target.transform.position);
var pos = m_target.transform.position;
TR.FromWorld(m_target.transform).Draw(0.2f);
EditorGUI.BeginChangeCheck();
var pr = m_target.ParentRotation;
// EditorGUI.BeginChangeCheck();
// var pr = m_target.ParentRotation;
if (m_target.Logic == null)
{
TR.FromWorld(m_target.transform).Draw(0.2f);
// if (m_target.Logic == null)
// {
// TR.FromWorld(m_target.transform).Draw(0.2f);
Handles.matrix = Matrix4x4.identity;
var rot = Handles.RotationHandle(pr * m_target.DestinationOffset, pos);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(m_target, "Rotated RotateAt Point");
m_target.DestinationOffset = Quaternion.Inverse(pr) * rot;
}
// Handles.matrix = Matrix4x4.identity;
// var rot = Handles.RotationHandle(pr * m_target.DestinationOffset, pos);
// if (EditorGUI.EndChangeCheck())
// {
// Undo.RecordObject(m_target, "Rotated RotateAt Point");
// m_target.DestinationOffset = Quaternion.Inverse(pr) * rot;
// }
DrawAimUp(rot, pos, Color.yellow);
}
else
{
var rot = m_target.ParentRotation * m_target.Logic.InitialLocalRotation * m_target.DestinationOffset;
DrawAimUp(rot, m_target.transform.position, Color.yellow);
DrawAimUp(m_target.transform.rotation * m_target.Delta, m_target.transform.position, Color.magenta);
// DrawAimUp(rot, pos, Color.yellow);
// }
// else
// {
// var rot = m_target.ParentRotation * m_target.Logic.InitialLocalRotation * m_target.DestinationOffset;
// DrawAimUp(rot, m_target.transform.position, Color.yellow);
// DrawAimUp(m_target.transform.rotation * m_target.Delta, m_target.transform.position, Color.magenta);
var sb = new StringBuilder();
sb.AppendLine($"yaw: {m_target.Yaw:0.}");
sb.AppendLine($"pitch: {m_target.Pitch:0.}");
Handles.Label(m_target.transform.position, sb.ToString(), Style);
}
// var sb = new StringBuilder();
// sb.AppendLine($"yaw: {m_target.Yaw:0.}");
// sb.AppendLine($"pitch: {m_target.Pitch:0.}");
// Handles.Label(m_target.transform.position, sb.ToString(), Style);
// }
}
}
}

View File

@@ -20,20 +20,20 @@ namespace UniVRM10
[Range(0, 10.0f)]
public float Weight = 1.0f;
[SerializeField]
public Quaternion DestinationOffset = Quaternion.identity;
public Quaternion ParentRotation => transform.parent == null ? Quaternion.identity : transform.parent.rotation;
public class AimLogic
{
public readonly Quaternion InitialLocalRotation;
public AimLogic(Quaternion initialLocalRotation)
{
InitialLocalRotation = initialLocalRotation;
}
}
public AimLogic Logic { get; private set; }
// [SerializeField]
// public Quaternion DestinationOffset = Quaternion.identity;
// public class AimLogic
// {
// public readonly Quaternion InitialLocalRotation;
// public AimLogic(Quaternion initialLocalRotation)
// {
// InitialLocalRotation = initialLocalRotation;
// }
// }
// public AimLogic Logic { get; private set; }
void Start()
@@ -44,75 +44,10 @@ namespace UniVRM10
return;
}
if (Logic == null)
{
Logic = new AimLogic(transform.localRotation);
}
}
static (float, int, float, int) CalcYawPitch(Matrix4x4 m, Vector3 target)
{
var zaxis = Vector3.Project(target, m.GetColumn(2));
var yaxis = Vector3.Project(target, m.GetColumn(1));
var xaxis = Vector3.Project(target, m.GetColumn(0));
var xDot = Vector3.Dot(xaxis, m.GetColumn(0)) > 0;
var yDot = Vector3.Dot(yaxis, m.GetColumn(1)) > 0;
var zDot = Vector3.Dot(zaxis, m.GetColumn(2)) > 0;
// xz
var yaw = (float)System.Math.Atan2(xaxis.magnitude, zaxis.magnitude) * Mathf.Rad2Deg;
var yawQuadrant = -1;
if (xDot && zDot)
{
// 1st(0-90)
yawQuadrant = 0;
}
else if (xDot && !zDot)
{
// 2nd(90-180)
yawQuadrant = 1;
}
else if (!xDot && !zDot)
{
// 3rd
yawQuadrant = 2;
}
else if (!xDot && zDot)
{
// 4th
yawQuadrant = 3;
}
else
{
throw new NotImplementedException();
}
// xy
var pitch = (float)System.Math.Atan2(yaxis.magnitude, (xaxis + zaxis).magnitude) * Mathf.Rad2Deg;
var pitchQuadrant = -1;
if (yDot && zDot)
{
// 1st
pitchQuadrant = 0;
}
else if (yDot & !zDot)
{
// 2nd
pitchQuadrant = 1;
}
else if (!yDot & !zDot)
{
// 3rd
pitchQuadrant = 2;
}
else if (!yDot & zDot)
{
// 4th
pitchQuadrant = 3;
}
return (yaw, yawQuadrant, pitch, pitchQuadrant);
// if (Logic == null)
// {
// Logic = new AimLogic(transform.localRotation);
// }
}
/// <summary>
@@ -121,16 +56,15 @@ namespace UniVRM10
/// </summary>
public override void Process()
{
if (Logic == null)
{
return;
}
// if (Logic == null)
// {
// return;
// }
var m = Matrix4x4.TRS(transform.position, ParentRotation * Logic.InitialLocalRotation, Vector3.one);
m.CalcYawPitch(Source.position, out Yaw, out Pitch);
// Delta = Quaternion.Euler(0, Yaw, 0) * Quaternion.Euler(Pitch, 0, 0);
Delta = m.YawPitchRotation(Yaw, Pitch);
transform.rotation = ParentRotation * Logic.InitialLocalRotation * Delta;
var m = Matrix4x4.Rotate(ParentRotation);
m.CalcYawPitch(Source.position - transform.position, out Yaw, out Pitch);
Delta = Quaternion.Euler(0, Yaw, 0) * Quaternion.Euler(-Pitch, 0, 0);
transform.rotation = ParentRotation * Delta;
}
public float Yaw;