将3D矢量相对于另一个3D矢量旋转90度

时间:2018-08-28 16:11:17

标签: unity3d math rotation quaternions euler-angles

我正在做一个游戏,玩家可以在任何表面上攀爬。

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

enter image description here

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

Quaternion.LookRotation(forward, up);

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

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

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

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

enter image description here

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

enter image description here

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

更多地考虑基于Unity的问题,该问题涉及引擎提供的数学函数,而与纯数学相关的问题相反。但是,任何答案当然都是正确的。

1 个答案:

答案 0 :(得分:1)

检查矢量分量的大小。

然后将绝对值最小的组件设为零,并交换最大的组件和第二个组件,最大的组件取反。这种方法会为所有非零向量产生有效的垂直方向

例如,案例

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