在浮点线性插值中,一位用户提出了以下实现lerp:
float lerp(float a, float b, float f)
{
return (a * (1.0 - f)) + (b * f);
}
Run Code Online (Sandbox Code Playgroud)
另一位用户提出了以下实现lerp:
float lerp(float a, float b, float f)
{
return a + f * (b - a);
}
Run Code Online (Sandbox Code Playgroud)
显然,由于浮点精度损失,后一种实现效果较差。
然后我查看了维基百科,它对前一个实现说:
float lerp(float a, float b, float f)
{
return (a * (1.0 - f)) + (b * f);
}
Run Code Online (Sandbox Code Playgroud)
对于后者:
float lerp(float a, float b, float f)
{
return a + f …Run Code Online (Sandbox Code Playgroud) 我只是试图让观察者模式程序一个对象随机改变颜色并导致一组其他对象改变相同的颜色,但我希望它们在 5 秒内逐渐改变。我正在尝试 lerp,但它只是立即交换颜色。我想这可能与 lerp 的起始颜色有关,因为主要对象是不断变换颜色,新颜色变成旧颜色。所以我需要考虑如何为 lerp 选择一个起始颜色。我不确定这是否与我的 lerp 不工作有关,但这是我正在考虑的。如果其他人有任何建议,我将不胜感激。谢谢你。
public class Subject : MonoBehaviour {
public float timer = 0.0f;
public GameObject[] observers;
float t = 0;
Color oldColor;
void Update () {
t += Time.deltaTime / 5.0f;
timer += Time.deltaTime;
if (timer >= 10f) {
Color newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
GetComponent<Renderer>().material.color = newColor;
for (int i = 0; i < observers.Length; i++) {
observers[i].GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
}
newColor=oldColor
timer = 0;
}
} …Run Code Online (Sandbox Code Playgroud) 我想在x秒内和协程函数中将GameObject从位置A 移动到B. Vector3.MoveTowards我知道如何使用这个,Vector3.Lerp但这次更喜欢这样做,Vector3.MoveTowards因为两个函数的行为都不同.
有了Vector3.Lerp,这样做是这样的:
IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
{
float counter = 0;
//Get the current position of the object to be moved
Vector3 startPos = fromPosition.position;
while (counter < duration)
{
counter += Time.deltaTime;
fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
yield return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我试图做同样的事情Vector3.MoveTowards,但它没有正常工作.问题是移动在x时间或持续时间之前结束.而且,它不能顺利移动.它跳到两个位置的中间而不是位置B的末尾.
这是Vector3.MoveTowards与上述问题一起使用的函数:
IEnumerator MoveTowards(Transform objectToMove, Vector3 toPosition, float duration)
{
float counter = 0;
while …Run Code Online (Sandbox Code Playgroud) 使用的setInterval或RequestAnimationFrame,我想从X和Y之间lerping假设X是0,Y是1取得进展的价值,我想有0它开始,在半0.5和1时结束时.我希望在给定的时间范围内发生这种情况,比方说5秒钟.这意味着当setInterval/RequestAnimationFrame达到2.5秒时,将发生半值0.5.最后,我想pingPong,所以当它达到5秒时,值正在减少而不是增加,例如0.9,0.8,0.7等,然后从0,0.1,0.2再次开始......
任何提示或建议?
谢谢!
function lerp(start, end, amt) {\n return (1-amt)*start+amt*end\n}\nRun Code Online (Sandbox Code Playgroud)\n这个 lerp 函数与坐标完美配合。我可以轻松地将 X 从 1 调整到 10。
\n但是当涉及到旋转时就会出现问题。物体的旋转以弧度为单位。它可以是从 -3.14 到 3.14。那么让我们旋转我们的对象。从0开始,某一时刻旋转会达到3.14,然后...-3.14。因此,当从 3.14 到 -3.14 进行 lerping 时,对象会进行一次完整的 360\xc2\xba 旋转,(3.14, 2, 1, 0, -1, -2, -3.14),这不好。那么,有人能告诉我如何调整轮换吗?
\n我正在使用 JavaScript。
我需要制作一个图片框,以便从一个位置移动到另一个位置(就像您可以统一执行一样)。
我该怎么做,有内置功能吗?
谢谢 :)
我有一个关于 Lerp 的问题。所以我知道 lerp 可以帮助你移动你的物体,比如:
void update(){
transform.position = vector3.lerp(start.position,end.position, (Time.time / 1000));
}
Run Code Online (Sandbox Code Playgroud)
这将使您的物体到达最终位置。但如果你有这样的代码:
void Update(){
transform.position = Vector3.Lerp(transform.position,
destination.position,
speed * 3.0f * Time.deltaTime);
}
Run Code Online (Sandbox Code Playgroud)
你的物体怎么可能到达目的地,lerp的第三个参数必须慢慢达到1,这样你的物体才能到达目的地。但是 "speed" 、 "3.0" 、 "Time.deltaTime" 总是相同的,那么你的对象怎么可能到达目的地呢?
所以最大的问题是:是否可以使用一些始终具有相同值的变量和 Time.deltaTime 来执行 lerp?
现在,由于不同的评论等,我不知道 lerp 是如何工作的,我有可能性:
1.)首先我认为它是这样工作的:
Vector3.lerp(a,b,c) c 值必须更改每一帧才能移动对象。如果 c 值为 0.2,则对象将移动 20% 的距离,如果 c 值不变,则对象将始终移动 20% 的距离。因此,要让对象流畅地移动,您的 c 值必须在每一帧稍微改变一点,这样您的 c 值将从 0 变为 1,并且您的对象从开始到目的地也是如此。
或者是这样的
2.)由于一些评论,我认为 lerp 是这样工作的
就像评论所说,c值不必改变值,因为如果你有c = 0.2,你将通过20%的方式和下一帧,如果c仍然是0.2,你将通过剩余的20%方式等等。
那么 lerp 是像 1 一样工作吗(你必须改变 c)还是像 2 一样工作(你不必改变 c)
我想要调整控制我的动画速度的变量,以便它在混合树中流畅地过渡.
void Idle()
{
_agent.SetDestination(transform.position);
//Something like the following line
_speed = Mathf.Lerp(0.0f, _speed, -0.01f);
_animationController._anim.SetFloat("Speed", _speed);
}
Run Code Online (Sandbox Code Playgroud)
我读过你不能减负,所以我该怎么做?