从图中可以看出,该点的位置是必需的。目标和障碍物的位置是动态的,但机器人的位置可以被视为宇宙的中心。 到目前为止所做的工作如下
float m = calculate_m();
float d = calculate_d(nearest_obstacle, m);
teta = (float)calculate_angle(d, nearest_obstacle);
float calculate_m()
{
float m = (player.position.z - winning_state.position.z )/(player.position.x - winning_state.position.x);
return m;
}
float calculate_d(Transform nearest_obstacle,float m)
{
float b;
b = (-1 * player.position.z) + (m * player.position.x);
//changed: we remove || absolute value so it gives -90 90 degree ||
float d = (nearest_obstacle.position.z - (m * nearest_obstacle.position.x) + b) / (Mathf.Sqrt(Mathf.Pow(m, 2) + Mathf.Pow(1, 2)));
return d;
}
float calculate_angle(float d,Transform nearest_obstacle)
{
float pw_distance=my_distance(player.position.x,nearest_obstacle.position.x,player.position.z,nearest_obstacle.position.z);
float mycalcInRadians = Mathf.Asin(d/pw_distance);
float mycalcInDegrees = mycalcInRadians * 180 / Mathf.PI;
return mycalcInDegrees;
}
float my_distance(float x1,float x2,float z1,float z2)
{
return Mathf.Sqrt (Mathf.Pow(x1-x2,2)+Mathf.Pow(z1-z2,2));
}
我现在需要的是给出位置位置的公式。
让我的问题更清楚,请参阅下图和说明。
有一条名为A的线。我在场景中有一个名为O的点。我想画一条从O到A的线,当它们相互交叉时,交点形成90度角。加上我想知道什么是交叉点。我想团结一致。我想要的是一个公式。
提前谢谢你。
答案 0 :(得分:3)
有两种方法可以解决这个问题:
我这里只讨论了trig方法,因为后一种方法在Stack Overflow的其他地方有详细记载,例如。 Get closest point to a line 的
您已经指出由机器人,障碍物和d r 形成的三角形是一个直角三角形。这是解决缺失信息的简单情况之一(除了可能是等边三角形) - 您可以使用SOH CAH TAO描述的三角法规则来完成此任务。
在这种情况下,我们将使用CAH(余弦比)来计算该三角形的相邻边的长度,因为我们可以得到斜边(机器人 - 障碍物)和角度(θ)。可用信息。一旦我们得到了边的长度,我们就可以沿着通往目标的路径行进该距离,以确定交叉点的位置。
以下是关于如何在代码中实现此功能的想法(我选择不使用您编写的任何方法,而是利用Unity提供的许多方法):
Vector3 GetClosestPointToObstacleOnPathToTarget(Transform robot, Transform obstacle, Transform target)
{
// Calculate vector from robot to target
Vector3 toTarget = target.position - robot.position;
// Calculate vector and distance from robot to obstacle (hypotenuse)
Vector3 toObstacle = obstacle.position - robot.position;
float robotObstacleDistance = toObstacle.magnitude;
// Calculate theta (angle)
float theta = Vector3.Angle(toTarget, toObstacle);
// Using CAH rule (cosine, adjacent, hypotenuse) to find the (adjacent) side length
float robotIntersectionDistance = Mathf.Cos(theta * Mathf.Deg2Rad) * robotObstacleDistance;
// Travelling the calculated distance in the direction of the target
Vector3 intersectionPoint = robot.position + toTarget.normalized * robotIntersectionDistance;
return intersectionPoint;
}
希望这有帮助!如果您有任何问题,请告诉我。