【问题标题】:Unity camera trembling on collisionUnity相机在碰撞时颤抖
【发布时间】:2019-12-27 11:24:15
【问题描述】:

该脚本运行良好,完全符合其应有的效果,除非缩放过多并且 SphereCast 与网格发生碰撞。当它碰到网格时,我希望相机停下来,而不是试图穿过网格。

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 的缩放不会超过其当前值。

【问题讨论】:

  • 它可能会“颤抖”,因为如果它发生碰撞,你将它向后移动,但在下一帧中它允许再次向前移动

标签: unity3d touch


【解决方案1】:

正如您之前一直评论的那样,向前移动、碰撞、向后移动、不再碰撞、向前移动等。


您可能宁愿不向后移动,但如果您移动并且在这种情况下根本不移动,请检查您是否发生碰撞:

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 考虑在内,以便至少将相机移动到最接近的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多