[WL-814v] 올리브 해결 확인 실측(원본/814u/V1~V4 화면 비교) + 캡처 (#814)
- 짙은 올리브 픽셀(H45~110°·S>0.25·V<210): 원본 4.1 % · 814u 33.0 % · 814v 4안 전부 0.0 % - v_olive_fix.png · 머리 크롭 확대 조정 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
cb0e17ee21
commit
f727f9cc98
|
|
@ -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<SkinnedMeshRenderer>(true).Where(r => r.enabled).ToArray();
|
||||
var hairSMR = smrs.First(r => r.name == "Hair05");
|
||||
var scam = Camera.main ?? UnityEngine.Object.FindObjectsByType<Camera>(FindObjectsInactive.Exclude, FindObjectsSortMode.None).First(c => c.orthographic);
|
||||
root.transform.rotation = Quaternion.Euler(0, scam.transform.eulerAngles.y + 180f, 0);
|
||||
var all = root.GetComponentsInChildren<Transform>(true);
|
||||
var origLayer = new Dictionary<Transform, int>(); 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<Camera>(); 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<Shot>(); var names = new List<string> { "원본", "814u 시제품", "814v V1", "814v V2", "814v V3", "814v V4" };
|
||||
var files = new List<string> { 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<Texture2D>(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<float>(); var ws = new List<float>(); 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";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
Loading…
Reference in New Issue