【问题标题】:Unity lerp remove gapsunity lerp 消除差距
【发布时间】:2017-08-19 15:28:43
【问题描述】:

我目前正在使用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 值可能是可行的方法?

任何意见或建议将不胜感激。

【问题讨论】:

    标签: c# unity3d lerp


    【解决方案1】:

    如果您希望对象准确无间隙地接触,则开始位置和结束位置之间的距离必须是其大小的整数倍。

    尝试在循环之前添加以下行:

    endPosition = Vector3.Lerp(startPosition, endPosition, (fillCount * size.z) / Vector3.Distance(startPosition, endPosition));
    

    【讨论】:

    • 大功告成。只需稍微调整一下代码, ((i+1) * size.z) 将它们全部放在一行中,没有重叠。谢谢!!
    【解决方案2】:

    您可以使用阈值。当它的位置非常接近 endPosition 时,你可以像这样直接将它夹在 endposition 上:

    if(Vector3.Distance(nextPosition,endPosition)<threshold){
      nextPosition = endPosition;
    }else{
      nextPosition = Vector3.Lerp(startPosition, endPosition, lerpValue);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2011-11-16
      • 2016-06-21
      相关资源
      最近更新 更多