วิธีการ Color.Lerp ระหว่างหลายสี?


12

ฉันพบว่ามันค่อนข้างยากที่จะหาทางแก้ไขในเอกสาร Unity

Color.Lerp(Color a, Color b, float t) เป็นฟังก์ชั่นที่ค่อยๆเปลี่ยนสีตามขั้นตอน t โดยให้ค่าสุดท้ายของ Color b

ฉันจะ Lerp ระหว่างสีหลายสีทีละคน?

คำตอบ:


13

ให้_colorsเป็นอาร์เรย์ของสีที่ให้ความยาวเป็นจำนวนสีในอาร์เรย์ให้เสื้อเป็นค่า 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); 

ในที่สุดคุณสามารถใช้ Lerp

Color.Lerp(oldColor, newColor, newT)

+1 - คำตอบที่ยอดเยี่ยม - ไม่ต้องการการวนซ้ำหรือกิ่งก้านพิเศษใด ๆ และเป็นสีทั่วไปสำหรับ N
jpaver

เมื่อมีการตีค่า 1 สีจะเป็นสีสุดท้ายในอาร์เรย์หรือไม่
G3tinmybelly

G3tinmybelly คุณพูดถูก t == 1 มีการจัดการไม่ถูกต้อง ดังนั้นเราอาจจะเพิ่มก่อนหน้านี้: ถ้า (t == 1) ส่งคืน Arr [N-1]
dnk drone.vs.drones

10

วิธีการหนึ่งที่สามารถนำมามีการเปลี่ยนหลายสีคือการยกระดับการไล่โทนสี

ด้วยการเปิดเผยตัวแปรสาธารณะของนักพัฒนาซอฟต์แวร์ประเภทนี้ให้ใช้ตัวตรวจสอบเพื่อเปิดตัวไล่ระดับสีเพื่อออกแบบการไล่ระดับสีที่มีสีจำนวนเท่าใดก็ได้ โปรแกรมแก้ไขนี้ช่วยให้คุณใช้ตัวเลือกสีที่เป็นเอกภาพปรับตำแหน่งของปุ่มสี / ตัวอักษรและบันทึก / โหลดการไล่ระดับสีอย่างละเอียด

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อได้รับการออกแบบGradient.Evaluate()วิธีการจะยอมรับการลอยในช่วง 0-1 เพื่อกลับสีที่เหมาะสม

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);
    }
}

แต่น่าเสียดายที่ API สำหรับโปรแกรมการสร้างการไล่โทนสีไม่เป็นที่สง่างาม


1
ColorBandsสามารถใช้สำหรับเป้าหมายเดียวกัน แต่มีอิสระมากกว่าสี
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;
        }
    }
}

ดังนั้นนี่คือรหัสที่ฉันใช้เพื่อเลียนแบบระหว่างสามสีของฉันฉันหวังว่าฉันจะใช้กับทุกคนที่ตัดสินใจที่จะมองหาสิ่งนี้


0

ฉันรู้สึกว่าอาจมีทางออกที่ดีกว่า เหตุผลเดียวที่ฉันเห็น lerp จากสีเป็นสีคือถ้าคุณต้องการเปลี่ยนสีอย่างต่อเนื่อง ... http://en.wikipedia.org/wiki/Hue

ต่อไปนี้เป็นวิธีแปลง HSV เป็น RGB: http://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV

ด้วยสิ่งนี้คุณสามารถใช้สี HSV เพียงเปลี่ยนเฉดสีจากนั้นแปลงเป็น RGB นอกจากนี้ด้วย Color.Lerp คุณมีปัญหาเรื่องความไม่สอดคล้องกัน หากคุณคลี่จากสีส้มเป็นสีเหลืองจากนั้นเป็นสีเขียวคุณจะพบว่าสีเริ่มเป็นสีเหลืองอย่างรวดเร็วจากนั้นจะเริ่มช้าลงเมื่อใกล้สีเหลืองแล้วเพิ่มความเร็วอีกครั้งเมื่อผ่านสีเหลืองและเป็นสีเขียว ดังนั้นการเปลี่ยนสีจะช้าลงในทุกจุดที่คุณกำลังอ่าน ฉันคิดว่าการเปลี่ยนสีจะมีประสิทธิภาพมากขึ้น - และในระยะยาวจะให้ผลที่ดีกว่า :)


0

คุณเขียนเวอร์ชั่นของคุณเองซึ่งใช้ประโยชน์จากColor.Lerp()อะไร

รุ่นง่ายมากที่ใช้ 3 สีและวางอันที่สองไว้ตรงกลางอาจมีลักษณะเช่นนี้:

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

เนื่องจากคุณไม่ได้พูดในสิ่งที่คุณต้องการเปลี่ยนสีฉันจะให้ตัวอย่างที่คลุมเครือด้วยสีที่สร้างขึ้นในวิธีการ

จุดคือการมีชุดของสีและระยะเวลารวม (เช่นในตัวอย่างที่ฉันจะให้) หรือระยะเวลาระหว่างแต่ละคน (ขึ้นอยู่กับคุณ)

ฉันเองไม่ได้สอดแทรกสิ่งต่าง ๆ ในการอัพเดตที่ฉันรู้ว่าฉันจะไม่ถูกสอดแทรกอย่างต่อเนื่อง (กล้องเป็นข้อยกเว้น) ดังนั้นฉันจึงใช้ coroutines เพื่อจัดการสิ่งนั้น

ในตัวอย่างนี้ฉันแบ่งระยะเวลาที่กำหนดบนตัวตรวจสอบตามปริมาณสีจากนั้นฉันเลียนแบบสีตัววนจริงตามสีตัววนถัดไปและระยะเวลาจะเป็นระยะเวลาก่อนหน้านี้ นี่คือตัวอย่าง:

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.
    }
}

หวังว่ามันจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.