我正在做一个游戏,玩家可以在任何表面上攀爬。
当玩家与表面碰撞时,我得到该碰撞的法线。这是玩家“向上”向量应与之对齐的方向:
现在,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);
在大多数情况下,这看起来还不错:
但是当玩家与法线只有x值的表面碰撞时,前向矢量为0,0,0:
我知道我还必须考虑法线的x分量以避免这种情况,但是我不确定在哪里插入它。
更多地考虑基于Unity的问题,该问题涉及引擎提供的数学函数,而与纯数学相关的问题相反。但是,任何答案当然都是正确的。
答案 0 :(得分:1)
检查矢量分量的大小。
然后将绝对值最小的组件设为零,并交换最大的组件和第二个组件,最大的组件取反。这种方法会为所有非零向量产生有效的垂直方向
例如,案例
Abs(n.x) >= Abs(n.z) >= Abs(n.y)
make
Perp = (n.z, 0, -n.x)