确定是否有东西在对象的右侧或左侧?

我在3D世界中有一个角色,面对一个平面上的任意方向,玩家可以点击角色的左侧或右侧,根据哪一侧点击不同的动作。

我怎样才能确定点击发生在哪一边? 显然,对于直线前进(0,0,1),我可以简单地使用点击点的x坐标来确定它是左侧还是右侧,但其他情况呢?

你首先要弄清楚角色的“正确的”方向。 对于这个,你需要知道角色面对的是哪个方向(uusally'direction'),哪个方向通常是(0,1,0),或者它可以是角色移动的平面的法线。

right = Vector3.Cross(direction, up); 

在这里输入图像描述

接下来,我们需要一个表示鼠标点击和字符相对位置的向量。

 mouseDir= mousePos-charPos; 

最后,我们需要检查右向量和mouseDir向量之间的角度是大于还是小于90度。 如果角度小于90度,则鼠标点击在右边,另一方面在左边。

如果角度小于90°,​​点积将返回正值,如果角度大于90°,​​则为负值。

 if(Vector3.Dot(right, mouseDir) <0){ //do right hand stuff }else{ //do left hand stuff } 

你可以使用vector交叉产品。 创建一个从角色到点击位置的vector,并将该角色和角色的交叉产品朝向方向。 交叉产品“上”组件的标志确定哪一方被点击。 对于地平面来说,这是交叉乘积的y分量。 对于任意的平面,使用叉积和平面的点积来得到符号。

 vec3 delta = clickPosition - characterPosition; vec3 cross = crossProduct(delta, characterDirection); float dot = dotProduct(cross, planeNormal); if (dot < 0) { // Do something } else { // Do something else }