【问题标题】:Zoom at a certain distance放大一定距离
【发布时间】:2019-09-15 15:03:57
【问题描述】:

我有以下 Unity 脚本

void Update()
{
    Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit = new RaycastHit();

    if(Physics.Raycast(mouseRay, out hit))
    {
        if (Input.GetMouseButtonDown(0))
        {
            Camera.main.GetComponent<CameraController>().ZoomIn(hit.transform.position);
        }
    }
}

然后在我的相机里

public void ZoomIn(Vector3 target)
{
    zoomSavePosition = camera.transform.position;
    StartCoroutine(Zoom(zoomSavePosition, target, zoomDuration));
}


// ZoomRoutine
IEnumerator Zoom(Vector3 from, Vector3 to, float duration)
{
    float time = 0;
    Quaternion rotation = camera.transform.rotation;
    Quaternion targetRotation = Quaternion.LookRotation(to - camera.transform.position);
    while (time < zoomDuration)
    {
        camera.transform.position = Vector3.Lerp(from, to, time / zoomDuration);
        camera.transform.rotation = Quaternion.Slerp(rotation, targetRotation, time / zoomDuration);

        time += TimeManager.instance.deltaTime;
        yield return null;
    }

    camera.transform.position = to;
    camera.transform.rotation = targetRotation;
}

这很好用,但它会放大对象内部。我想,无论从哪里到哪里,我总是缩放并最终与目标保持相同的距离。

我正在考虑使用MoveTowards,但是在协程内部这会使运动停止,但旋转会继续进行(而且很丑)

所以给一个点 A 和一个点 B 我如何计算中间的距离,它设置为与 B 的距离始终相同?

【问题讨论】:

    标签: c# unity3d math


    【解决方案1】:

    要缩放到距目标对象的特定距离,您需要计算与目标对象在相机方向上的距离,然后将其减去目标位置。

    var heading = to - from;
    var dist = heading.magnitude;
    var direction = heading / dist;
    
    Vector3 newTargetPosition = to - (direction * distance);
    

    参考:https://docs.unity3d.com/Manual/DirectionDistanceFromOneObjectToAnother.html

    通过此调整,您可以停止缩放到任何提供的距离。 调整后的代码如下所示:

    public void ZoomIn(Vector3 target)
    {
        float targetDistance = 2f;
        zoomSavePosition = camera.transform.position;
        StartCoroutine(Zoom(zoomSavePosition, target, zoomDuration, targetDistance));
    }
    
    
    // ZoomRoutine
    IEnumerator Zoom(Vector3 from, Vector3 to, float duration, float distance)
    {
        float time = 0;
        Quaternion rotation = camera.transform.rotation;
        Quaternion targetRotation = Quaternion.LookRotation(to - camera.transform.position);
    
        var heading = to - from;
        var dist = heading.magnitude;
        var direction = heading / dist;
    
        Vector3 newTargetPosition = to - (direction * distance);
    
        while (time < zoomDuration)
        {
            camera.transform.position = Vector3.Lerp(from, newTargetPosition, time / zoomDuration);
            camera.transform.rotation = Quaternion.Slerp(rotation, targetRotation, time / zoomDuration);
    
            time += Time.deltaTime;
            yield return null;
        }
    
        camera.transform.position = newTargetPosition;
        camera.transform.rotation = targetRotation;
    }
    

    您可以在要停止缩放的位置设置 targetDistance 的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多