我制作了一个3D场景,我有三组模型。我有一个相机正在查看其中一组。 这些组中的模型围绕组中心(向上轴)旋转,模型还旋转其自己的本地中心(向上轴)。
这类似于XNA Racing Game汽车选择屏幕。 唯一的区别是我希望能够旋转我的相机来查看另一组。 当旋转相机看下一组我想旋转120度(我有3个模型组360/3 = 120)
注意: - 相机正在从群组的飞机上方看一组。
相机:
viewMatrix = Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up);
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, 1f, 1000f);
行:
不行:
一些图像来澄清这种情况:
答案 0 :(得分:0)
在我看来,你希望所有的旋转都是围绕世界向上的轴而不是摄像机的向上轴。
这是将视图从一个组更改为另一个组的可能方法。这将以恒定速率旋转。如果您希望旋转在到达所需组时稍微减慢,则需要添加代码。这假设您知道每个组的中心位置。
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
float rotationRate = 0.01f; //radians per second. set to taste
Vector3 cameraGoal;// the center point of the group that you want the camera to settle on. changes with input.
Vector3 currentLookingDirection = cameraTarget - cameraPosition;//
Vector3 desiredLookingDirection = cameraGoal - cameraPosition;
float angularSeparationFactor = Vector3.Dot(currentLookingDirection, desiredLookingDirection);
if(angularSeparationFactor < 0.98f);//set to taste
{
float directionToRotate = Math.Sign(Vector3.Cross(currentLookingDirection , desiredLookingDirection ).Y);
cameraTarget = Vector3.Transform(cameraTarget - cameraPosition, Matrix.CreateRotationY(rotationRate * elapsed * directionToRotate)) + cameraPosition;
}
else
{
cameraTarget = cameraGoal;
}
view = Matrix.CreatLookAt(cameraPosition, cameraTarget, Vector3.Up);