AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

HSV変換

SetPixelをやってみたので、せめて髪の色でも変えるのに使ってみよう。
強制的に赤とかにすると、テクスチャ側に陰影があった場合も無視してしまうので、HSV変換してやってみたい。
HSV変換はUnity標準ではないみたいで(UnityEditorにはある模様)

変換してみましたが、黒髪の場合、彩度や明度が元々低いので色調だけ変えても変化しないですね。
赤髪、金髪なら、色調変えるだけで変わりますが。
黒髪の場合は、SとVをブーストしてやる必要がある。

もっともtoon/basicシェーダーはMainColorを指定できるので、わざわざピクセルを変更しないでも、任意の色のフィルターをかけられるので、肌の色でも髪の色でも変化させられる。
ただ、色をかぶせるだけなので、服の特定色を変えようと思ったら使いにくいので、ピクセル変換する意味はあると思う。


blog.narumium.net
SetPixelにはこういう使い方もあるのね



RGBとHSVの相互変換[色見本/サンプル付き]
上記を参考にコードを書いていくつかの色で確認した。

HSVはVector3で代用した。
値の範囲は、
HSV
色相 H 0~360
彩度 S 0~100
明度 V 0~100
となってます。


使い方

Vector3 HSV = RGBtoHSV( Color.red );
Color c = HSVtoRGB( HSV );
    Vector3 RGBtoHSV(Color c)
    {
        float r = c.r;
        float g = c.g;
        float b = c.b;

        float max = Mathf.Max(r, g, b);
        float min = Mathf.Min(r, g, b);

        float h = 0;
        float s = 0;
        float v = max;

        if (max != min)
        {
            if (r == max)      h = 60 * (g-b) / (max - min);
            else if (g == max) h = 60 * (b-r) / (max - min) + 120;
            else               h = 60 * (r-g) / (max - min) + 240;
            s = (max - min) / max;
        }
        if (h < 0) h += 360;

        return new Vector3(h, s*100, v*100);
    }
    Color HSVtoRGB(Vector3 hsv)
    {
        float h = hsv.x;
        float s = hsv.y;
        float v = hsv.z;
        Color c = new Color();

        if (s > 100) s = 100;
        if (v > 100) s = 100;
        if (s <0) s = 0;
        if (v <0) s = 0;

        if (h == 360) h = 0;
        s = s / 100;
        v = v / 100;

        if(s==0)
            c.r = c.g = c.b = v;
        else
        {
            int dh = (int)Mathf.Floor(h / 60);
            float p = v * (1 - s);
            float q = v * (1 - s * (h / 60 - dh));
            float t = v * (1 - s * (1-(h/60-dh)));

            if (dh == 0) { c.r = v; c.g = t; c.b = p; }
            if (dh == 1) { c.r = q; c.g = v; c.b = p; }
            if (dh == 2) { c.r = p; c.g = v; c.b = t; }
            if (dh == 3) { c.r = p; c.g = q; c.b = v; }
            if (dh == 4) { c.r = t; c.g = p; c.b = v; }
            if (dh == 5) { c.r = v; c.g = p; c.b = q; }
        }

        return c;
    }