vbu*_*zze 0 c# opengl math directx unity-game-engine
我有2个具有相同原点的矢量,我只想旋转一个以匹配另一个.但是,我无法找到数学能够计算两者之间的x角度,y角度和z角度(世界坐标).它也可以在局部坐标中获得这个角度,我不知道它是否有帮助但是前向矢量(局部Y)周围的旋转可以是任何无关紧要的.我只需要我的对象面向正确的方向.
我该怎么办?
有很多方法可以解决这个问题.让我首先建议交叉产品,因为它比大多数替代品(如Quaternions)更容易理解,并可能指向正确的方向.
基本上两个矢量(a和b)之间的叉积产生第三个矢量(c),它垂直于两者.这也是值得注意的,即该第三矢量的长度正好是length(a)*length(b)*sin(Theta),其中θ为之间的角度a和b.
这是它的样子:
c.x = a.y * b.z - a.z * b.y
c.y = a.z * b.x - a.x * b.z
c.z = a.x * b.y - a.y * b.x
Run Code Online (Sandbox Code Playgroud)
一个非常简单的公式.
现在的诀窍是,规范化a和b.这意味着将它们的长度设置为1.这是通过获取向量并将每个组件除以其长度来完成的
length_a = sqrt(a_old.x * a_old.x + a_old.y * a_old.y + a_old.z * a_old.z)
a.x = a_old.x / length_a
a.y = a_old.y / length_a
a.z = a_old.z / length_a
Run Code Online (Sandbox Code Playgroud)
使用两个标准化向量作为交叉积的输入将导致c长度为1 * 1 * sin(Theta)或仅为sin(Theta).
(作为替代方案,你也可以使用点积来做到这一点,正如Dmitry Bychenko在评论中指出的那样)
你接下来可以做什么?现在,您可以自由旋转两种a或b围绕载体c使用旋转矩阵.但请注意,您需要c再次标准化才能执行此操作.