gpt4 book ai didi

c# - Lerp 颜色基于 2 个对象之间的距离

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:03 27 4
gpt4 key购买 nike

我想知道如何根据 2 个对象之间的距离制作平滑的颜色插值。颜色应该从绿色到红色到绿色再到红色......远立方体 = 红色,近立方体 = 绿色。

我已经让一切正常,但唯一认为无效的是颜色不平滑。这就是它现在的样子。 https://i.gyazo.com/a85852e76d2418ab7d44c18e152647c0.mp4

我正在使用这个脚本来改变颜色:

    FindClosestCube ();
float lerpProgress = 0f;
GameObject cubeChildTop = null;
GameObject closestCube = FindClosestCube ();
cubeChildTop = closestCube.transform.Find("Top").gameObject;

if (cubeDiffX >= 0.8f || cubeDiffX <= -0.8f)
{
lerpProgress = 0.5f;
}
if (cubeDiffX <= 0.8f || cubeDiffX <= -0.8f)
{
lerpProgress = 1f;
}
if (cubeDiffX >= 1.6f || cubeDiffX <= -1.6f)
{
lerpProgress = 0f;
}
if(closestCube != GameObject.Find("Cube (1)2"))
{
cubeChildTop.GetComponent<Renderer>().material.color = Color.Lerp(redColor, greenColor, lerpProgress);
}

那么...如何让它从红色平滑地渐变到绿色?

最佳答案

这真的很简单。

1。找出你认为这两个物体可以分开的最大距离。

您需要做的第一件事是确定这两个游戏对象之间的最大距离值。您需要从 #2 将该值传递到 mapValue 函数的 inValueMax 参数中。

您可以使用以下代码确定最大值:

public GameObject obj1;
public GameObject obj2;

void Update()
{
UnityEngine.Debug.Log(getSqrDistance(obj1.transform.position, obj2.transform.position));
}

public float getSqrDistance(Vector3 v1, Vector3 v2)
{
return (v1 - v2).sqrMagnitude;
}

运行它,手动移动每个对象/立方体,然后使用 Debug.Log 消息获取两个对象可以相互移动的最高值。

看着你发布的视频,我估计 200 的距离值就可以了,但如果你想要一个完美的结果,你仍然必须使用上面的脚本进行实验。

2。使用map0MAX_DISTANCE 距离范围转换为 0f1f 范围

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}

它将某个特定点与另一个特定点之间的值进行缩放。

例如,您需要使用 Lerp 函数来执行此操作,Lerp 函数采用 01 值。 mapValue 函数可以将任何数字缩放到 Lerp 函数所需的 01 之间。

对我来说,我会将 0200 的范围值缩放到 0f1f 范围,同时 mapValue 函数。

3。最后,使用 Color.Lerp(near, far, lerp); 在颜色之间进行插值。 lerp 值是 #2 的结果值。


在代码中:

找到 #1 后,将该值插入下面脚本中的 MAX_DISTANCE 变量应该可以工作:

public GameObject obj1;
public GameObject obj2;

Color near = Color.green;
Color far = Color.red;
const float MAX_DISTANCE = 200;

void Update()
{

//Get distance between those two Objects
float distanceApart = getSqrDistance(obj1.transform.position, obj2.transform.position);
UnityEngine.Debug.Log(getSqrDistance(obj1.transform.position, obj2.transform.position));

//Convert 0 and 200 distance range to 0f and 1f range
float lerp = mapValue(distanceApart, 0, MAX_DISTANCE, 0f, 1f);

//Lerp Color between near and far color
Color lerpColor = Color.Lerp(near, far, lerp);
obj1.GetComponent<Renderer>().material.color = lerpColor;
}

public float getSqrDistance(Vector3 v1, Vector3 v2)
{
return (v1 - v2).sqrMagnitude;
}

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}

结果:

关于c# - Lerp 颜色基于 2 个对象之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43419915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com