mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-08 20:08:53 -05:00
Merge pull request #1154 from ousttrue/feature1/lookat_editor_tool
Feature1/lookat editor tool
This commit is contained in:
@@ -1,60 +0,0 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UniVRM10
|
||||
{
|
||||
public static class LookAtEditor
|
||||
{
|
||||
public static void Draw2D(VRM10Controller target)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public static void Draw3D(VRM10Controller target, Transform head)
|
||||
{
|
||||
if (target == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!target.DrawLookAtGizmo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (head == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
OnSceneGUIOffset(target, head);
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
// offset
|
||||
var p = target.Vrm.LookAt.OffsetFromHead;
|
||||
Handles.Label(head.position, $"fromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]");
|
||||
}
|
||||
else
|
||||
{
|
||||
target.Vrm.LookAt.OnSceneGUILookAt(head, target.LookAtTargetType, target.Gaze);
|
||||
}
|
||||
}
|
||||
|
||||
static void OnSceneGUIOffset(VRM10Controller m_target, Transform head)
|
||||
{
|
||||
EditorGUI.BeginChangeCheck();
|
||||
|
||||
var worldOffset = head.localToWorldMatrix.MultiplyPoint(m_target.Vrm.LookAt.OffsetFromHead);
|
||||
worldOffset = Handles.PositionHandle(worldOffset, head.rotation);
|
||||
|
||||
Handles.DrawDottedLine(head.position, worldOffset, 5);
|
||||
Handles.SphereHandleCap(0, head.position, Quaternion.identity, 0.02f, Event.current.type);
|
||||
Handles.SphereHandleCap(0, worldOffset, Quaternion.identity, 0.02f, Event.current.type);
|
||||
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
Undo.RecordObject(m_target, "Changed FirstPerson");
|
||||
|
||||
m_target.Vrm.LookAt.OffsetFromHead = head.worldToLocalMatrix.MultiplyPoint(worldOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -81,7 +81,6 @@ namespace UniVRM10
|
||||
enum VRMSceneUI
|
||||
{
|
||||
Constraints,
|
||||
LookAt,
|
||||
SpringBone,
|
||||
}
|
||||
static VRMSceneUI s_ui = default;
|
||||
@@ -110,11 +109,6 @@ namespace UniVRM10
|
||||
Tools.hidden = false;
|
||||
break;
|
||||
|
||||
case VRMSceneUI.LookAt:
|
||||
Tools.hidden = true;
|
||||
LookAtEditor.Draw3D(Root, m_head);
|
||||
break;
|
||||
|
||||
case VRMSceneUI.SpringBone:
|
||||
Tools.hidden = true;
|
||||
SpringBoneEditor.Draw3D(Root, m_so);
|
||||
@@ -169,10 +163,6 @@ namespace UniVRM10
|
||||
m_scrollView.Draw(this.position.y, DrawConstraints, Repaint);
|
||||
break;
|
||||
|
||||
case VRMSceneUI.LookAt:
|
||||
LookAtEditor.Draw2D(Root);
|
||||
break;
|
||||
|
||||
case VRMSceneUI.SpringBone:
|
||||
SpringBoneEditor.Draw2D(Root, m_so);
|
||||
break;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8823eaceb68051c43be15ea92028d412
|
||||
guid: af5da07aebd9a47428d49b56b245b095
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
167
Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs
Normal file
167
Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs
Normal file
@@ -0,0 +1,167 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEditor.EditorTools;
|
||||
|
||||
|
||||
namespace UniVRM10
|
||||
{
|
||||
[EditorTool("vrm-1.0/LookAt", typeof(UniVRM10.VRM10Controller))]
|
||||
class VRM10LookAtEditorTool : EditorTool
|
||||
{
|
||||
static GUIContent s_cachedIcon;
|
||||
public override GUIContent toolbarIcon
|
||||
{
|
||||
get
|
||||
{
|
||||
if (s_cachedIcon == null)
|
||||
{
|
||||
s_cachedIcon = EditorGUIUtility.IconContent("d_BillboardRenderer Icon", "|vrm-1.0 LookAt");
|
||||
}
|
||||
return s_cachedIcon;
|
||||
}
|
||||
}
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
EditorTools.activeToolChanged += ActiveToolDidChange;
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
{
|
||||
EditorTools.activeToolChanged -= ActiveToolDidChange;
|
||||
}
|
||||
|
||||
void ActiveToolDidChange()
|
||||
{
|
||||
if (!EditorTools.IsActiveTool(this))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnToolGUI(EditorWindow window)
|
||||
{
|
||||
var root = Selection.activeTransform.GetComponent<VRM10Controller>();
|
||||
if (root == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!root.DrawLookAtGizmo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var humanoid = root.GetComponent<UniHumanoid.Humanoid>();
|
||||
var head = humanoid.Head;
|
||||
if (head == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
EditorGUI.BeginChangeCheck();
|
||||
|
||||
var worldOffset = head.localToWorldMatrix.MultiplyPoint(root.Vrm.LookAt.OffsetFromHead);
|
||||
worldOffset = Handles.PositionHandle(worldOffset, head.rotation);
|
||||
|
||||
Handles.DrawDottedLine(head.position, worldOffset, 5);
|
||||
Handles.SphereHandleCap(0, head.position, Quaternion.identity, 0.02f, Event.current.type);
|
||||
Handles.SphereHandleCap(0, worldOffset, Quaternion.identity, 0.02f, Event.current.type);
|
||||
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
Undo.RecordObject(root.Vrm, "LookAt.OffsetFromHead");
|
||||
|
||||
root.Vrm.LookAt.OffsetFromHead = head.worldToLocalMatrix.MultiplyPoint(worldOffset);
|
||||
}
|
||||
}
|
||||
|
||||
if (Application.isPlaying)
|
||||
{
|
||||
OnSceneGUILookAt(root.Vrm.LookAt, head, root.LookAtTargetType, root.Gaze);
|
||||
}
|
||||
else
|
||||
{
|
||||
// offset
|
||||
var p = root.Vrm.LookAt.OffsetFromHead;
|
||||
Handles.Label(head.position, $"fromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]");
|
||||
}
|
||||
}
|
||||
|
||||
#region Gizmo
|
||||
static void DrawMatrix(Matrix4x4 m, float size)
|
||||
{
|
||||
Gizmos.matrix = m;
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(Vector3.zero, Vector3.right * size);
|
||||
Gizmos.color = Color.green;
|
||||
Gizmos.DrawLine(Vector3.zero, Vector3.up * size);
|
||||
Gizmos.color = Color.blue;
|
||||
Gizmos.DrawLine(Vector3.zero, Vector3.forward * size);
|
||||
}
|
||||
|
||||
const float LOOKAT_GIZMO_SIZE = 0.5f;
|
||||
|
||||
// private void OnDrawGizmos()
|
||||
// {
|
||||
// if (DrawGizmo)
|
||||
// {
|
||||
// if (m_leftEye != null & m_rightEye != null)
|
||||
// {
|
||||
// DrawMatrix(m_leftEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE);
|
||||
// DrawMatrix(m_rightEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
#endregion
|
||||
|
||||
const float RADIUS = 0.5f;
|
||||
|
||||
static void OnSceneGUILookAt(VRM10ObjectLookAt lookAt, Transform head, VRM10ObjectLookAt.LookAtTargetTypes lookAtTargetType, Transform gaze)
|
||||
{
|
||||
if (head == null) return;
|
||||
|
||||
if (gaze != null)
|
||||
{
|
||||
{
|
||||
EditorGUI.BeginChangeCheck();
|
||||
var newTargetPosition = Handles.PositionHandle(gaze.position, Quaternion.identity);
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
Undo.RecordObject(gaze, "Change Look At Target Position");
|
||||
gaze.position = newTargetPosition;
|
||||
}
|
||||
}
|
||||
|
||||
Handles.color = new Color(1, 1, 1, 0.6f);
|
||||
Handles.DrawDottedLine(lookAt.GetLookAtOrigin(head).position, gaze.position, 4.0f);
|
||||
}
|
||||
|
||||
var (yaw, pitch) = lookAt.GetLookAtYawPitch(head, lookAtTargetType, gaze);
|
||||
var lookAtOriginMatrix = lookAt.GetLookAtOrigin(head).localToWorldMatrix;
|
||||
Handles.matrix = lookAtOriginMatrix;
|
||||
var p = lookAt.OffsetFromHead;
|
||||
Handles.Label(Vector3.zero,
|
||||
$"FromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]\nYaw: {yaw:0.}degree\nPitch: {pitch:0.}degree");
|
||||
|
||||
Handles.color = new Color(0, 1, 0, 0.2f);
|
||||
Handles.DrawSolidArc(Vector3.zero,
|
||||
Matrix4x4.identity.GetColumn(1),
|
||||
Matrix4x4.identity.GetColumn(2),
|
||||
yaw,
|
||||
RADIUS);
|
||||
|
||||
|
||||
var yawQ = Quaternion.AngleAxis(yaw, Vector3.up);
|
||||
var yawMatrix = default(Matrix4x4);
|
||||
yawMatrix.SetTRS(Vector3.zero, yawQ, Vector3.one);
|
||||
|
||||
Handles.matrix = lookAtOriginMatrix * yawMatrix;
|
||||
Handles.color = new Color(1, 0, 0, 0.2f);
|
||||
Handles.DrawSolidArc(Vector3.zero,
|
||||
Matrix4x4.identity.GetColumn(0),
|
||||
Matrix4x4.identity.GetColumn(2),
|
||||
-pitch,
|
||||
RADIUS);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0f9ee1d04c43d8048a51e032b19a8ebd
|
||||
guid: a780c0aef1cdb9a4895e352e39ad40b9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -6,7 +6,8 @@
|
||||
"GUID:5f875fdc81c40184c8333b9d63c6ddd5",
|
||||
"GUID:8d76e605759c3f64a957d63ef96ada7c",
|
||||
"GUID:da3e51d19d51a544fa14d43fee843098",
|
||||
"GUID:7da8a75dcade2144aab699032d7d7987"
|
||||
"GUID:7da8a75dcade2144aab699032d7d7987",
|
||||
"GUID:b7aa47b240b57de44a4b2021c143c9bf"
|
||||
],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace UniVRM10
|
||||
#region LookAtTargetTypes.CalcYawPitchToGaze
|
||||
// 座標計算用のempty
|
||||
Transform m_lookAtOrigin;
|
||||
Transform GetLookAtOrigin(Transform head)
|
||||
public Transform GetLookAtOrigin(Transform head)
|
||||
{
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
@@ -94,7 +94,7 @@ namespace UniVRM10
|
||||
/// LookAtTargetType に応じた yaw, pitch を得る
|
||||
/// </summary>
|
||||
/// <returns>Headボーンのforwardに対するyaw角(度), pitch角(度)</returns>
|
||||
private (float, float) GetLookAtYawPitch(Transform head, LookAtTargetTypes lookAtTargetType, Transform gaze)
|
||||
public (float, float) GetLookAtYawPitch(Transform head, LookAtTargetTypes lookAtTargetType, Transform gaze)
|
||||
{
|
||||
switch (lookAtTargetType)
|
||||
{
|
||||
@@ -145,85 +145,5 @@ namespace UniVRM10
|
||||
var (yaw, pitch) = GetLookAtYawPitch(m_head, lookAtTargetType, gaze);
|
||||
EyeDirection = new LookAtEyeDirection(yaw, pitch, 0, 0);
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
#region Gizmo
|
||||
static void DrawMatrix(Matrix4x4 m, float size)
|
||||
{
|
||||
Gizmos.matrix = m;
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(Vector3.zero, Vector3.right * size);
|
||||
Gizmos.color = Color.green;
|
||||
Gizmos.DrawLine(Vector3.zero, Vector3.up * size);
|
||||
Gizmos.color = Color.blue;
|
||||
Gizmos.DrawLine(Vector3.zero, Vector3.forward * size);
|
||||
}
|
||||
|
||||
const float LOOKAT_GIZMO_SIZE = 0.5f;
|
||||
|
||||
// private void OnDrawGizmos()
|
||||
// {
|
||||
// if (DrawGizmo)
|
||||
// {
|
||||
// if (m_leftEye != null & m_rightEye != null)
|
||||
// {
|
||||
// DrawMatrix(m_leftEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE);
|
||||
// DrawMatrix(m_rightEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
#endregion
|
||||
|
||||
const float RADIUS = 0.5f;
|
||||
|
||||
public void OnSceneGUILookAt(Transform head, LookAtTargetTypes lookAtTargetType, Transform gaze)
|
||||
{
|
||||
if (head == null) return;
|
||||
|
||||
if (gaze != null)
|
||||
{
|
||||
{
|
||||
EditorGUI.BeginChangeCheck();
|
||||
var newTargetPosition = Handles.PositionHandle(gaze.position, Quaternion.identity);
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
Undo.RecordObject(gaze, "Change Look At Target Position");
|
||||
gaze.position = newTargetPosition;
|
||||
}
|
||||
}
|
||||
|
||||
Handles.color = new Color(1, 1, 1, 0.6f);
|
||||
Handles.DrawDottedLine(GetLookAtOrigin(head).position, gaze.position, 4.0f);
|
||||
}
|
||||
|
||||
var (yaw, pitch) = GetLookAtYawPitch(head, lookAtTargetType, gaze);
|
||||
var lookAtOriginMatrix = GetLookAtOrigin(head).localToWorldMatrix;
|
||||
Handles.matrix = lookAtOriginMatrix;
|
||||
var p = OffsetFromHead;
|
||||
Handles.Label(Vector3.zero,
|
||||
$"FromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]\nYaw: {yaw:0.}degree\nPitch: {pitch:0.}degree");
|
||||
|
||||
Handles.color = new Color(0, 1, 0, 0.2f);
|
||||
Handles.DrawSolidArc(Vector3.zero,
|
||||
Matrix4x4.identity.GetColumn(1),
|
||||
Matrix4x4.identity.GetColumn(2),
|
||||
yaw,
|
||||
RADIUS);
|
||||
|
||||
|
||||
var yawQ = Quaternion.AngleAxis(yaw, Vector3.up);
|
||||
var yawMatrix = default(Matrix4x4);
|
||||
yawMatrix.SetTRS(Vector3.zero, yawQ, Vector3.one);
|
||||
|
||||
Handles.matrix = lookAtOriginMatrix * yawMatrix;
|
||||
Handles.color = new Color(1, 0, 0, 0.2f);
|
||||
Handles.DrawSolidArc(Vector3.zero,
|
||||
Matrix4x4.identity.GetColumn(0),
|
||||
Matrix4x4.identity.GetColumn(2),
|
||||
-pitch,
|
||||
RADIUS);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user