0

我想做一个简单的矢量旋转。

目标是引导我的第一人称相机,该相机当前指向具有方向 d 的目标 t,指向具有新方向 d1 的新目标 t1。

d 和 d1 之间的过渡应该是平滑的运动。

public void FlyLookTo(Vector3 target) {

        _flyTargetDirection = target - _cameraPosition;
        _flyTargetDirection.Normalize();

        _rotation = new Matrix();

        _rotationAxis = Vector3.Cross(Direction, _flyTargetDirection);

         // This bool tells the Update()-method to trigger the changeDirection() method.
        _isLooking = true;
    }

我正在使用其新参数和

// this method gets executed by the Update()-method if the isLooking flag is up.
private void _changeDirection() {

        dist = Vector3.Distance(Direction, _flyTargetDirection);

        // check whether we have reached the desired direction
        if (dist >= 0.00001f) {

            _rotationAxis = Vector3.Cross(Direction, _flyTargetDirection);
            _rotation = Matrix.CreateFromAxisAngle(_rotationAxis, MathHelper.ToRadians(_flyViewingSpeed - Math.ToRadians(rotationSpeed)));


            // update the cameras direction.
            Direction = Vector3.TransformNormal(Direction, _rotation);
        } else {

            _onDirectionReached();
            _isLooking = false;
        }
    }

我正在执行实际的动作。

我的问题:实际的运动效果很好,但是运动的速度越慢,当前方向越接近所需的方向,如果连续执行几次,这将是一个非常不愉快的运动。

如何使相机从 d 方向移动到 d1 方向,其移动速度相同?

4

1 回答 1

0

你的代码看起来很可靠。_flyViewingSpeed 或 rotationSpeed 是否会发生变化?

另一种方法是使用 Vector3.Lerp() 它将完全按照您的要求进行。但是请注意,您需要使用初始开始和目标方向 - 而不是当前方向 - 否则您将获得不同的速度变化。

另外,我不会使用距离(通常用于点),而是使用 Vector3.Dot() ,这有点像方向的距离。它也应该比 Distance() 更快。

希望这可以帮助。

于 2012-10-09T13:12:58.110 回答