Bagaimana Mewarnai. Lerp di antara beberapa warna?


12

Saya merasa agak sulit untuk menemukan solusi untuk ini dalam dokumen Unity.

Color.Lerp(Color a, Color b, float t) adalah fungsi yang secara bertahap mengubah warna berdasarkan langkah t, memberikannya nilai akhir Warna b.

Bagaimana cara Lerp antara beberapa warna satu demi satu?

Jawaban:


13

Biarkan _warna menjadi array warna, biarkan PANJANG menjadi jumlah warna dalam array, jadi t menjadi nilai float 0..1

float scaledTime = t * (float) (LENGHT - 1);
Color oldColor = _colors[(int) scaledTime];
Color newColor = _colors[(int) (scaledTime + 1f)];
float newT = scaledTime - Mathf.Round(scaledTime); 

akhirnya kamu bisa menggunakan Lerp

Color.Lerp(oldColor, newColor, newT)

+1 - jawaban yang bagus - tidak memerlukan perulangan atau cabang khusus, dan sepenuhnya umum untuk warna N.
jpaver

Ketika nilai 1 dipukul, apakah warna akan menjadi warna terakhir dalam array?
G3tinmybelly

G3tinmybelly kamu benar. T == 1 tidak dikelola dengan benar. Jadi kita dapat menambahkan sebelum: jika (t == 1) mengembalikan Arr [N-1]
dnk drone.vs.drones

10

Salah satu pendekatan yang dapat diambil dengan berbagai transisi warna adalah dengan memanfaatkan Gradient .

Dengan memaparkan variabel publik dari jenis ini, pengembang menggunakan Inspektur untuk meluncurkan Gradient Editor untuk merancang gradien yang mengandung sejumlah warna. Editor ini memungkinkan Anda untuk menggunakan color pickers unity, penempatan fine tune warna / alpha dan menyimpan / memuat gradien.

masukkan deskripsi gambar di sini

Setelah dirancang Gradient.Evaluate()metode akan menerima pelampung di kisaran 0-1 untuk mengembalikan warna yang sesuai.

using UnityEngine;

public class GradientTest : MonoBehaviour
{
    public Gradient myGradient;
    public float strobeDuration = 2f;

    public void Update() {
        float t = Mathf.PingPong(Time.time / strobeDuration, 1f);
        Camera.main.backgroundColor = myGradient.Evaluate(t);
    }
}

Sayangnya API untuk pemrograman Gradient secara pemrograman tidak elegan .


1
ColorBands dapat digunakan untuk tujuan yang sama tetapi dengan lebih banyak kebebasan atas warna
SteakOverflow

1
public float every;   //The public variable "every" refers to "Lerp the color every X"
float colorstep;
Color[] colors = new Color[4]; //Insert how many colors you want to lerp between here, hard coded to 4
int i;
Color lerpedColor = Color.red;  //This should optimally be the color you are going to begin with

void Start () {

    //In here, set the array colors you are going to use, optimally, repeat the first color in the end to keep transitions smooth

    colors [0] = Color.red;
    colors [1] = Color.yellow;    
    colors [2] = Color.cyan;
    colors [3] = Color.red;

}


// Update is called once per frame
void Update () {

    if (colorstep < every) { //As long as the step is less than "every"
        lerpedColor = Color.Lerp (colors[i], colors[i+1], colorstep);
        this.GetComponent<Camera> ().backgroundColor = lerpedColor;
        colorstep +=0.025f;  //The lower this is, the smoother the transition, set it yourself
    } else { //Once the step equals the time we want to wait for the color, increment to lerp to the next color

        colorstep = 0;

        if (i < (colors.Length - 2)){ //Keep incrementing until i + 1 equals the Lengh
        i++;
        }
        else { //and then reset to zero
            i=0;
        }
    }
}

Jadi ini adalah kode yang akhirnya saya gunakan untuk lerp antara tiga warna milik saya, saya harap saya akan berguna bagi siapa saja yang memutuskan untuk mencari ini.


0

Saya merasa mungkin ada solusi yang lebih baik. Satu-satunya alasan saya akan melihat lerp dari warna ke warna adalah jika Anda ingin terus mengubah rona ... http://en.wikipedia.org/wiki/Hue

Berikut cara mengonversi HSV ke RGB: http://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV

Dengan ini, Anda dapat menggunakan warna HSV, cukup ganti rona, lalu konversikan ke RGB. Selain itu, dengan Color.Lerp, Anda memiliki masalah ketidakkonsistenan. Jika Anda lerp dari oranye ke kuning, lalu ke hijau, Anda akan menemukan bahwa warna mulai menjadi sangat cepat kuning kemudian mulai melambat ketika mendekati kuning, kemudian mempercepat lagi setelah melewati kuning dan pergi ke hijau. Jadi itu akan memperlambat perubahan warna di setiap titik yang Anda lerping. Saya pikir mengubah rona akan jauh lebih efektif - dan dalam jangka panjang, akan memberikan efek yang lebih baik. :)


0

Bagaimana kalau Anda menulis versi Anda sendiri, yang memanfaatkan Color.Lerp()?

Versi yang sangat sederhana yang mengambil 3 warna, dan menempatkan yang kedua tepat di tengah bisa terlihat seperti ini:

Color Lerp3(Color a, Color b, Color c, float t)
{
    if (t < 0.5f) // 0.0 to 0.5 goes to a -> b
        return Color.Lerp(a, b, t / 0.5f);
    else // 0.5 to 1.0 goes to b -> c
        return Color.Lerp(b, c, (t - 0.5f) / 0.5f);
}

0

Karena Anda tidak mengatakan apa yang ingin Anda ubah warna, saya akan memberikan contoh samar dengan warna yang dibuat pada metode.

Intinya adalah memiliki koleksi warna, dan durasi total (seperti pada contoh saya akan berikan) atau durasi antara masing-masing (terserah Anda).

Saya pribadi tidak menginterpolasi hal-hal di Pembaruan yang saya tahu saya tidak akan terus-menerus melakukan interpolasi (Kamera menjadi pengecualian), jadi saya menggunakan coroutine untuk mengatasinya.

Pada contoh ini saya membagi durasi yang diberikan pada inspektur dengan jumlah warna, dan kemudian I Lerp warna iterator yang sebenarnya ke warna iterator berikutnya, dan durasinya akan dari durasi yang sebelumnya disambung. Berikut ini contohnya:

public class ColorLerping : MonoBehaviour
{
    public Color sampleColor; /// Just for debugging purposes.
    public float lerpDuration;
    public Color[] colors;

    void Awake()
    {
        StartCoroutine(LerpColors());
    }

    private IEnumerator LerpColors()
    {
        if(colors.Length > 0)
        {
            /// Split the time between the color quantities.
            float dividedDuration = lerpDuration / colors.Lenght;

            for(int i = 0; i < colors.Length - 1; i++)
            {
                float t = 0.0f;

                while(t < (1.0f + Mathf.Epsilon))
                {
                    sampleColor = Color.Lerp(colors[i], colors[i + 1], t);
                    t += Time.deltaTime / dividedDuration;
                    yield return null;
                }

                // Since it is posible that t does not reach 1.0, force it at the end.
                sampleColor = Color.Lerp(colors[i], colors[i + 1], 1.0f);
            }

        }
        else yield return null; /// Do nothing if there are no colors.
    }
}

Semoga ini bisa membantu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.