FaceCameraTarget

This commit is contained in:
ousttrue
2025-03-26 16:09:32 +09:00
parent 09b14ad9a8
commit 2ca1c22e9f
7 changed files with 66 additions and 31 deletions

View File

@@ -7,7 +7,7 @@ using UniVRM10;
public class EmotionElement : VisualElement
{
Slider _slider;
Toggle _toggle;
Toggle m_binary;
DropdownField _overrideMouth;
DropdownField _overrideBlink;
DropdownField _overrideLookat;
@@ -21,8 +21,8 @@ public class EmotionElement : VisualElement
{
_slider = this.Q<Slider>("Slider");
Debug.Assert(_slider != null);
_toggle = this.Q<Toggle>("Toggle");
Debug.Assert(_toggle != null);
m_binary = this.Q<Toggle>("Toggle");
Debug.Assert(m_binary != null);
_overrideMouth = this.Q<DropdownField>("OverrideMouth");
Debug.Assert(_overrideMouth != null);
_overrideBlink = this.Q<DropdownField>("OverrideBlink");
@@ -53,7 +53,7 @@ public class EmotionElement : VisualElement
public void ApplyRuntime(VRM10Expression expression)
{
expression.IsBinary = _toggle.value;
expression.IsBinary = m_binary.value;
if (m_useOverride)
{
expression.OverrideMouth = ToOverrideType(_overrideMouth.index);
@@ -62,6 +62,28 @@ public class EmotionElement : VisualElement
}
}
static int GetOverrideIndex(UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType value)
{
switch (value)
{
case UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.none: return 0;
case UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.block: return 1;
case UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.blend: return 2;
default: return -1;
}
}
public void OnLoad(VRM10Expression expression)
{
m_binary.value = expression.IsBinary;
if (m_useOverride)
{
_overrideMouth.index = GetOverrideIndex(expression.OverrideMouth);
_overrideBlink.index = GetOverrideIndex(expression.OverrideBlink);
_overrideLookat.index = GetOverrideIndex(expression.OverrideLookAt);
}
}
public new class UxmlFactory : UxmlFactory<EmotionElement, UxmlTraits> { }
public new class UxmlTraits : VisualElement.UxmlTraits

View File

@@ -32,6 +32,11 @@ public class ExpressionElement : VisualElement
expression.IsBinary = _toggle.value;
}
public void OnLoad(VRM10Expression expression)
{
_toggle.value = expression.IsBinary;
}
public new class UxmlFactory : UxmlFactory<ExpressionElement, UxmlTraits> { }
public new class UxmlTraits : VisualElement.UxmlTraits

View File

@@ -62,8 +62,8 @@
</ui:Instance>
<ui:Label tabindex="-1" text="LookAt" parse-escape-sequences="true" display-tooltip-when-elided="true" name="__LookAt__" style="-unity-font-style: bold; -unity-text-align: upper-center;" />
<ui:Toggle label="Lookat Target" name="LookatTarget" value="true" style="flex-direction: row-reverse;" />
<ui:Slider label="Yaw" high-value="100" name="Yaw" />
<ui:Slider label="Pitch" high-value="100" name="Pitch" />
<ui:Slider label="Yaw" high-value="180" name="Yaw" low-value="-180" />
<ui:Slider label="Pitch" high-value="90" name="Pitch" low-value="-90" />
</ui:VisualElement>
<ui:VisualElement style="flex-grow: 1;" />
<ui:Instance template="MetaView" name="Meta" style="background-color: rgba(255, 255, 255, 0.39);" />

View File

@@ -14,9 +14,9 @@
<ui:TextField picking-mode="Ignore" label="Violent" value="filler text" focusable="false" readonly="true" name="PermissionViolent" />
<ui:TextField picking-mode="Ignore" label="Sexual" value="filler text" focusable="false" readonly="true" name="PermissionSexual" />
<ui:TextField picking-mode="Ignore" label="Commercial" value="filler text" focusable="false" readonly="true" name="PermissionCommercial" />
<ui:Label tabindex="-1" text="Redistribution" parse-escape-sequences="true" display-tooltip-when-elided="true" style="-unity-font-style: bold; -unity-text-align: upper-center;" />
<ui:TextField picking-mode="Ignore" label="License" value="filler text" focusable="false" readonly="true" name="MetaLicense" />
<ui:TextField picking-mode="Ignore" label="Distribution" value="filler text" focusable="false" readonly="true" name="MetaDistribution" />
<TextureElement name="FaceCameraTarget" style="width: 200px; height: 200px; flex-shrink: 0; align-self: center;" />
</MetaView>
</ui:VisualElement>
</ui:UXML>

View File

@@ -131,6 +131,7 @@ namespace UniVRM10.VRM10Viewer
QueryOrAssert(out m_metaPermissionCommercial, root, "PermissionCommercial");
QueryOrAssert(out m_metaLicense, root, "MetaLicense");
QueryOrAssert(out m_metaDistribution, root, "MetaDistribution");
root.Q<TextureElement>("FaceCameraTarget").style.backgroundImage = new StyleBackground(Background.FromRenderTexture(m_controller.m_faceCameraTarget));
m_autoEmotion = gameObject.AddComponent<VRM10AutoExpression>();
m_autoBlink = gameObject.AddComponent<VRM10Blinker>();
@@ -258,20 +259,20 @@ namespace UniVRM10.VRM10Viewer
}
else
{
// vrm.Runtime.LookAt.SetYawPitchManually(m_yaw.value, m_pitch.value);
vrm.Runtime.LookAt.SetYawPitchManually(m_yaw.value, m_pitch.value);
}
// if (vrm.TryGetBoneTransform(HumanBodyBones.Head, out var head))
// {
// var initLocarlRotation = vrm.DefaultTransformStates[head].LocalRotation;
// var r = head.rotation * Quaternion.Inverse(initLocarlRotation);
// var pos = head.position
// + (r * Vector3.forward * 0.7f)
// + (r * Vector3.up * 0.07f)
// ;
// m_faceCamera.position = pos;
// m_faceCamera.rotation = r;
// }
if (vrm.TryGetBoneTransform(HumanBodyBones.Head, out var head))
{
var initLocarlRotation = vrm.DefaultTransformStates[head].LocalRotation;
var r = head.rotation * Quaternion.Inverse(initLocarlRotation);
var pos = head.position
+ (r * Vector3.forward * 0.7f)
+ (r * Vector3.up * 0.07f)
;
m_controller.m_faceCamera.position = pos;
m_controller.m_faceCamera.rotation = r;
}
}
}
@@ -289,17 +290,17 @@ namespace UniVRM10.VRM10Viewer
void OnLoaded(Loaded loaded)
{
m_showBoxMan.value = false;
// m_happy.OnLoad(loaded.Instance.Vrm.Expression.Happy);
// m_angry.OnLoad(loaded.Instance.Vrm.Expression.Angry);
// m_sad.OnLoad(loaded.Instance.Vrm.Expression.Sad);
// m_relaxed.OnLoad(loaded.Instance.Vrm.Expression.Relaxed);
// m_surprised.OnLoad(loaded.Instance.Vrm.Expression.Surprised);
// m_lipAa.OnLoad(loaded.Instance.Vrm.Expression.Aa);
// m_lipIh.OnLoad(loaded.Instance.Vrm.Expression.Ih);
// m_lipOu.OnLoad(loaded.Instance.Vrm.Expression.Ou);
// m_lipEe.OnLoad(loaded.Instance.Vrm.Expression.Ee);
// m_lipOh.OnLoad(loaded.Instance.Vrm.Expression.Oh);
// m_blink.OnLoad(loaded.Instance.Vrm.Expression.Blink);
m_happy.OnLoad(loaded.Instance.Vrm.Expression.Happy);
m_angry.OnLoad(loaded.Instance.Vrm.Expression.Angry);
m_sad.OnLoad(loaded.Instance.Vrm.Expression.Sad);
m_relaxed.OnLoad(loaded.Instance.Vrm.Expression.Relaxed);
m_surprised.OnLoad(loaded.Instance.Vrm.Expression.Surprised);
m_lipAa.OnLoad(loaded.Instance.Vrm.Expression.Aa);
m_lipIh.OnLoad(loaded.Instance.Vrm.Expression.Ih);
m_lipOu.OnLoad(loaded.Instance.Vrm.Expression.Ou);
m_lipEe.OnLoad(loaded.Instance.Vrm.Expression.Ee);
m_lipOh.OnLoad(loaded.Instance.Vrm.Expression.Oh);
m_blink.OnLoad(loaded.Instance.Vrm.Expression.Blink);
}
public void UpdateMeta(Texture2D thumbnail, UniGLTF.Extensions.VRMC_vrm.Meta meta, Migration.Vrm0Meta meta0)

View File

@@ -4054,7 +4054,9 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_controller:
m_motion: {fileID: 4900000, guid: 08df5151e71aed748b13547492fb8b9a, type: 3}
m_faceCamera: {fileID: 1832097581}
m_faceCameraTarget: {fileID: 8600000, guid: 30519662c19bd4842a70b1f1ea87a8be,
type: 2}
m_faceCamera: {fileID: 1150163685}
m_lookAtTarget: {fileID: 802105000}
m_pbrOpaqueMaterial: {fileID: -876546973899608171, guid: ac58f8c11a130e04ba883a82ae4b78e4,
type: 3}
@@ -30956,6 +30958,8 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_controller:
m_motion: {fileID: 4900000, guid: 08df5151e71aed748b13547492fb8b9a, type: 3}
m_faceCameraTarget: {fileID: 8600000, guid: 30519662c19bd4842a70b1f1ea87a8be,
type: 2}
m_faceCamera: {fileID: 1832097581}
m_lookAtTarget: {fileID: 802105000}
m_pbrOpaqueMaterial: {fileID: -876546973899608171, guid: ac58f8c11a130e04ba883a82ae4b78e4,

View File

@@ -19,6 +19,9 @@ namespace UniVRM10.VRM10Viewer
[SerializeField]
TextAsset m_motion;
[SerializeField]
public RenderTexture m_faceCameraTarget = default;
[SerializeField]
public Transform m_faceCamera = default;
[SerializeField]