求教一个关于游戏中相机绕原点固定旋转的问题

查看 26|回复 0
作者:mirus   
我最近想用 Bevy 开发一个小游戏(不过考虑到这个游戏引擎比较小众,下面的讨论还是基于的 Unity 的左手坐标系),里面有一个地球,用户可以简单地通过移动鼠标来旋转地球(不过实际上你是在移动相机,使得地球看起来像是在旋转)。同时,这里还有几个隐含条件:
  • 地球是静止的,且球心是坐标系原点 (0, 0, 0),赤道面即 XZ 平面
  • 相机始终正对地球中心,且距离为已知变量 d
  • 为了确保相机视角不倾斜,相机的 local X 轴始终平行于赤道平面,即 XZ 平面

    一开始,我将地球自转速度和鼠标速度设置为成正比(就像在 Blender 里一样)。 换句话说,如果鼠标向右移动 x 个像素,那么地球就会从西向东旋转 k * x 弧度。 但后来我发现一个问题,如果我放大相机,然后移动地球,地球的自转速度看起来就会太快,因为相机离地球太近了。 所以我意识到这个解决方案不可行。
    然后我想到了另一个想法:使用拖动的方式而非线性旋转。 例如,我单击球面上的 A 点,然后将鼠标移动到视窗坐标( x ,y ),地球将跟随鼠标光标旋转,直到确保 A 点正好移动到视窗位置( x ,y )。 这有点像谷歌地球的做法,不过也存在一些细微差异,比如这里相机的 local X 轴是始终平行于 XZ 平面,这样可以确保答案的唯一性。
    不过后面我就没有具体的实现思路了。假如说我有一个来自空间中的坐标点 P ,我可以用 Unity 的 API Camera.WorldToScreenPoint 将其简单地转换为屏幕上的坐标。 但是目前似乎没有这样的正好符合我要求的 API ,而我自己昨天想了一天也没想到啥思路。所以过来想问下各位大佬有没有什么办法。
  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部