【问题标题】:Moving a Sphere so its Z-Axis faces a direction移动一个球体,使其 Z 轴朝向一个方向
【发布时间】:2011-06-12 12:57:41
【问题描述】:

首先 - Z 在这个问题上处于领先地位。

背景:使用 3D 对象的自上而下的 2D 游戏。

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

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

一些例子可能是按顺序排列的:

X
|
Z--Y

这很简单:Spheres 局部轴与世界相匹配,所以如果我希望 Spheres Z 轴指向 1,0,0,那么我可以沿 1,0,0 移动球体。

给我带来麻烦的是:

X
|
Y--Z

现在我知道要让 Z 轴指向世界空间中的 1,0,0,我必须告诉球体沿 1,1,0 移动,但我不知道/理解为什么这是案例。

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

【问题讨论】:

  • 如果没有一些矢量知识,你会发现这非常困难。
  • 如果是球体,那么任何方向都可以是z轴。
  • 我什至不明白这个问题。当你沿着一个方向移动球体时,它的轴不会改变它们的方向,因为它只是一个平移。您是在寻找旋转以将球体的轴与某个方向对齐还是什么?
  • 你的意思是这些球体在二维平面上滚动
  • @beta 就问题而言是的。

标签: math vector 3d rotation geometry


【解决方案1】:

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

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

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

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

现在将球放在地板上并滚动它——暂时不要担心标记。请注意,它围绕水平轴(两极)旋转,并沿着一个圆圈(即赤道)接触地板(现在是垂直的)。两极必须位于球体“腰部”的某个位置,距离地面的一半(不要称其为赤道)。如果你选择那个圆上的两极,你就选择了滚动的方向。

现在看看标记,画出分隔它们的大圆圈。两极必须在那个圆上。看看那个圆圈穿过“腰部”的位置;那就是你的两极必须在的地方。

告诉我这是否有意义,我们可以算一下。

【讨论】:

  • 是的,这是有道理的。确实需要通读几遍,但我想我现在明白了:)
  • @Rob Hale:很好,这足以解释为什么在您的第二个示例中球应该向 (1,-1) 方向滚动。现在,您熟悉两个向量的叉积吗?
  • 我只使用叉积来获得世界空间中的垂直向量。因此,例如 Direction cross vect(0,0,1) 我不必将它用于比这更复杂的任何事情。
  • 好吧,事实证明解决方案比解释简单得多:) 我最终得到了球体的 Z 轴并为其添加了所需的方向。这给了我一个球体可以滚动的方向,这将导致它的 Z 轴指向正确的方向。
  • @Rob Hale:嗯……不,那行不通。试试你的第二个例子:球的 Z 轴将从 Y 旋转到 -X 并返回,而不是 X。我们还有一些路要走;几个小时后,我将有时间编辑下一部分的答案。
猜你喜欢
  • 2018-07-29
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多