相机保持旋转而不是改变角度

时间:2014-12-18 00:04:58

标签: silverlight xna silverlight-5.0

我开始使用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以停止轮换,但必须有更好的方法来执行此操作吗?

2 个答案:

答案 0 :(得分:0)

我猜你在每一帧都在旋转相机。在这种情况下,只要_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是当前帧中的摄像机位置。

答案 1 :(得分:0)

我建议的是这样的:

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);