【问题标题】:Direct3D Geometry: Rotation Matrix from Two VectorsDirect3D 几何:来自两个向量的旋转矩阵
【发布时间】:2008-11-13 04:41:58
【问题描述】:

给定两个 3D 向量 A 和 B,我需要导出一个从 A 旋转到 B 的旋转矩阵。

这是我想出的:

  1. acos(A . B)
  2. 导出余弦
  3. asin(|A x B| / (|A| * |B|)) 导出正弦
  4. 使用 A x B 作为旋转轴
  5. 使用this page(轴角)底部附近给出的矩阵

除了 0°(我忽略)和 180°(我将其视为特殊情况)的旋转之外,这工作正常。使用 Direct3D 库是否有更优雅的方法来执行此操作?我正在寻找 Direct3D 特定的答案。

编辑:删除了 acos 和 asin(参见 Hugh Allen's post

【问题讨论】:

    标签: graphics 3d geometry transform direct3d


    【解决方案1】:

    不,您几乎是在以最好的方式做到这一点。我认为没有内置的 DirectX 功能可以满足您的需求。对于第 4 步,您可以使用 D3DXMatrixRotationAxis()。请注意边缘情况,例如当 |A|或 |B|为零,或者角度为 0° 或 180° 时。

    【讨论】:

      【解决方案2】:

      这可能更像是一个错字而不是 thinko,但 acos(A.B) 是角度,而不是余弦。第 2 点也是如此。

      您可以使用 sin^2 + cos^2 = 1 从 cos 计算 sin。即 sin = sqrt(1-cos*cos)。这将比您使用的矢量表达式便宜,并且还消除了 0/180 度的特殊情况。

      【讨论】:

      • 我不确定从 sqrt(1-cosinecosine) 计算正弦是否有效。这是因为余弦余弦会导致我们失去余弦的符号
      • 您不会“失去余弦的符号”,因为您在旋转矩阵中按原样使用余弦。你真正应该问的是你是否得到了正确的罪征兆?在这种情况下(0-180 度),您只需要正平方根,所以一切都很好。
      • 休,0 到 -180 的范围呢?
      • 此特定应用不需要负角。当从 B 旋转到 A 时,轴矢量将被取反,而不是旋转角度。
      • 事情就这样结束了。再次感谢您的及时回复。
      【解决方案3】:

      你可以看看下面来自 siggraph link text的文章

      【讨论】:

        【解决方案4】:

        也许你可以使用 D3DXMatrixLookAtLH ?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-04
          • 2013-11-12
          • 1970-01-01
          • 2018-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多