【问题标题】:Smoothly LookAt different object平滑地看不同的物体
【发布时间】:2017-07-15 00:49:54
【问题描述】:

由于图片描绘了我的相机在路径上移动,我想平滑地查看路径的不同对象。目前我已经尝试过

trasnform.LooAt(activePath.gameObject.transform);

但它会产生生涩的结果。对象突然用混蛋看下一个对象!如何避免它。我搜索并找到了这个解决方案,但它也不起作用

var targetRotation = Quaternion.LookRotation(activePath.gameObject.transform.position - transform.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime);

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    void SmoothLookAt(Vector3 newDirection){ transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(newDirection), Time.deltaTime); }

    将新看目标的Vector3位置传递给该方法,它会顺利看目标。

    例如SmoothLookAt(activePath.gameObject.transform)

    【讨论】:

    • 尝试将乘数添加到Time.deltaTime 以减慢移动速度以查明您的问题。我担心还有其他脚本会导致问题。您可能需要发布更多脚本示例
    • 实际上我正在使用获得 spl 格式样条线的 megaShape 包,然后我将我的相机一个接一个地移动到这些样条线上。更多stackoverflow.com/questions/37249480/…
    【解决方案2】:

    这是一种进行流畅翻译的方法。参数是

    • 要翻译的对象变换,
    • 最终位置和
    • 看看变换


    private const float ANIMATION_DURATION_IN_SECONDS = 5f;
    
    private IEnumerator SmoothTranslation(Transform startTransform, Vector3 finalPosition, Transform lookAtTransform){
            float currentDelta = 0;
    
            // Store initial values, because startTransform is passed by reference
            var startPosition = startTransform.position;
            var startRotation = startTransform.rotation;
    
            while (currentDelta <= 1f) {
                currentDelta += Time.deltaTime / ANIMATION_DURATION_IN_SECONDS;
    
                transform.position = Vector3.Lerp(startPosition, finalPosition, currentDelta);
    
                if (lookAtTransform != null) {
                    // HACK Trick: 
                    // We want to rotate the camera transform at 'lookAtTransform', so we do that.
                    // On every frame we rotate the camera to that direction. And to have a smooth effect we use lerp.
                    // The trick is even when we know where to rotate the camera, we are going to override the rotation 
                    // change caused by `transform.lookAt` with the rotation given by the lerp operation. 
                    transform.LookAt(lookAtTransform);
                    transform.rotation = Quaternion.Lerp(startRotation, transform.rotation, currentDelta);
                }
                else {
                    Debug.LogWarning("CameraZoomInOut: There is no rotation data defined!");
                    transform.rotation = originalCameraRotation;
                }
    
                yield return null;
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多