Math 移动球体使其Z轴朝向一个方向

Math 移动球体使其Z轴朝向一个方向,math,vector,3d,rotation,geometry,Math,Vector,3d,Rotation,Geometry,首先,在这个问题中-Z处于上升状态 上下文:使用3D对象的自上而下2D游戏 玩家和所有敌人都是可以在2D平面(XY)上向任何方向移动的球体。当它们移动时,它们会像您预期的那样旋转。它们的速度是世界空间中的三维矢量,这就是我影响它们的方式。他们不允许当场旋转 我需要找到一个公式来确定这些球体中的一个应该移动的方向,以便使它们的Z轴(或任何轴)在世界空间中指向指定的方向 以下是一些例子: X | Z--Y 这个很简单:球体局部轴与世界匹配,因此如果我希望球体Z轴指向1,0,0,那么我可以沿1,0,

首先,在这个问题中-Z处于上升状态

上下文:使用3D对象的自上而下2D游戏

玩家和所有敌人都是可以在2D平面(XY)上向任何方向移动的球体。当它们移动时,它们会像您预期的那样旋转。它们的速度是世界空间中的三维矢量,这就是我影响它们的方式。他们不允许当场旋转

我需要找到一个公式来确定这些球体中的一个应该移动的方向,以便使它们的Z轴(或任何轴)在世界空间中指向指定的方向

以下是一些例子:

X
|
Z--Y
这个很简单:球体局部轴与世界匹配,因此如果我希望球体Z轴指向1,0,0,那么我可以沿1,0,0移动球体

给我带来麻烦的是:

X
|
Y--Z
现在我知道,要使Z轴指向世界空间中的1,0,0,我必须告诉球体沿1,1,0移动,但我不知道/理解为什么会这样


我已经编程十年了,但我绝对不擅长向量数学,所以当我试图解释时,假设我是个白痴:)

好吧,我想我明白你的意思了

拿一个球——你周围一定有一个。在其上标记一个点以指示感兴趣的轴。现在选择希望轴指向的方向。诀窍是将球旋转到位,使轴指向正确的方向——我们将在一分钟内开始滚动

最明显的方法是“直接”移动,如果你这样做几次,你会注意到你旋转球的轴与你试图移动的轴垂直。就好像这个点在赤道上,你绕着南北轴旋转。每次你选择一个新的方向,这个方向和你标记的轴决定了新的赤道。另外请注意(这可能很棘手),你可以画一个大圆(这是一个围绕球体的圆,它将球体分成相等的两半)在标记和目标之间,这样它们就位于相反的半球上,就像镜像一样。极点总是在那个圆上

现在假设你不能自由选择这样的极点。你有一个标记,你有一个想要的方向,所以你有一个大圆,北极将在圆上的某个地方,但它可能在任何地方。想象一下,其他人可以选择它。标记仍将旋转到目的地,但它们将不再位于赤道上,它们将位于其他纬度

现在把球放在地板上滚,暂时不要担心球的记号。请注意,它绕水平轴(两极)旋转,并沿赤道(现在是垂直的)圆接触地面。两极必须在球体“腰部”的某个地方,距离地面的一半(不要称之为赤道)。如果在该圆上拾取极点,则选择滚动方向

现在看这些记号,画一个将它们分开的大圆圈。极点必须在那个圆上。看那个圆圈穿过“腰部”的地方;那就是你的极点所在


告诉我这是否有意义,我们可以进行数学计算。

如果没有矢量知识,你会发现这很难。如果它是一个球体,那么任何方向都可能是z轴。我甚至不理解这个问题。当您沿某个方向移动球体时,其轴不会改变其方向,因为它只是一个平移。你是在寻找旋转来将球体的轴对准某个方向还是什么?你的意思是这些球体在2D平面上滚动吗?@beta就问题而言是的。是的,这很有意义。我确实读了几遍,但我想我现在明白了:)@Rob Hale:好,这足以解释为什么在第二个例子中球应该朝(1,-1)方向滚动。现在,你们熟悉两个向量的叉积吗?我只使用过叉积来得到世界空间中的垂直向量。例如,方向交叉向量(0,0,1),我不必用它来处理比这更复杂的问题。好吧,结果证明解决方案比解释简单得多:)我得到了球体的Z轴,并为其添加了所需的方向。这给了我一个球体可以滚动的方向,这将导致它的Z轴指向正确的方向。@Rob Hale:嗯。。。不,那不行。试试你的第二个例子:球的Z轴将从Y轴旋转到-X轴,然后再旋转回来,永远不会旋转到X轴;几个小时后,我将有时间编辑下一部分的答案。