c#monogame如何让相机在玩家后面慢慢重置位置

Posted

技术标签:

【中文标题】c#monogame如何让相机在玩家后面慢慢重置位置【英文标题】:c# monogame how to make camera reset position slowly behind player 【发布时间】:2021-11-12 22:47:01 【问题描述】:

您好,我正在尝试创建一种 MMO 相机风格,玩家可以拖动以环顾角色,当他向前移动时,相机会慢慢旋转回玩家身后,当相机重置时,它会选择移动玩家的左侧或右侧是最短路径。目前,当您需要将 360 度旋转到 0 度时,下面的代码不起作用。

[example of working][1]
[example of working][2]
[example of not working][3]

[1]: https://i.stack.imgur.com/LblS0.png
[2]: https://i.stack.imgur.com/ujiSs.png
[3]: https://i.stack.imgur.com/zpHGE.png
float yMaxRotation; //is our target rotation (our Green Pointer)
float yRotation; //is our camera rotation (our Grey Pointer)

yMaxRotation = target.rotation.Z - (MathHelper.PiOver2);
yMaxRotation = yMaxRotation % MathHelper.ToRadians(360);
if (yMaxRotation < 0) yMaxRotation += MathHelper.ToRadians(360);

float newRotation = yMaxRotation;

if (yMaxRotation <= MathHelper.ToRadians(90) && yRotation >= MathHelper.ToRadians(270))

    newRotation = yMaxRotation - MathHelper.ToRadians(360);

if (yMaxRotation >= MathHelper.ToRadians(270) && yRotation <= MathHelper.ToRadians(90))

    newRotation = yMaxRotation + MathHelper.ToRadians(360);


if (yRotation <= newRotation)

    yRotation += (newRotation - yRotation) / 15;

if (yRotation > newRotation)

    yRotation -= Math.Abs(newRotation - yRotation) / 15;

对于处理距离和方向的相机,它会在每次更新时调用此代码

Position //is our cameras position
newPos //is our players character position - the offset (push camera back and up)

Vector3 newPos = ((target.position - target.positionOffset) + new Vector3(0, 0, 18));
SetLookAt(Position, newPos, Vector3.Backward);

【问题讨论】:

【参考方案1】:

比较角度时的数学运算并不等于 1 和 359 之间的距离为 2。

  float yMaxRotation; //is our target rotation (our Green Pointer)
  float yRotation; //is our camera rotation (our Grey Pointer)

  yMaxRotation = target.rotation.Z - MathHelper.PiOver2; // Copied from source.


  float newRotationDelta = (yMaxRotation - yRotation - MathHelper.Pi - 

             MathHelper.TwoPi) % MathHelper.TwoPi + MathHelper.Pi; // scale -179 to 180
  
  yRotation += newRotationDelta / 15;

yMaxRotation - yRotation 获取增量角度。减去 540(180 + 360 或 360 的任何倍数,因为 mod 将其移除,以确保值为负)以创建一个负 x 轴反射角,修改为范围(-359 到 0),然后加回 180 到反转反射并重新定位为零。

【讨论】:

谢谢,您的回答解决了我的问题,相机在播放器后面正确旋转

以上是关于c#monogame如何让相机在玩家后面慢慢重置位置的主要内容,如果未能解决你的问题,请参考以下文章

Unity C#:使用自动定位和鼠标外观的相机控制

在XNA / Monogame中使用Ray的视线

如何在统一 2d 中将相机连接到生成的玩家?

[游戏开发-学习笔记]菜鸟慢慢飞-Camera

我的播放器的状态如何不会在每次屏幕加载时重置?

如何让相机的垂直旋转使相机上下移动?