然后看它是否与身体的方向对齐(由'normal'指定,身体正面的法线向量),只需使用点积:if movement dot normal > 0 ,运动是在正面的法线方向,所以它从背后击中身体 . 否则它从前面撞击身体 .
请注意,我们不会规范化任何向量,当您只想知道它是从后面还是从前面击中对象时,这是不需要的 . 一个很好的奖励是当你标准化 movement 时(我假设 normal 已经标准化), movement 和 normal 之间的点积表示入射角: angle = arccos(movement dot normal)
2 回答
这可以使用一些vector operations来解决 . 首先,构造一个表示运动的向量 .
然后看它是否与身体的方向对齐(由'normal'指定,身体正面的法线向量),只需使用点积:if
movement dot normal > 0
,运动是在正面的法线方向,所以它从背后击中身体 . 否则它从前面撞击身体 .请注意,我们不会规范化任何向量,当您只想知道它是从后面还是从前面击中对象时,这是不需要的 . 一个很好的奖励是当你标准化
movement
时(我假设normal
已经标准化),movement
和normal
之间的点积表示入射角:angle = arccos(movement dot normal)
编辑
此方法处理相对移动,因此您仍需要测试与对象的交集以了解是否完全击中它 . 为此,测试线对象交叉 . (取决于你的目标所以我不能真正说明这一点 . )
我认为this answer和the link provided应该有所帮助 . 答案本身涉及确定2个段是否相交,并且该链接解释了如何确定点是在段的左侧还是右侧 .
除非我弄错了,否则第一部分会告诉你当前的轨迹是否穿过身体,第二部分会告诉你当前的点是否在身体“向量”的左侧或右侧,这是因为你的绘图应该告诉你你是从前面还是在末端相撞 .