仅在一个轴上查看游戏对象

所以我试图定位一个gameObject(下图中的房子),它只是一个平面,并且具有2D纹理,如下所示。 整个游戏是在一个hex的球体。 我正在使用Orthographic相机投影为这个游戏。 我已经把房子的飞机定位到了平铺的正常位置,并在X轴上旋转了90度

cityDummy.transform.rotation = Quaternion.LookRotation(normal); cityDummy.transform.Rotate(90, 0, 0); 

现在,我正在试图让房子朝向中心(图像中的蓝色胶囊物体是中心点),但是我不想将它旋转到各个角度。 基本上这就是LookRotation或者LookAt在Unity里面做的事情。 所以在用正常的方向来定位房子之后,我怎样才能让房子看到中心,然后在一个轴上旋转它,在这种情况下,它将是Y轴?

在这里输入图像说明

我之所以需要这样做,首先是我想将房屋的纹理定位到它所放置的瓷砖的正常位置,就像您在上面的图片中看到的一样。 这工作正常。

现在接下来是我们要让他们面对南方这是上图中的蓝色胶囊。 所以它们仍然像下面的图像那样定位,但是城市的前方应该朝南或者朝向蓝色的囊体。 如果我这样做,它会扰乱当前的方向,因为它在所有的轴上旋转。 我只想旋转它在一个轴上,使其面对胶囊

Quaternion.LookRotation(forward, up)有一个漂亮的属性:

  • 正好旋转z + forward
  • 它将y + 尽可能接近地旋转(给定z +上的约束)

(你可能不习惯up ,因为如果你离开这个参数,它默认默认为(0,1,0))

我们在这里想要的(而且经常出现)是相反的:我们希望y + 精确控制,并且我们希望z +在给定约束的情况尽可能接近

我们可以通过玩轴来得到这个:

 Vector3 lookDirection = target.transform.position - cityDummy.transform.position; Quaternion rotation = Quaternion.LookRotation(normal, -lookDirection) * Quaternion.AngleAxis(90f, Vector3.right); 

这看起来很奇怪,所以让我解开一下…

我们在第一个位置(通常用于forward )使用Quaternion.LookRotation,以确保所产生的旋转精确normal ,然后尽可能接近 (负向) lookDirection

这给了我们一个旋转,其中本地z +指向normal方向,而本地y指向lookDirection

(如果你用这种方式来定位你的头部,那么你就会沿着法线向外看,而你的下巴指向目标)

但是我们想要切换轴。 所以我们用y +到z +和z +到y-的旋转来构成这个旋转,即Quaternion.AngleAxis(90f, Vector3.right)

(继续头部比喻,这相当于把你的头向前倾90度)

*组合这两个旋转的结果是一个旋转,它使+ y完全normal ,而+ z尽可能接近lookDirection

我非常使用这个模式,可能值得把它作为一个扩展方法添加到Quaternion中,所以你可以通过一个调用来获得它,比如Quaternion.LookRotationExactUp(forward,up)

(发表我的评论作为答案)

如果你把你的单元格的三维平面和该南极的一条线,并find交点,那么你可以使用LookAt的那一点。

您还需要处理平面与该线平行的情况,在这种情况下,您可以将平面旋转到预定角度,以正确定位。