Unity相机在碰撞中发抖

时间:2019-12-27 11:24:15

标签: unity3d touch

除了过度缩放并且SphereCast与网格碰撞时,该脚本可以完全正常地正常工作。当它碰到网格物体时,我希望相机停下来,而不要尝试通过网格物体。

See demonstration here

if(Input.touchCount == 2)
{
    Touch first = Input.GetTouch(0);
    Touch second = Input.GetTouch(1);

    origin = mainCamera.transform.position;
    direction = mainCamera.transform.forward;
    RaycastHit hit;

    if(Physics.SphereCast(origin, sphereRadius, direction, out hit, maxDistance))
    {
        inCollision = true;
    }
    else
    {
        inCollision = false;
    }

    if(first.phase == TouchPhase.Began || second.phase == TouchPhase.Began)
    {
        initialDistance = Vector3.Distance(first.position, second.position);
    }
    if(first.phase == TouchPhase.Moved || second.phase == TouchPhase.Moved)
    {
        movedDistance = Vector3.Distance(first.position, second.position) - initialDistance;
        if(inCollision)
        {
            movedDistance = -Mathf.Abs(movedDistance);
        }

        mainCamera.transform.localPosition = new Vector3(0, 0, mainCamera.transform.localPosition.z + movedDistance * zoomSensitivity * Time.deltaTime);
        initialDistance = Vector3.Distance(first.position, second.position);
    }
}

我试图:

  • 当SphereCast撞击网格时,将movedDistance设置为0
  • mainCamera.transform.localPosition.z夹在mainCamera.transform.localPosition.z上,但仅在SphereCast击中网格时才可用,因此z缩放不会超过其当前值。

1 个答案:

答案 0 :(得分:0)

正如您之前一直评论的那样,前进,碰撞,后退,不再碰撞,前进等。


您可能宁愿不向后移动,而是检查您是否碰撞,如果您移动并且在这种情况下完全不移动:

if(first.phase == TouchPhase.Began || second.phase == TouchPhase.Began)
{
     initialDistance = Vector3.Distance(first.position, second.position);
}
else if(first.phase == TouchPhase.Moved || second.phase == TouchPhase.Moved)
{
     movedDistance = Vector3.Distance(first.position, second.position) - initialDistance;

     // Only check until here if you WOULD collide
     origin = mainCamera.transform.position;
     var targetPosition = origin + mainCamera.transform.forward * movedDistance * Time.deltaTime * zoomSensitivity;
     direction = mainCamera.transform.forward;

     // only move if there WILL BE no collision
     if(!Physics.SphereCast(targetPosition, sphereRadius, direction, out var hit, maxDistance))
     {
         mainCamera.position = targetPosition;
     }

     initialDistance = Vector3.Distance(first.position, second.position);
}

SphereCast的示例中可以看出,您甚至可以考虑将hit.distance纳入考虑范围,以便至少将相机移到最接近的位置。