我正在尝试在Unity 3d中创建一个游戏,NPC可以移动并环顾四周,并检查哪些对象在其视角内。要计算视角范围内的对象,请使用unity的内置函数Vector3.Angle,请参见:
// Get current position of the Robot.
var robotObjectPosition = currentTransform.parent.position;
// Get the direction to the object
var directionToObject = (objectToFind.transform.position - robotObjectPosition) / 2;
// Calculate the angle to the object and check if it's inside our viewAngle.
var isInsideAngle = Vector3.Angle(currentTransform.forward, directionToObject) < viewAngle / 2;
现在我有一个奇怪的问题,如果我移动到靠近某个物体(在这种情况下为目标线形状的平面)的位置,即使该物体仍在物体的前面,并且上面的检查仍返回false,球门线仍然清晰地在他的视野之内。我制作了一个屏幕截图以可视化我的问题。 在第一个图像中,球门线在他的视野之内,但是在第二个图像中(我将他向前移动了一小步),即使我可以清楚地看到他仍在目标的前面,上述函数也会返回false。我在想它与另一个对象的宽度有关,(因为我将视角除以2),但是我还没有找到解决方法。
主要我想了解这里发生的事情。
答案 0 :(得分:1)
我亲自尝试了您的代码,并得到了相同的结果。问题是您需要记住,正在计算的角度具有两个重要特征: 1.它检查“ objectToFind”的中心/枢轴点。一旦中心不在角度内,您将得到错误的结果。 2.它是3D而非2D,因此如果您靠近机器人和对象之间的角度(在Y轴上),则不包括objectToFind的中心。
作为解决方案,我将投射线而不是检查射线是否在角度范围内。 希望有帮助