diff --git a/AgentScripts/WL814v_Capture.cs b/AgentScripts/WL814v_Capture.cs index 3e73a741f..41d42b9fe 100644 --- a/AgentScripts/WL814v_Capture.cs +++ b/AgentScripts/WL814v_Capture.cs @@ -294,5 +294,74 @@ public static class WL814v_Capture } } + + // ── 올리브 해결 확인: 814u 시제품 vs 이번 안, 화면에서 직접 비교 ── + public static void Olive() + { + try { OliveBody(); } + catch (Exception e) { L("EXCEPTION " + e); } + finally { File.WriteAllText("AgentScripts/WL814v_OLIVE.txt", sb.ToString(), new UTF8Encoding(true)); } + } + static void OliveBody() + { + EditorSceneManager.OpenScene(SCENE, OpenSceneMode.Single); + GameObject root = null; + foreach (var go in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()) + if (go.name.Contains("LH_M05")) { root = go; break; } + var smrs = root.GetComponentsInChildren(true).Where(r => r.enabled).ToArray(); + var hairSMR = smrs.First(r => r.name == "Hair05"); + var scam = Camera.main ?? UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None).First(c => c.orthographic); + root.transform.rotation = Quaternion.Euler(0, scam.transform.eulerAngles.y + 180f, 0); + var all = root.GetComponentsInChildren(true); + var origLayer = new Dictionary(); foreach (var t in all) { origLayer[t] = t.gameObject.layer; t.gameObject.layer = LAYER; } + var b = new Bounds(root.transform.position, Vector3.zero); foreach (var r in smrs) b.Encapsulate(r.bounds); + var go2 = new GameObject("WL814v_Olive"); + cam = go2.AddComponent(); cam.CopyFrom(scam); + cam.orthographic = true; cam.orthographicSize = 10f; cam.aspect = (float)W / H; cam.targetTexture = null; cam.cullingMask = 1 << LAYER; + cam.transform.SetPositionAndRotation(b.center - scam.transform.forward * 50f, scam.transform.rotation); + var ucd = cam.GetUniversalAdditionalCameraData(); if (ucd != null) { ucd.renderPostProcessing = false; ucd.SetRenderer(0); } + for (int i = 0; i < 3; i++) Render(Color.black); + var hairOrig = hairSMR.sharedMaterial; + try + { + int cH; RectInt bbH; var mHair = MaskOf(smrs, new[] { hairSMR }, out cH, out bbH); + L(""); L("== 🔴 올리브 해결 확인 (머리칼 " + cH + " px · 같은 프레임·포즈) =="); + var shots = new List(); var names = new List { "원본", "814u 시제품", "814v V1", "814v V2", "814v V3", "814v V4" }; + var files = new List { null, "Hair05_Pixel", "Hair05_V1", "Hair05_V2", "Hair05_V3", "Hair05_V4" }; + float h0 = 0; + for (int k = 0; k < files.Count; k++) + { + if (files[k] != null) + { + var tx = AssetDatabase.LoadAssetAtPath(TEX + files[k] + ".png"); + var hm = new Material(hairOrig) { name = "TMP_" + files[k] }; + foreach (var pn in new[] { "_MainTex", "_BaseMap", "_ShadowBaseMap" }) if (hm.HasProperty(pn)) hm.SetTexture(pn, tx); + hairSMR.sharedMaterial = hm; + } + var s = Render(new Color(0.10f, 0.10f, 0.12f)); shots.Add(s); + var hs = new List(); var ws = new List(); int olive = 0, oliveS = 0, n = 0; + for (int i = 0; i < mHair.Length; i++) + { + if (!mHair[i]) continue; + float h, sa, v; Hsv(s.px[i], out h, out sa, out v); + n++; + if (sa > 0.08f) { hs.Add(h); ws.Add(sa); if (h >= 45f && h <= 110f) { olive++; if (sa > 0.25f && v < 210f) oliveS++; } } + } + float hm2 = CMeanHue(hs, ws); if (k == 0) h0 = hm2; + L(string.Format(" {0,-12} Hue {1,5:F1}° · ΔHue {2,6:+0.0;-0.0;0.0}° · 🔴 짙은 올리브(H45~110°·S>0.25·V<210) {3,4} px = {4,5:F1} % · (넓은 기준 H45~110° {5,5:F1} %)", + names[k], hm2, Mathf.DeltaAngle(h0, hm2), oliveS, 100f * oliveS / Mathf.Max(n, 1), 100f * olive / Mathf.Max(n, 1))); + hairSMR.sharedMaterial = hairOrig; + } + var crop = new RectInt(bbH.x - 3, bbH.y - 3, bbH.width + 6, bbH.height + 6); + Save(HStack(shots.Select(s => Crop(s, crop, 4)).ToList(), 8), "v_olive_fix.png"); + } + finally + { + hairSMR.sharedMaterial = hairOrig; + foreach (var kv in origLayer) if (kv.Key != null) kv.Key.gameObject.layer = kv.Value; + UnityEngine.Object.DestroyImmediate(go2); + } + } + public static string BEST_FACE = "V1", BEST_HAIR = "V1"; } diff --git a/AgentScripts/WL814v_OLIVE.txt b/AgentScripts/WL814v_OLIVE.txt new file mode 100644 index 000000000..1af669c65 --- /dev/null +++ b/AgentScripts/WL814v_OLIVE.txt @@ -0,0 +1,9 @@ + +== 🔴 올리브 해결 확인 (머리칼 1154 px · 같은 프레임·포즈) == + 원본 Hue 39.2° · ΔHue 0.0° · 🔴 짙은 올리브(H45~110°·S>0.25·V<210) 47 px = 4.1 % · (넓은 기준 H45~110° 30.4 %) + 814u 시제품 Hue 41.0° · ΔHue +1.8° · 🔴 짙은 올리브(H45~110°·S>0.25·V<210) 381 px = 33.0 % · (넓은 기준 H45~110° 39.7 %) + 814v V1 Hue 36.0° · ΔHue -3.2° · 🔴 짙은 올리브(H45~110°·S>0.25·V<210) 0 px = 0.0 % · (넓은 기준 H45~110° 0.0 %) + 814v V2 Hue 35.8° · ΔHue -3.4° · 🔴 짙은 올리브(H45~110°·S>0.25·V<210) 0 px = 0.0 % · (넓은 기준 H45~110° 0.0 %) + 814v V3 Hue 30.3° · ΔHue -8.9° · 🔴 짙은 올리브(H45~110°·S>0.25·V<210) 0 px = 0.0 % · (넓은 기준 H45~110° 0.0 %) + 814v V4 Hue 33.4° · ΔHue -5.8° · 🔴 짙은 올리브(H45~110°·S>0.25·V<210) 0 px = 0.0 % · (넓은 기준 H45~110° 0.0 %) + saved Screenshots_WL/WL814v/v_olive_fix.png (1168×176)