在 Unity3D 中向前和向后夹紧相机矢量
本文关键字:相机 Unity3D | 更新日期: 2023-09-27 17:56:44
我的透视相机在x轴上旋转。我已经用滚轮实现了缩放,效果很好。
但是,我正在尝试限制缩放。我现在的解决方案是取 transform.forward
y 和 z 分量的相对比例,并使用Mathf.Clamp
并将minZoom
和maxZoom
浮点数乘以相应的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;
}
}
工作代码:
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);
}
}