统一:从3个vector创建一个平面

https://docs.unity3d.com/ScriptReference/Plane-ctor.html

公共平面(Vector3 a,Vector3 b,Vector3 c); 说明:创建一个平面。

由此产生的飞机经过了三点。 当您向下看飞机的顶部表面时,点顺时针旋转。

由于没有Debug.DrawPlane,我不知道我的飞机是否按预期工作。 所有3个vector世界坐标? 或者他们互相连接? 有人可以详细说明这是如何工作的? 当你向下看飞机的顶部表面时,顺时针旋转的点也不能理解

太空中的任何三点描述了一个经过所有这些点的飞机 。 这些点不是“连接”的,除非它们都躺在你想描述的飞机上。

飞机与坐标处于同一空间,所以如果提供世界空间坐标,飞机将处于世界空间。

点的顺序(或缠绕),“点的顺时针旋转”的部分表示平面的正面和背面“侧面”是如何确定的。 一架飞机将三维空间分为两部分,确定飞机的哪一侧是“前”(或顶部)让我们可靠地谈论这两个空间。

这个顺时针位说的是…说你有这三个点,叫Plane(p0, p1, p2)

  p1 p0 p2 

请注意,如果将手指从p0p1跟踪到p2 ,则手指顺时针移动。 此外,你可以curl左手的手指顺时针方向。 当你这样做的时候,你可以把拇指伸出的方向代表了这个地方的法线,并指向飞机的前半部分。 如果你把手伸向显示器,你的拇指可能指向你的脸。 你的脸是“俯视”在这架飞机的“顶面”,因为你看到的点形成顺时针遍历。

请注意,如果您称为Plane(p2, p1, p0) – 相反的顺序 – 并且左手的手指curl以遵循那个 – 逆时针遍历,则您的拇指将指向屏幕。 然后,你的脸就会在飞机的“底面”上“仰视”。

关心飞机正面的最常见的原因是,这是通常碰撞的事情。 一般来说,我们忽略与飞机背面的碰撞,尽管如果你的游戏需要它,你当然可以计算它们。 然而,通常情况下,您需要select这样做,因为许多图书馆可能会认为您只是想与前端发生冲突。

由于没有Debug.DrawPlane

那么,让我们制作自己的工具来帮助我们将其视觉化。

 // Mimics Debug.DrawLine, drawing a plane containing the 3 provided worldspace points, // with the visualization centered on the centroid of the triangle they form. public static void DrawPlane(Vector3 a, Vector3 b, Vector3 c, float size, Color color, float duration = 0f, bool depthTest = true) { var plane = new Plane(a, b, c); var centroid = (a + b + c)/3f; DrawPlaneAtPoint(plane, centroid, size, color, duration, depthTest); } // Draws the portion of the plane closest to the provided point, // with an altitude line colour-coding whether the point is in front (cyan) // or behind (red) the provided plane. public static void DrawPlaneNearPoint(Plane plane, Vector3 point, float size, Color color, float duration = 0f, bool depthTest = true) { var closest = plane.ClosestPointOnPlane(point); Color side = plane.GetSide(point) ? Color.cyan : Color.red; Debug.DrawLine(point, closest, side, duration, depthTest); DrawPlaneAtPoint(plane, closest, size, color, duration, depthTest); } // Non-public method to do the heavy lifting of drawing the grid of a given plane segment. static void DrawPlaneAtPoint(Plane plane, Vector3 center, float size, Color color, float duration, bool depthTest) { var basis = Quaternion.LookRotation(plane.normal); var scale = Vector3.one * size / 10f; var right = Vector3.Scale(basis * Vector3.right, scale); var up = Vector3.Scale(basis * Vector3.up, scale); for(int i = -5; i <= 5; i++) { Debug.DrawLine(center + right * i - up * 5, center + right * i + up * 5, color, duration, depthTest); Debug.DrawLine(center + up * i - right * 5, center + up * i + right * 5, color, duration, depthTest); } } 

或者,如果你想以交互方式玩飞机,你可以把这个脚本放到一个空的场景中,并且用它的位置和检查器参数来玩弄它们如何影响飞机的几何形状。

 public class PlaneVisualizer : MonoBehaviour { public Vector3 a = Vector3.right; public Vector3 b = Vector3.up; public Vector3 c = Vector3.forward; void OnDrawGizmos() { var plane = new Plane(a, b, c); // Draw our three input points in world space. // b and c are drawn as lollipops from the preceding point, // so that you can see the clockwise winding direction. Gizmos.color = Color.white; Gizmos.DrawWireSphere(a, 0.1f); Gizmos.color = Color.gray; Gizmos.DrawLine(a, b); Gizmos.DrawWireSphere(b, 0.1f); Gizmos.color = Color.black; Gizmos.DrawLine(b, c); Gizmos.DrawWireSphere(c, 0.1f); // Draw this object's position, // as a lollipop sticking out from our plane, // blue-green if in front (in the positive half-space), // and red if behind (negative half-space). Gizmos.color = plane.GetSide(transform.position) ? Color.cyan : Color.red; Gizmos.DrawLine(plane.ClosestPointOnPlane(transform.position), transform.position); Gizmos.DrawWireSphere(transform.position, 0.2f); // Draw plane normal. Gizmos.color = Color.yellow; var center = (a + b + c) / 3f; Gizmos.DrawLine(center, center + plane.normal); // Draw planar grid. Gizmos.color = Color.blue; var matrix = Gizmos.matrix; Gizmos.matrix = Matrix4x4.TRS(center, Quaternion.LookRotation(plane.normal), Vector3.one); for(int i = -10; i <= 10; i++) { Gizmos.DrawLine(new Vector3(i, -10, 0), new Vector3(i, 10, 0)); Gizmos.DrawLine(new Vector3(-10, i, 0), new Vector3(10, i, 0)); } Gizmos.matrix = matrix; } }