Math 角度,旋转的方向

Math 角度,旋转的方向,math,computational-geometry,Math,Computational Geometry,对于一个游戏,我试图计算我看的地方和场景中另一个物体的位置之间的角度。我使用以下代码获得了角度: Vec3 out_sub; Math.Subtract(pEnt->vOrigin, pLocalEnt->vOrigin, out_sub); float angle = Math.DotProductAcos(out_sub, vec3LookAt); 这段代码确实给出了我看的地方和场景中某个对象之间的角度。但是有一个小问题 当我不直接看物体,而是稍微向左看时,它说我必须旋转10度

对于一个游戏,我试图计算我看的地方和场景中另一个物体的位置之间的角度。我使用以下代码获得了角度:

Vec3 out_sub;
Math.Subtract(pEnt->vOrigin, pLocalEnt->vOrigin, out_sub);
float angle = Math.DotProductAcos(out_sub, vec3LookAt);
这段代码确实给出了我看的地方和场景中某个对象之间的角度。但是有一个小问题

当我不直接看物体,而是稍微向左看时,它说我必须旋转10度才能直接看物体。这是完全正确的

但是,当我稍微向右看物体时,它也表示我必须旋转10度才能直接看到物体

这里的问题是,我无法判断旋转方向。我只知道10度。但是我必须向左还是向右旋转?这就是我需要知道的


我怎样才能知道呢?

您还需要对向量执行。然后你可以通过结果向量的方向得到旋转的方向。

我觉得有必要详细说明Ignacio的答案

一般来说,你的问题没有充分的根据,因为“左转”和“右转”只有在你决定哪条路是“向上”后才有意义

两个向量的叉积是一个向量,告诉你哪条路是“向上”。也就是说,
A x B
是从
A
左转到
B
时必须使用的“up”。(横积的大小告诉你你必须转向多远,多多少少…)


对于三维向量,叉积的z分量为
x1*y2-y1*x2
。如果向量本身是2D(即,z分量为零),那么这是获得叉积所需的唯一计算;叉积的x和y分量为零。所以在2D中,如果这个数字是正的,那么“向上”是正的z方向,你必须左转。如果这个数字是负数,那么“向上”是负的z方向,你必须在倒转时左转;i、 例如,向右转。

但是如果用户直接朝着对象的相反方向看,会发生什么情况?+1。请注意,在2D中,这简化为测试
x1*y2
是否大于
y1*x2
。这是out_sub和vec3LookAt向量上的一个十字吗?@nightcracker:那么答案没有定义,因为您可以通过向任意方向旋转180度来查看对象。显然,无论你用什么数学方法,你都必须特别处理这个问题。@Nemo:我只是注意到:)但我们根本没有建立一个定义,因为如果我看10度,我可以移动-10或350度,所以你也可以称之为“未定义”。(是的,我很清楚你指的是最小的绝对角度,我在这里扮演魔鬼代言人)。