像 Unity3d 中的 3ds Max 一样缩放到鼠标位置
Zoom to mouse position like 3ds Max in Unity3d
我想要实现的是能够使用鼠标滚轮将相机缩放到我的鼠标所在的位置。把它想象成 3ds max 如何做到这一点。摄像头放大到鼠标所在的位置,没有抖动或卡扣。
这是我当前的实现,但假设目标位于中心。如果我移动目标位置,相机会捕捉到该位置并基本上将其带到中心。
targetDist -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed * 0.5f * (isOrtho ? 15f : 1f);
targetDist = Mathf.Max(0.1f,targetDist);
distance = moveSmoothing * targetDist + (1-moveSmoothing )*distance;
transform.localRotation = Quaternion.Slerp( transform.localRotation, targetRot, rotateSmoothing * deltaTimeFactor );
target.position = Vector3.Lerp(target.position, targetLookAt, moveSmoothing * deltaTimeFactor);
distanceVec.z = distance;
transform.position = target.position - transform.rotation * distanceVec;
有什么想法吗?
所以我开始想办法解决这个问题。对于任何正在寻找这个的人。此脚本应用在Camera上,在Update函数中。
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
RaycastHit hit;
Ray ray = this.transform.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
Vector3 desiredPosition;
if (Physics.Raycast(ray , out hit))
{
desiredPosition = hit.point;
}
else
{
desiredPosition = transform.position;
}
float distance = Vector3.Distance(desiredPosition , transform.position);
Vector3 direction = Vector3.Normalize( desiredPosition - transform.position) * (distance * Input.GetAxis("Mouse ScrollWheel"));
transform.position += direction;
}
我想要实现的是能够使用鼠标滚轮将相机缩放到我的鼠标所在的位置。把它想象成 3ds max 如何做到这一点。摄像头放大到鼠标所在的位置,没有抖动或卡扣。
这是我当前的实现,但假设目标位于中心。如果我移动目标位置,相机会捕捉到该位置并基本上将其带到中心。
targetDist -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed * 0.5f * (isOrtho ? 15f : 1f);
targetDist = Mathf.Max(0.1f,targetDist);
distance = moveSmoothing * targetDist + (1-moveSmoothing )*distance;
transform.localRotation = Quaternion.Slerp( transform.localRotation, targetRot, rotateSmoothing * deltaTimeFactor );
target.position = Vector3.Lerp(target.position, targetLookAt, moveSmoothing * deltaTimeFactor);
distanceVec.z = distance;
transform.position = target.position - transform.rotation * distanceVec;
有什么想法吗?
所以我开始想办法解决这个问题。对于任何正在寻找这个的人。此脚本应用在Camera上,在Update函数中。
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
RaycastHit hit;
Ray ray = this.transform.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
Vector3 desiredPosition;
if (Physics.Raycast(ray , out hit))
{
desiredPosition = hit.point;
}
else
{
desiredPosition = transform.position;
}
float distance = Vector3.Distance(desiredPosition , transform.position);
Vector3 direction = Vector3.Normalize( desiredPosition - transform.position) * (distance * Input.GetAxis("Mouse ScrollWheel"));
transform.position += direction;
}