我在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 }