【问题标题】:Rotating a 3D vector 90 degrees relative to another 3D vector将 3D 矢量相对于另一个 3D 矢量旋转 90 度
【发布时间】:2019-02-03 08:15:35
【问题描述】:

我正在制作一款玩家可以攀爬任何表面的游戏。

当玩家与表面碰撞时,我会得到该碰撞的法线。这是玩家“向上”向量应对齐的方向:

现在,unity 提供了一种方便的方法来将两个向量转换为旋转:

Quaternion.LookRotation(forward, up);

它需要一个向上向量和一个向前向量。正如我提到的,我已经有了向上向量。我的问题是如何获得前向向量。

我目前的解决方案是通过在法线中翻转某个轴来计算前向向量:

normal = collision.contacts[0].normal;
Vector3 forward = Vector3.zero;
forward = new Vector3(0, -normal.z, normal.y);    
transform.rotation = Quaternion.LookRotation(forward, normal);

这在大多数情况下看起来都不错:

但是当玩家与法线只有 x 值的表面发生碰撞时,前向矢量为 0,0,0:

我知道我还必须考虑法线的 x 分量以避免这种情况,但我不确定在哪里插入。

更多地考虑这个基于 Unity 的问题,它涉及引擎提供的数学函数,而不是纯粹的数学相关问题。但任何答案当然是受欢迎的。

【问题讨论】:

    标签: unity3d math rotation quaternions euler-angles


    【解决方案1】:

    检查向量分量的大小。

    然后使绝对值最小的分量为零,并交换最大的和第二的分量,取反最大的分量。这种方法为所有非零向量产生有效的垂线

    例如,案例

    Abs(n.x) >= Abs(n.z) >= Abs(n.y)
    make
    Perp = (n.z, 0, -n.x)
    

    【讨论】:

    • 有道理,我如何决定要否定哪一个?
    • 否定最大的以避免像 (1,0,0) 这样的情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多