【问题标题】:Camera keeps rotating instead of changing angle相机保持旋转而不是改变角度
【发布时间】:2014-12-18 00:04:57
【问题描述】:

我开始使用 silverlight 3d,我认为我使用了不正确的方法来调整相机位置。我有一个滑块控件,其最小值为 0,最大值为 360。

我想根据滑块值移动更改相机角度。相反,只要滑块值发生变化,相机就会不停地围绕对象旋转。

这是调整相机角度的代码:

_rotationMatrix = Matrix.CreateFromAxisAngle(new Vector3(0, 1, 0), MathHelper.ToRadians(_cameraAngle));

 // set camera position
 _cameraPosition = Vector3.Transform(_cameraPosition, _rotationMatrix);

 // set view matrix and projection matrix
 _view = Matrix.CreateLookAt(_cameraPosition, objectPosition, Vector3.Up);
 _projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 1.667f, nearClip, farClip);

我暂时将同一 Draw 事件中的 _cameraAngle 更新为 0.0f 以停止旋转,但必须有更好的方法来做到这一点?

【问题讨论】:

    标签: silverlight xna silverlight-5.0


    【解决方案1】:

    我猜你在每一帧都在旋转相机。在这种情况下,只要 _cameraAngle 的值不为零,相机就会继续旋转。 你可以做的是这样的:

    _rotationMatrix = Matrix.CreateFromAxisAngle(new Vector3(0, 1, 0), MathHelper.ToRadians(_cameraAngle));
    
    // set camera position
    var currentPosition = Vector3.Transform(_cameraPosition, _rotationMatrix);
    
    // set view matrix and projection matrix
    _view = Matrix.CreateLookAt(currentPosition, objectPosition, Vector3.Up);
    _projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 1.667f, nearClip, farClip);
    

    _cameraPosition 现在代表相机的原始位置,currentPosition 是当前帧中的相机位置。

    【讨论】:

      【解决方案2】:

      我的建议是这样的:

      var rotation = Matrix.CreateFromAxisAngle(Vector3.Up, MathHelper.ToRadians(_cameraRotationDegrees);
      _view = Matrix.CreateTranslation(_position) * rotation;
      _projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 1.667f, nearClip, farClip);
      

      这应该可以解决问题。永远记住将平移矩阵与旋转矩阵相乘,而不是相反。

      如果你这样做了,它会先旋转你的相机,然后再移动(如果你在 0,0,0 处也没关系,但一旦你移动,它就会搞砸)

      您也可以这样做:

      _view = Matrix.CreateTranslation(_position) * Matrix.CreateRotationY(MathHelper.ToRadians(_cameraRotationDegrees.Y)) * (REPEAT FOR Z AND THEN X);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多