unity lerp 消除间隙
Unity lerp remove gaps
我目前正在使用 Vector3.Lerp
连续实例化一些对象。这是有效的,但它也在对象之间产生了一些间隙。如果开始和结束之间的距离不足以插入新对象,但足够大,它们可以稍微滑动,就会发生这种情况。他们需要 运行 端到端,直接对接。
代码是:
Vector3 startPosition= blah.transform.position.
Vector3 endPosition = getCurrentMousePosition();
Vector3 size = ObjectToSpawn.GetComponent<Renderer>().bounds.size;
fillCount = Mathf.RoundToInt(Vector3.Distance(startPosition, endPosition) / size.z);
float distance = 1.0f / fillCount;
float lerpValue = 0;
for (int i = 0; i < fillCount; i++)
{
lerpValue += distance;
nextPosition = Vector3.Lerp(startPosition, endPosition, lerpValue);
Instantiate(ObjectToSpawn, nextPosition, Quaternion.identify);
}
我的一部分认为,仅根据对象的大小/距离来实例化一行中的对象可能是值得的,但我似乎也不太正确。虽然这个系统被用于其他用途,但我宁愿不重写全新的代码,如果可以稍微修改一下就可以工作的话。我猜想四舍五入 Lerp 值可能是可行的方法?
如有任何意见或建议,我们将不胜感激。
您可以使用阈值。当它的位置离endPosition很近的时候,可以直接clamp到endposition,这样:
if(Vector3.Distance(nextPosition,endPosition)<threshold){
nextPosition = endPosition;
}else{
nextPosition = Vector3.Lerp(startPosition, endPosition, lerpValue);
}
如果您希望对象精确接触且没有间隙,则起始位置和结束位置之间的距离必须是它们大小的整数倍。
尝试在循环之前添加以下行:
endPosition = Vector3.Lerp(startPosition, endPosition, (fillCount * size.z) / Vector3.Distance(startPosition, endPosition));
我目前正在使用 Vector3.Lerp
连续实例化一些对象。这是有效的,但它也在对象之间产生了一些间隙。如果开始和结束之间的距离不足以插入新对象,但足够大,它们可以稍微滑动,就会发生这种情况。他们需要 运行 端到端,直接对接。
代码是:
Vector3 startPosition= blah.transform.position.
Vector3 endPosition = getCurrentMousePosition();
Vector3 size = ObjectToSpawn.GetComponent<Renderer>().bounds.size;
fillCount = Mathf.RoundToInt(Vector3.Distance(startPosition, endPosition) / size.z);
float distance = 1.0f / fillCount;
float lerpValue = 0;
for (int i = 0; i < fillCount; i++)
{
lerpValue += distance;
nextPosition = Vector3.Lerp(startPosition, endPosition, lerpValue);
Instantiate(ObjectToSpawn, nextPosition, Quaternion.identify);
}
我的一部分认为,仅根据对象的大小/距离来实例化一行中的对象可能是值得的,但我似乎也不太正确。虽然这个系统被用于其他用途,但我宁愿不重写全新的代码,如果可以稍微修改一下就可以工作的话。我猜想四舍五入 Lerp 值可能是可行的方法?
如有任何意见或建议,我们将不胜感激。
您可以使用阈值。当它的位置离endPosition很近的时候,可以直接clamp到endposition,这样:
if(Vector3.Distance(nextPosition,endPosition)<threshold){
nextPosition = endPosition;
}else{
nextPosition = Vector3.Lerp(startPosition, endPosition, lerpValue);
}
如果您希望对象精确接触且没有间隙,则起始位置和结束位置之间的距离必须是它们大小的整数倍。
尝试在循环之前添加以下行:
endPosition = Vector3.Lerp(startPosition, endPosition, (fillCount * size.z) / Vector3.Distance(startPosition, endPosition));