对于游戏,我正在尝试计算我正在看的位置与场景中另一个对象的位置之间的角度。我通过使用以下代码获得了角度:
Vec3 out_sub;
Math.Subtract(pEnt->vOrigin, pLocalEnt->vOrigin, out_sub);
float angle = Math.DotProductAcos(out_sub, vec3LookAt);
这段代码确实给了我看到的场景和场景中的对象之间的角度。但是有一个小问题。
当我没有直接看到物体但略微向左看时,它说我必须旋转10度才能直接看物体。这是完全正确的。
但是,当我略微看向物体的右侧时,它还说我必须旋转10度才能直视物体。
这里的问题是,我无法分辨哪种方式旋转到。我只知道它的10度。但我必须向左或向右旋转吗?这就是我需要找到的。
我怎么能弄明白?
答案 0 :(得分:2)
我觉得有必要详细说明伊格纳西奥的回答......
一般来说,你的问题没有根据,因为“左转”和“右转”只有在你决定哪种方式“向上”后才有意义。
两个向量的叉积是告诉你哪个方向是“向上”的向量。也就是说,如果您想将 left 从A x B
转到A
,则B
是您必须使用的“向上”。 (并且交叉产品的大小告诉你你需要转动多远或多或少......)
对于3D矢量,叉积的z分量为x1 * y2 - y1 * x2
。如果向量本身是2D(即,具有零z分量),那么这是您必须计算以获得交叉积的唯一事物;叉积的x和y分量为零。所以在2D中,如果这个数字是正数,则“向上”是正z方向,你必须向左转。如果这个数字是负数,那么“向上”是负z方向,你必须在颠倒时向左转;即向右转。
答案 1 :(得分:1)
您还需要对矢量执行cross product。然后,您可以通过合成矢量的方向获得旋转方向。