在 Unity3D 中向前和向后夹紧相机矢量

本文关键字:相机 Unity3D | 更新日期: 2023-09-27 17:56:44

我的透视相机在x轴上旋转。我已经用滚轮实现了缩放,效果很好。

但是,我正在尝试限制缩放。我现在的解决方案是取 transform.forward y 和 z 分量的相对比例,并使用Mathf.Clamp并将minZoommaxZoom浮点数乘以相应的transform.forward分量来夹紧相机的 y 和 z 位置。它运行良好,除了它限制了 y 轴,所以当我平移时,我不能低于给定的 y,因为我的夹子理想情况下只影响缩放。

有没有办法夹住相机的前后运动?我一直在到处寻找,但找不到任何东西。

谢谢。

编辑

这是相关代码(我的夹紧发生在后期更新):

public class ClickManager : MonoBehaviour
{
    public float dragSpeed = 2;
    public float minZoom = 0.5f;
    public float maxZoom = 5.0f;
    private Vector3 dragOrigin;
    private float lerpPercentBack = 0; // value between 0 and 1 representing percentage of lerp
    private float lerpPercentForward = 0;
    private bool isLerpingBack = false;
    private bool isLerpingForward = false;

    void Update()
    {
        float scroll = Input.GetAxis("Mouse ScrollWheel");
        if (Input.GetMouseButtonDown(1))
        {
            dragOrigin = Input.mousePosition;
            return;
        }
        if (scroll > 0)
        {
            isLerpingForward = true;
            lerpPercentForward = 0;
        }
        if (scroll < 0)
        {
            isLerpingBack = true;
            lerpPercentBack = 0;
        }

        if (isLerpingBack)
        {
            scrollLerperBack();
            lerpPercentBack += 0.05f;
            if (lerpPercentBack >= 1.0f)
            {
                lerpPercentBack = 0;
                isLerpingBack = false;
            }
        }

        if (isLerpingForward)
        {
            scrollLerperForward();
            lerpPercentForward += 0.05f;
            if (lerpPercentForward >= 1.0f)
            {
                lerpPercentForward = 0;
                isLerpingForward = false;
            }
        }
        //Debug.Log(lerpPercent);
        /*if (!Input.GetMouseButton(1)) return;
        Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - dragOrigin);
        Vector3 move = new Vector3(pos.x * dragSpeed, pos.y * dragSpeed, 0);
        transform.Translate(move, Space.World);
        Debug.Log(scroll);*/

    }

    void scrollLerperBack()
    {
        transform.position -= Vector3.Lerp(transform.forward, Vector3.zero, lerpPercentBack);
    }

    void scrollLerperForward()
    {
        transform.position += Vector3.Lerp(transform.forward, Vector3.zero, lerpPercentForward);
    }
    void LateUpdate()
    {
        Vector3 pos = transform.position;
        pos.y = Mathf.Clamp(pos.y, minZoom * transform.forward.y,
            maxZoom * transform.forward.y);
        pos.z = Mathf.Clamp(pos.z, minZoom * transform.forward.z, 
            maxZoom * transform.forward.z);
        transform.localPosition = pos;
    }
}

在 Unity3D 中向前和向后夹紧相机矢量

工作代码:

using UnityEngine;
using System.Collections;
public class ClickManager : MonoBehaviour
{
    public float dragSpeed = 2;
    public float minZoom = 0.5f;
    public float maxZoom = 5.0f;
    private Vector3 dragOrigin;
    private float lerpPercentBack = 0; 
    private float lerpPercentForward = 0;
    private bool isLerpingBack = false;
    private bool isLerpingForward = false;
    Vector3 forwardPos;
    Vector3 backwardPos;
    void Start()
    {
        forwardPos = transform.position ;
        forwardPos.z += maxZoom;
        backwardPos = transform.position ;
        backwardPos.z += minZoom;
    }

    void Update()
    {
        float scroll = Input.GetAxis("Mouse ScrollWheel");
        if (Input.GetMouseButtonDown(1))
        {
            dragOrigin = Input.mousePosition;
            return;
        }
        if (scroll > 0)
        {
            isLerpingForward = true;
            lerpPercentForward = 0;
        }
        if (scroll < 0)
        {
            isLerpingBack = true;
            lerpPercentBack = 0;
        }

        if (isLerpingBack)
        {
            scrollLerperBack();
            lerpPercentBack += 0.05f;
            if (lerpPercentBack >= 1.0f)
            {
                lerpPercentBack = 0;
                isLerpingBack = false;
            }
        }

        if (isLerpingForward)
        {
            scrollLerperForward();
            lerpPercentForward += 0.05f;
            if (lerpPercentForward >= 1.0f)
            {
                lerpPercentForward = 0;
                isLerpingForward = false;
            }
        }
    }

    void scrollLerperBack()
    {
        transform.position = Vector3.MoveTowards(transform.position, backwardPos, Time.deltaTime * dragSpeed );
    }

    void scrollLerperForward()
    {
        transform.position = Vector3.MoveTowards(transform.position, forwardPos, Time.deltaTime * dragSpeed);
    }

}